+2009-11-28 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * reflection.c (ensure_generic_class_runtime_vtable): Split this function in 2
+ so we can avoid calling ensure_runtime_vtable multiple times for the GTD during
+ its TypeBuilder::CreateType ().
+
+ * reflection.c (ensure_generic_class_runtime_vtable): Avoid initializing interfaces
+ if not needed.
+
+ * reflection.c: Every time we change the interface array, set interfaces_packed to NULL
+ to make setup_interface_offsets happy.
+
+ * reflection.c (remove_instantiations_of_and_ensure_contents): Fix instances again as corlib
+ compilation now works.
+
2009-11-28 Zoltan Varga <vargaz@gmail.com>
* appdomain.c (create_exceptions): New helper function extracted from
}
static void
-ensure_generic_class_runtime_vtable (MonoClass *klass)
+fix_partial_generic_class (MonoClass *klass)
{
MonoClass *gklass = klass->generic_class->container_class;
MonoDynamicGenericClass *dgclass;
if (klass->wastypebuilder)
return;
- ensure_runtime_vtable (gklass);
-
dgclass = (MonoDynamicGenericClass *) klass->generic_class;
if (!dgclass->initialized)
}
}
- if (klass->interface_count != gklass->interface_count) {
+ if (klass->interface_count && klass->interface_count != gklass->interface_count) {
klass->interface_count = gklass->interface_count;
- klass->interfaces = mono_image_alloc (klass->image, sizeof (MonoClass*) * klass->interface_count);
- for (i = 0; i < klass->interface_count; ++i) {
+ klass->interfaces = mono_image_alloc (klass->image, sizeof (MonoClass*) * gklass->interface_count);
+ klass->interfaces_packed = NULL; /*make setup_interface_offsets happy*/
+
+ for (i = 0; i < gklass->interface_count; ++i) {
MonoType *iface_type = mono_class_inflate_generic_type (&gklass->interfaces [i]->byval_arg, mono_class_get_context (klass));
klass->interfaces [i] = mono_class_from_mono_type (iface_type);
mono_metadata_free_type (iface_type);
return;
}
+static void
+ensure_generic_class_runtime_vtable (MonoClass *klass)
+{
+ MonoClass *gklass = klass->generic_class->container_class;
+
+ ensure_runtime_vtable (gklass);
+
+ fix_partial_generic_class (klass);
+}
+
static void
ensure_runtime_vtable (MonoClass *klass)
{
for (i = 0; i < klass->method.count; ++i)
klass->methods [i]->slot = i;
+ klass->interfaces_packed = NULL; /*make setup_interface_offsets happy*/
mono_class_setup_interface_offsets (klass);
mono_class_setup_interface_id (klass);
}
MonoClass *klass = (MonoClass*)user_data;
if ((type->type == MONO_TYPE_GENERICINST) && (type->data.generic_class->container_class == klass)) {
- //ensure_runtime_vtable (mono_class_from_mono_type (type)); //Make sure the vtable is complete
+ fix_partial_generic_class (mono_class_from_mono_type (type)); //Ensure it's safe to use it.
return TRUE;
} else
return FALSE;