Ver Fonte

Encode all gtd as open instantiations by default.

	* ILGenerator.cs (TokenGenerator): GetToken now taken an extra
	argument create_open_instance if it should encode a gtd as
	a generic instance.

	* ILGenerator.cs (ILGenerator): Ask TokenGenerator to create
	an open instance under all cases but if the opcode is ldtoken.

	* ModuleBuilder.cs: Adjust to signature change.

	* DynamicMethod.cs: Ditto.

	* Environment.cs: Since an icall signature has changed, we
	must bump corlib version.

	* appdomain.c: Ditto.

	* icall.c: Pass the new value forward to
	mono_image_create_token.

	* reflection.c (mono_image_create_token): Handle create_methodspec
	for TypeBuilder and MonoType.

	Fixes #649017
Rodrigo Kumpera há 15 anos atrás
pai
commit
ca01c95ed7

+ 1 - 1
mcs/class/corlib/System.Reflection.Emit/DynamicMethod.cs

@@ -432,7 +432,7 @@ namespace System.Reflection.Emit {
 			throw new InvalidOperationException ();
 		}
 
-		public int GetToken (MemberInfo member) {
+		public int GetToken (MemberInfo member, bool create_open_instance) {
 			return m.AddRef (member);
 		}
 

+ 5 - 5
mcs/class/corlib/System.Reflection.Emit/ILGenerator.cs

@@ -177,7 +177,7 @@ namespace System.Reflection.Emit {
 	internal interface TokenGenerator {
 		int GetToken (string str);
 
-		int GetToken (MemberInfo member);
+		int GetToken (MemberInfo member, bool create_open_instance);
 
 		int GetToken (MethodInfo method, Type[] opt_param_types);
 
@@ -516,7 +516,7 @@ namespace System.Reflection.Emit {
 		[ComVisible (true)]
 		public virtual void Emit (OpCode opcode, ConstructorInfo con)
 		{
-			int token = token_gen.GetToken (con);
+			int token = token_gen.GetToken (con, true);
 			make_room (6);
 			ll_emit (opcode);
 			if (con.DeclaringType.Module == module)
@@ -549,7 +549,7 @@ namespace System.Reflection.Emit {
 		
 		public virtual void Emit (OpCode opcode, FieldInfo field)
 		{
-			int token = token_gen.GetToken (field);
+			int token = token_gen.GetToken (field, true);
 			make_room (6);
 			ll_emit (opcode);
 			if (field.DeclaringType.Module == module)
@@ -729,7 +729,7 @@ namespace System.Reflection.Emit {
 			if ((meth is DynamicMethod) && ((opcode == OpCodes.Ldftn) || (opcode == OpCodes.Ldvirtftn) || (opcode == OpCodes.Ldtoken)))
 				throw new ArgumentException ("Ldtoken, Ldftn and Ldvirtftn OpCodes cannot target DynamicMethods.");
 
-			int token = token_gen.GetToken (meth);
+			int token = token_gen.GetToken (meth, true);
 			make_room (6);
 			ll_emit (opcode);
 			Type declaringType = meth.DeclaringType;
@@ -811,7 +811,7 @@ namespace System.Reflection.Emit {
 
 			make_room (6);
 			ll_emit (opcode);
-			emit_int (token_gen.GetToken (cls));
+			emit_int (token_gen.GetToken (cls, opcode != OpCodes.Ldtoken));
 		}
 
 		[MonoLimitation ("vararg methods are not supported")]

+ 9 - 5
mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs

@@ -656,7 +656,7 @@ namespace System.Reflection.Emit {
 		private static extern int getUSIndex (ModuleBuilder mb, string str);
 
 		[MethodImplAttribute(MethodImplOptions.InternalCall)]
-		private static extern int getToken (ModuleBuilder mb, object obj);
+		private static extern int getToken (ModuleBuilder mb, object obj, bool create_open_instance);
 
 		[MethodImplAttribute(MethodImplOptions.InternalCall)]
 		private static extern int getMethodToken (ModuleBuilder mb, MethodInfo method,
@@ -674,7 +674,11 @@ namespace System.Reflection.Emit {
 		}
 
 		internal int GetToken (MemberInfo member) {
-			return getToken (this, member);
+			return getToken (this, member, true);
+		}
+
+		internal int GetToken (MemberInfo member, bool create_open_instance) {
+			return getToken (this, member, create_open_instance);
 		}
 
 		internal int GetToken (MethodInfo method, Type[] opt_param_types) {
@@ -682,7 +686,7 @@ namespace System.Reflection.Emit {
 		}
 
 		internal int GetToken (SignatureHelper helper) {
-			return getToken (this, helper);
+			return getToken (this, helper, true);
 		}
 
 		/*
@@ -931,8 +935,8 @@ namespace System.Reflection.Emit {
 			return mb.GetToken (str);
 		}
 
-		public int GetToken (MemberInfo member) {
-			return mb.GetToken (member);
+		public int GetToken (MemberInfo member, bool create_open_instance) {
+			return mb.GetToken (member, create_open_instance);
 		}
 
 		public int GetToken (MethodInfo method, Type[] opt_param_types) {

+ 1 - 1
mcs/class/corlib/System/Environment.cs

@@ -55,7 +55,7 @@ namespace System {
 		 * of icalls, do not require an increment.
 		 */
 #pragma warning disable 169
-		private const int mono_corlib_version = 93;
+		private const int mono_corlib_version = 94;
 #pragma warning restore 169
 
 		[ComVisible (true)]

+ 1 - 1
mono/metadata/appdomain.c

@@ -73,7 +73,7 @@
  * Changes which are already detected at runtime, like the addition
  * of icalls, do not require an increment.
  */
-#define MONO_CORLIB_VERSION 93
+#define MONO_CORLIB_VERSION 94
 
 typedef struct
 {

+ 2 - 2
mono/metadata/icall.c

@@ -1171,13 +1171,13 @@ mono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)
 }
 
 static gint32
-ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj)
+ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj, gboolean create_open_instance)
 {
 	MONO_ARCH_SAVE_REGS;
 	
 	MONO_CHECK_ARG_NULL (obj);
 	
-	return mono_image_create_token (mb->dynamic_image, obj, TRUE, TRUE);
+	return mono_image_create_token (mb->dynamic_image, obj, create_open_instance, TRUE);
 }
 
 static gint32

+ 10 - 2
mono/metadata/reflection.c

@@ -4924,7 +4924,15 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
 		}
 	} else if (strcmp (klass->name, "TypeBuilder") == 0) {
 		MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *)obj;
-		token = tb->table_idx | MONO_TOKEN_TYPE_DEF;
+		if (create_methodspec && tb->generic_params) {
+			MonoType *type;
+			init_type_builder_generics (obj);
+			type = mono_reflection_type_get_handle ((MonoReflectionType *)obj);
+			token = mono_image_typedef_or_ref_full (assembly, type, TRUE);
+			token = mono_metadata_token_from_dor (token);
+		} else {
+			token = tb->table_idx | MONO_TOKEN_TYPE_DEF;
+		}
 	} else if (strcmp (klass->name, "MonoType") == 0) {
 		MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj);
 		MonoClass *mc = mono_class_from_mono_type (type);
@@ -4932,7 +4940,7 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
 			mono_raise_exception (mono_class_get_exception_for_failure (mc));
 
 		token = mono_metadata_token_from_dor (
-			mono_image_typedef_or_ref_full (assembly, type, mc->generic_container == NULL));
+			mono_image_typedef_or_ref_full (assembly, type, mc->generic_container == NULL || create_methodspec));
 	} else if (strcmp (klass->name, "GenericTypeParameterBuilder") == 0) {
 		MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj);
 		token = mono_metadata_token_from_dor (