2007-01-11 Raja R Harinath <rharinath@novell.com>
+ * class-internals.h (_MonoGenericClass.is_inflated): Remove.
+ (_MonoGenericClass.cached_class): Move here and rename from lone
+ remaining field of ...
+ (_MonoInflatedGenericClass): ... this. Remove.
+ * metadata.h, class.c, reflection.c, metadata.c, icall.c: Update
+ to changes.
+
Fix mcs/tests/test-128.cs regression.
* reflection.c (encode_cattr_value) [MONO_TYPE_SZARRAY]: Revert
2007-01-10 change below.
MonoClass *container_class; /* the generic type definition */
MonoGenericContext *cached_context; /* if present, a "trivial" context that doesn't contain any method instantiation */
guint is_dynamic : 1; /* We're a MonoDynamicGenericClass */
- guint is_inflated : 1; /* We're a MonoInflatedGenericClass */
-};
-
-/*
- * Performance optimization:
- * We don't create the `MonoClass' for a `MonoGenericClass' until we really
- * need it.
- */
-struct _MonoInflatedGenericClass {
- MonoGenericClass generic_class;
- MonoClass *klass;
+ MonoClass *cached_class; /* if present, the MonoClass corresponding to the instantiation. */
};
/*
* a TypeBuilder.
*/
struct _MonoDynamicGenericClass {
- MonoInflatedGenericClass generic_class;
+ MonoGenericClass generic_class;
int count_methods;
MonoMethod **methods;
int count_ctors;
static MonoGenericClass *
inflate_generic_class (MonoGenericClass *ogclass, MonoGenericContext *context)
{
- MonoInflatedGenericClass *igclass;
MonoGenericClass *ngclass, *cached;
MonoGenericInst *ninst;
if (ogclass->is_dynamic) {
MonoDynamicGenericClass *dgclass = g_new0 (MonoDynamicGenericClass, 1);
- igclass = &dgclass->generic_class;
- ngclass = &igclass->generic_class;
- ngclass->is_inflated = 1;
+ ngclass = &dgclass->generic_class;
ngclass->is_dynamic = 1;
} else {
- igclass = g_new0 (MonoInflatedGenericClass, 1);
- ngclass = &igclass->generic_class;
- ngclass->is_inflated = 1;
+ ngclass = g_new0 (MonoGenericClass, 1);
}
ngclass->container_class = ogclass->container_class;
ngclass->inst = ninst;
- igclass->klass = NULL;
-
mono_loader_lock ();
cached = mono_metadata_lookup_generic_class (ngclass);
mono_loader_unlock ();
MonoGenericClass *
mono_get_shared_generic_class (MonoGenericContainer *container, gboolean is_dynamic)
{
- MonoInflatedGenericClass *igclass;
MonoGenericClass *gclass;
if (is_dynamic) {
MonoDynamicGenericClass *dgclass = g_new0 (MonoDynamicGenericClass, 1);
- igclass = &dgclass->generic_class;
- gclass = &igclass->generic_class;
- gclass->is_inflated = 1;
+ gclass = &dgclass->generic_class;
gclass->is_dynamic = 1;
} else {
- igclass = g_new0 (MonoInflatedGenericClass, 1);
- gclass = &igclass->generic_class;
- gclass->is_inflated = 1;
+ gclass = g_new0 (MonoGenericClass, 1);
}
gclass->cached_context = &container->context;
}
}
- igclass->klass = container->klass;
+ gclass->cached_class = container->klass;
return gclass;
}
static MonoClass*
mono_generic_class_get_class (MonoGenericClass *gclass)
{
- MonoInflatedGenericClass *igclass;
MonoClass *klass, *gklass;
int i;
- g_assert (gclass->is_inflated);
- igclass = (MonoInflatedGenericClass *) gclass;
-
mono_loader_lock ();
- if (igclass->klass) {
+ if (gclass->cached_class) {
mono_loader_unlock ();
- return igclass->klass;
+ return gclass->cached_class;
}
- igclass->klass = g_malloc0 (sizeof (MonoClass));
- klass = igclass->klass;
+ gclass->cached_class = g_malloc0 (sizeof (MonoClass));
+ klass = gclass->cached_class;
gklass = gclass->container_class;
ves_icall_MonoGenericClass_GetInterfaces (MonoReflectionGenericClass *type)
{
static MonoClass *System_Reflection_MonoGenericClass;
- MonoDynamicGenericClass *gclass;
+ MonoGenericClass *gclass;
MonoReflectionTypeBuilder *tb = NULL;
MonoClass *klass = NULL;
MonoDomain *domain;
domain = mono_object_domain (type);
- g_assert (type->type.type->data.generic_class->is_dynamic);
- gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class;
+ gclass = type->type.type->data.generic_class;
+ g_assert (gclass->is_dynamic);
if (!strcmp (type->generic_type->object.vtable->klass->name, "TypeBuilder")) {
tb = (MonoReflectionTypeBuilder *) type->generic_type;
icount = tb->interfaces ? mono_array_length (tb->interfaces) : 0;
} else {
- klass = gclass->generic_class.generic_class.container_class;
+ klass = gclass->container_class;
mono_class_init (klass);
icount = klass->interface_count;
}
} else
it = &klass->interfaces [i]->byval_arg;
- it = mono_class_inflate_generic_type (
- it, mono_generic_class_get_context ((MonoGenericClass *) gclass));
+ it = mono_class_inflate_generic_type (it, mono_generic_class_get_context (gclass));
iface = mono_type_get_object (domain, it);
mono_array_setref (res, i, iface);
do_mono_metadata_parse_generic_class (MonoType *type, MonoImage *m, MonoGenericContainer *container,
const char *ptr, const char **rptr)
{
- MonoInflatedGenericClass *igclass;
MonoGenericClass *gclass, *cached;
MonoClass *gklass;
MonoType *gtype;
int count;
- igclass = g_new0 (MonoInflatedGenericClass, 1);
- gclass = &igclass->generic_class;
- gclass->is_inflated = TRUE;
+ gclass = g_new0 (MonoGenericClass, 1);
type->data.generic_class = gclass;
cached = g_hash_table_lookup (generic_class_cache, gclass);
if (cached) {
- g_free (igclass->klass);
g_free (gclass);
type->data.generic_class = cached;
typedef struct _MonoType MonoType;
typedef struct _MonoGenericInst MonoGenericInst;
typedef struct _MonoGenericClass MonoGenericClass;
-typedef struct _MonoInflatedGenericClass MonoInflatedGenericClass;
typedef struct _MonoDynamicGenericClass MonoDynamicGenericClass;
typedef struct _MonoGenericMethod MonoGenericMethod;
typedef struct _MonoGenericContext MonoGenericContext;
if (is_dynamic) {
MonoDynamicGenericClass *dgclass = g_new0 (MonoDynamicGenericClass, 1);
- MonoInflatedGenericClass *igclass = &dgclass->generic_class;
- gclass = &igclass->generic_class;
+ gclass = &dgclass->generic_class;
gclass->is_dynamic = TRUE;
- gclass->is_inflated = TRUE;
} else {
- MonoInflatedGenericClass *igclass = g_new0 (MonoInflatedGenericClass, 1);
- gclass = &igclass->generic_class;
- gclass->is_inflated = TRUE;
+ gclass = g_new0 (MonoGenericClass, 1);
}
gclass->inst = g_new0 (MonoGenericInst, 1);
{
MonoClass *klass;
MonoGenericClass *gclass, *cached;
- MonoInflatedGenericClass *igclass;
MonoType *geninst;
int i;
mono_loader_lock ();
- igclass = g_new0 (MonoInflatedGenericClass, 1);
- gclass = &igclass->generic_class;
- gclass->is_inflated = TRUE;
+ gclass = g_new0 (MonoGenericClass, 1);
gclass->inst = g_new0 (MonoGenericInst, 1);
gclass->inst->type_argc = type_argc;
MonoGenericClass *kgclass = klass->generic_class;
MonoGenericClass *ogclass = gclass;
- igclass = g_new0 (MonoInflatedGenericClass, 1);
- gclass = &igclass->generic_class;
- gclass->is_inflated = TRUE;
+ gclass = g_new0 (MonoGenericClass, 1);
gclass->inst = g_new0 (MonoGenericInst, 1);
gclass->inst->type_argc = kgclass->inst->type_argc;