+2004-10-12 Martin Baulig <martin@ximian.com>
+
+ * metadata.c (mono_metadata_generic_param_equal): We always have
+ an owner.
+
+ * class.c
+ (mono_class_from_generic_parameter): We need to have an owner.
+ (my_mono_class_from_generic_parameter): Likewise.
+
+ * reflection.c (mono_reflection_setup_generic_class): Renamed to
+ mono_reflection_create_generic_class() and added a new
+ mono_reflection_setup_generic_class().
+ (mono_reflection_initialize_generic_param): If we're a nested
+ generic type and inherited from the containing class, set our
+ owner to the outer class.
+
2004-10-11 Zoltan Varga <vargaz@freemail.hu>
* icall.c (ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal): New icall.
if (p1->num != p2->num)
return FALSE;
+ g_assert (p1->owner && p2->owner);
+ if (p1->owner == p2->owner)
+ return TRUE;
+
/*
- * FIXME: Normally each MonoGenericParam should have a non-NULL owner.
+ * This should only happen for dynamic type parameters; we copy them from the
+ * MonoReflectionGenericParam into the newly created MonoGenericContainer, so their
+ * addresses may be different.
*/
- if (p1->owner && (p1->owner == p2->owner))
+ if (p1->owner->klass && (p1->owner->klass == p2->owner->klass))
+ return TRUE;
+ if (p1->owner->method && (p1->owner->method == p2->owner->method))
return TRUE;
-
- if (p1->owner && p2->owner) {
- /*
- * This should only happen for dynamic type parameters; we copy them from the
- * MonoReflectionGenericParam into the newly created MonoGenericContainer, so their
- * addresses may be different.
- */
- if (p1->owner->klass && (p1->owner->klass == p2->owner->klass))
- return TRUE;
- if (p1->owner->method && (p1->owner->method == p2->owner->method))
- return TRUE;
- }
/*
* If `signature_only' is true, we're comparing two (method) signatures.
* mono_reflection_setup_generic_class:
* @tb: a TypeBuilder object
*
- * Setup the generic class after all generic parameters have been added.
+ * Setup the generic class before adding the first generic parameter.
*/
void
mono_reflection_setup_generic_class (MonoReflectionTypeBuilder *tb)
MONO_ARCH_SAVE_REGS;
+ klass = my_mono_class_from_mono_type (tb->type.type);
+ if (tb->generic_container)
+ return;
+
+ tb->generic_container = g_new0 (MonoGenericContainer, 1);
+ tb->generic_container->klass = klass;
+}
+
+/*
+ * mono_reflection_create_generic_class:
+ * @tb: a TypeBuilder object
+ *
+ * Creates the generic class after all generic parameters have been added.
+ */
+void
+mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb)
+{
+ MonoClass *klass;
+ int count, i;
+
+ MONO_ARCH_SAVE_REGS;
+
klass = my_mono_class_from_mono_type (tb->type.type);
count = tb->generic_params ? mono_array_length (tb->generic_params) : 0;
if (klass->generic_container || (count == 0))
return;
- klass->generic_container = container = g_new0 (MonoGenericContainer, 1);
+ g_assert (tb->generic_container && (tb->generic_container->klass == klass));
+
+ klass->generic_container = tb->generic_container;
- container->klass = klass;
- container->type_argc = count;
- container->type_params = g_new0 (MonoGenericParam, count);
+ klass->generic_container->type_argc = count;
+ klass->generic_container->type_params = g_new0 (MonoGenericParam, count);
for (i = 0; i < count; i++) {
MonoReflectionGenericParam *gparam = mono_array_get (tb->generic_params, gpointer, i);
- container->type_params [i] = *gparam->type.type->data.generic_param;
- gparam->type.type->data.generic_param->owner = container;
- container->type_params [i].owner = container;
+ klass->generic_container->type_params [i] = *gparam->type.type->data.generic_param;
+ g_assert (klass->generic_container->type_params [i].owner);
}
}
gparam->mbuilder->generic_container = g_new0 (MonoGenericContainer, 1);
param->owner = gparam->mbuilder->generic_container;
} else if (gparam->tbuilder) {
- if (!gparam->tbuilder->generic_container) {
- MonoClass *klass = my_mono_class_from_mono_type (gparam->tbuilder->type.type);
- gparam->tbuilder->generic_container = g_new0 (MonoGenericContainer, 1);
- gparam->tbuilder->generic_container->klass = klass;
+ MonoReflectionTypeBuilder *nesting = gparam->tbuilder->nesting_type;
+ MonoGenericContainer *container = gparam->tbuilder->generic_container;
+
+ while (nesting) {
+ int count;
+
+ count = nesting->generic_params ? mono_array_length (nesting->generic_params) : 0;
+ if (gparam->index >= count)
+ break;
+
+ container = nesting->generic_container;
+ nesting = nesting->nesting_type;
}
- param->owner = gparam->tbuilder->generic_container;
+
+ g_assert (container);
+ param->owner = container;
}
param->method = NULL;