Преглед изворни кода

2004-02-08 Martin Baulig <[email protected]>

	* class.h (MonoClass): Changed type of `generic_inst' from
	`MonoType *' to `MonoGenericInst *'.

svn path=/trunk/mono/; revision=22883
Martin Baulig пре 22 година
родитељ
комит
f651ff9855

+ 5 - 0
mono/metadata/ChangeLog

@@ -1,3 +1,8 @@
+2004-02-08  Martin Baulig  <[email protected]>
+
+	* class.h (MonoClass): Changed type of `generic_inst' from
+	`MonoType *' to `MonoGenericInst *'.
+
 2004-02-08  Martin Baulig  <[email protected]>
 
 	* icall.c (ves_icall_Type_BindGenericParameters): Just call

+ 2 - 2
mono/metadata/class.c

@@ -392,7 +392,7 @@ class_compute_field_layout (MonoClass *class)
 		if (mono_field_is_deleted (field))
 			continue;
 		if (class->generic_inst) {
-			field->type = mono_class_inflate_generic_type (field->type, class->generic_inst->data.generic_inst);
+			field->type = mono_class_inflate_generic_type (field->type, class->generic_inst);
 			field->type->attrs = cols [MONO_FIELD_FLAGS];
 		}
 
@@ -1727,7 +1727,7 @@ mono_class_from_generic (MonoType *gtype, gboolean inflate_methods)
 	class->image = image;
 	class->flags = gklass->flags;
 
-	class->generic_inst = gtype;
+	class->generic_inst = ginst;
 
 	class->cast_class = class->element_class = class;
 

+ 1 - 1
mono/metadata/class.h

@@ -178,7 +178,7 @@ struct _MonoClass {
 	MonoType this_arg;
 	MonoType byval_arg;
 
-	MonoType *generic_inst;
+	MonoGenericInst *generic_inst;
 	MonoGenericParam *gen_params;
 	guint16 num_gen_params;
 

+ 2 - 2
mono/metadata/icall.c

@@ -1614,7 +1614,7 @@ ves_icall_Type_GetGenericArguments (MonoReflectionType *type)
 			mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), &pklass->byval_arg));
 		}
 	} else if (klass->generic_inst) {
-		MonoGenericInst *inst = klass->generic_inst->data.generic_inst;
+		MonoGenericInst *inst = klass->generic_inst;
 		res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, inst->type_argc);
 		for (i = 0; i < inst->type_argc; ++i) {
 			mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), inst->type_argv [i]));
@@ -1651,7 +1651,7 @@ ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)
 		return type; /* check this one */
 	}
 	if (klass->generic_inst) {
-		MonoType *generic_type = klass->generic_inst->data.generic_inst->generic_type;
+		MonoType *generic_type = klass->generic_inst->generic_type;
 		MonoClass *generic_class = mono_class_from_mono_type (generic_type);
 
 		if (generic_class->wastypebuilder && generic_class->reflection_info)

+ 2 - 2
mono/metadata/loader.c

@@ -297,7 +297,7 @@ find_method (MonoClass *klass, const char* name, MonoMethodSignature *sig)
 		klass = klass->parent;
 	}
 	if (sclass->generic_inst) {
-		MonoClass *gclass = mono_class_from_mono_type (sclass->generic_inst->data.generic_inst->generic_type);
+		MonoClass *gclass = mono_class_from_mono_type (sclass->generic_inst->generic_type);
 		MonoMethod *res = find_method (gclass, name, sig);
 		if (!res)
 			return NULL;
@@ -412,7 +412,7 @@ method_from_memberref (MonoImage *image, guint32 idx)
 			if (!method)
 				g_warning ("Missing method %s in assembly %s typeref index %d", mname, image->name, nindex);
 			else if (klass->generic_inst)
-				method = mono_class_inflate_generic_method (method, klass->generic_inst->data.generic_inst);
+				method = mono_class_inflate_generic_method (method, klass->generic_inst);
 			mono_metadata_free_method_signature (sig);
 			return method;
 		}

+ 25 - 12
mono/metadata/reflection.c

@@ -137,6 +137,7 @@ static guint32 encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMa
 static char*   type_get_qualified_name (MonoType *type, MonoAssembly *ass);
 static void    ensure_runtime_vtable (MonoClass *klass);
 static gpointer resolve_object (MonoImage *image, MonoObject *obj);
+static void    encode_type (MonoDynamicImage *assembly, MonoType *type, char *p, char **endbuf);
 
 static void
 alloc_table (MonoDynamicTable *table, guint nrows)
@@ -395,6 +396,23 @@ my_mono_class_from_mono_type (MonoType *type) {
 	}
 }
 
