Imported Upstream version 5.8.0.22

Former-commit-id: df344e34b07851d296efb3e6604c8db42b6f7aa3
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2017-10-19 20:04:20 +00:00
parent 5f4a27cc8a
commit 7d05485754
5020 changed files with 114082 additions and 186061 deletions

View File

@ -159,21 +159,28 @@ namespace System.Reflection.Emit {
if (data == null)
throw new ArgumentNullException ("data");
FieldBuilder fb = DefineUninitializedData (name, data.Length,
attributes | FieldAttributes.HasFieldRVA);
var maskedAttributes = attributes & ~FieldAttributes.ReservedMask;
FieldBuilder fb = DefineDataImpl (name, data.Length, maskedAttributes | FieldAttributes.HasFieldRVA);
fb.SetRVAData (data);
return fb;
}
public FieldBuilder DefineUninitializedData (string name, int size, FieldAttributes attributes)
{
return DefineDataImpl (name, size, attributes & ~FieldAttributes.ReservedMask);
}
private FieldBuilder DefineDataImpl (string name, int size, FieldAttributes attributes)
{
if (name == null)
throw new ArgumentNullException ("name");
if (name == String.Empty)
throw new ArgumentException ("name cannot be empty", "name");
if (global_type_created != null)
throw new InvalidOperationException ("global fields already created");
if ((size <= 0) || (size > 0x3f0000))
throw new ArgumentException ("size", "Data size must be > 0 and < 0x3f0000");
if ((size <= 0) || (size >= 0x3f0000))
throw new ArgumentException ("Data size must be > 0 and < 0x3f0000", null as string);
CreateGlobalType ();
@ -709,8 +716,7 @@ namespace System.Reflection.Emit {
static int typespec_tokengen = 0x1bffffff;
static int memberref_tokengen = 0x0affffff;
static int methoddef_tokengen = 0x06ffffff;
Dictionary<MemberInfo, int> inst_tokens = new Dictionary<MemberInfo, int> ();
Dictionary<MemberInfo, int> inst_tokens_open = new Dictionary<MemberInfo, int> ();
Dictionary<MemberInfo, int> inst_tokens, inst_tokens_open;
//
// Assign a pseudo token to the various TypeBuilderInst objects, so the runtime
@ -720,16 +726,20 @@ namespace System.Reflection.Emit {
// still encounter these objects, it will resolve them by calling their
// RuntimeResolve () methods.
//
int GetPseudoToken (MemberInfo member, bool create_open_instance) {
int GetPseudoToken (MemberInfo member, bool create_open_instance)
{
int token;
if (create_open_instance) {
if (inst_tokens_open.TryGetValue (member, out token))
return token;
} else {
if (inst_tokens.TryGetValue (member, out token))
return token;
var dict = create_open_instance ? inst_tokens_open : inst_tokens;
if (dict == null) {
dict = new Dictionary<MemberInfo, int> (ReferenceEqualityComparer<MemberInfo>.Instance);
if (create_open_instance)
inst_tokens_open = dict;
else
inst_tokens = dict;
} else if (dict.TryGetValue (member, out token)) {
return token;
}
// Count backwards to avoid collisions with the tokens
// allocated by the runtime
if (member is TypeBuilderInstantiation || member is SymbolType)
@ -751,10 +761,7 @@ namespace System.Reflection.Emit {
token = typeref_tokengen --;
} else if (member is EnumBuilder) {
token = GetPseudoToken ((member as EnumBuilder).GetTypeBuilder(), create_open_instance);
if (create_open_instance)
inst_tokens_open[member] = token;
else
inst_tokens[member] = token;
dict[member] = token;
// n.b. don't register with the runtime, the TypeBuilder already did it.
return token;
} else if (member is ConstructorBuilder) {
@ -772,10 +779,8 @@ namespace System.Reflection.Emit {
token = typespec_tokengen --;
} else
throw new NotImplementedException ();
if (create_open_instance)
inst_tokens_open [member] = token;
else
inst_tokens [member] = token;
dict [member] = token;
RegisterToken (member, token);
return token;
}
@ -904,11 +909,14 @@ namespace System.Reflection.Emit {
//
// Fixup the pseudo tokens assigned to the various SRE objects
//
void FixupTokens () {
void FixupTokens ()
{
var token_map = new Dictionary<int, int> ();
var member_map = new Dictionary<int, MemberInfo> ();
FixupTokens (token_map, member_map, inst_tokens, false);
FixupTokens (token_map, member_map, inst_tokens_open, true);
if (inst_tokens != null)
FixupTokens (token_map, member_map, inst_tokens, false);
if (inst_tokens_open != null)
FixupTokens (token_map, member_map, inst_tokens_open, true);
// Replace the tokens in the IL stream
if (types != null) {