+static void
+encode_generic_inst (MonoDynamicImage *assembly, MonoGenericInst *ginst, char *p, char **endbuf)
+{
+	int i;
+
+	if (!ginst) {
+		g_assert_not_reached ();
+		return;
+	}
+
+	mono_metadata_encode_value (MONO_TYPE_GENERICINST, p, &p);
+	encode_type (assembly, ginst->generic_type, p, &p);
+	mono_metadata_encode_value (ginst->type_argc, p, &p);
+	for (i = 0; i < ginst->type_argc; ++i)
+		encode_type (assembly, ginst->type_argv [i], p, &p);
+}
+
 static void
 encode_type (MonoDynamicImage *assembly, MonoType *type, char *p, char **endbuf)
 {
@@ -456,16 +474,9 @@ encode_type (MonoDynamicImage *assembly, MonoType *type, char *p, char **endbuf)
 		mono_metadata_encode_value (0, p, &p); /* FIXME: set to 0 for now */
 		mono_metadata_encode_value (0, p, &p);
 		break;
-	case MONO_TYPE_GENERICINST: {
-		int i;
-		mono_metadata_encode_value (type->type, p, &p);
-		encode_type (assembly, type->data.generic_inst->generic_type, p, &p);
-		mono_metadata_encode_value (type->data.generic_inst->type_argc, p, &p);
-		for (i = 0; i < type->data.generic_inst->type_argc; ++i) {
-			encode_type (assembly, type->data.generic_inst->type_argv [i], p, &p);
-		}
+	case MONO_TYPE_GENERICINST:
+		encode_generic_inst (assembly, type->data.generic_inst, p, &p);
 		break;
-	}
 	case MONO_TYPE_VAR:
 	case MONO_TYPE_MVAR:
 		mono_metadata_encode_value (type->type, p, &p);
@@ -1915,7 +1926,7 @@ create_typespec (MonoDynamicImage *assembly, MonoType *type)
 		MonoClass *k = mono_class_from_mono_type (type);
 		if (!k || !k->generic_inst)
 			return 0;
-		encode_type (assembly, k->generic_inst, p, &p);
+		encode_generic_inst (assembly, k->generic_inst, p, &p);
 		break;
 	}
 	default:
@@ -6878,6 +6889,8 @@ mono_reflection_bind_generic_parameters (MonoType *type, MonoArray *types)
 			else
 				itype = &klass->interfaces [i]->byval_arg;
 			ginst->ifaces [i] = mono_reflection_bind_generic_parameters (itype, types);
+			if (!ginst->ifaces [i])
+				ginst->ifaces [i] = itype;
 		}
 	}
 
@@ -6898,7 +6911,7 @@ mono_reflection_bind_generic_parameters (MonoType *type, MonoArray *types)
 
 		ginst->generic_type = &klass->byval_arg;
 	} else {
-		MonoGenericInst *kginst = klass->generic_inst->data.generic_inst;
+		MonoGenericInst *kginst = klass->generic_inst;
 
 		ginst->type_argc = kginst->type_argc;
 		ginst->type_argv = g_new0 (MonoType *, ginst->type_argc);
@@ -6968,7 +6981,7 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M
 	}
 
 	if (method->klass->generic_inst) {
-		MonoGenericInst *kginst = method->klass->generic_inst->data.generic_inst;
+		MonoGenericInst *kginst = method->klass->generic_inst;
 
 		ginst->type_argc = kginst->type_argc;
 		ginst->type_argv = kginst->type_argv;

+ 2 - 2
mono/mini/mini.c

@@ -2478,7 +2478,7 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig,
 #define CHECK_LOCAL(num) if ((unsigned)(num) >= (unsigned)header->num_locals) goto unverified
 #define CHECK_OPSIZE(size) if (ip + size > end) goto unverified
 
-#define TYPE_PARAM_TO_TYPE(num) (method->klass->generic_inst->data.generic_inst->type_argv [(num)])
+#define TYPE_PARAM_TO_TYPE(num) (method->klass->generic_inst->type_argv [(num)])
 #define TYPE_PARAM_TO_CLASS(num) (mono_class_from_mono_type (TYPE_PARAM_TO_TYPE ((num))))
 
 #define MTYPE_PARAM_TO_TYPE(num) (((MonoMethodNormal *) method)->header->geninst->mtype_argv [(num)])
@@ -2583,7 +2583,7 @@ inflate_generic_field (MonoClassField *field, MonoClass *klass, MonoClass **retc
 
 	res = g_new0 (MonoClassField, 1);
 	*res = *field;
-	ginst = klass->generic_inst->data.generic_inst;
+	ginst = klass->generic_inst;
 	res->type = mono_class_inflate_generic_type (field->type, ginst);
 	return res;
 }