[SRE] Delay the creation of the MonoClass for dynamic types until CreateType () is...
authorZoltan Varga <vargaz@gmail.com>
Mon, 3 Oct 2016 21:04:34 +0000 (17:04 -0400)
committerGitHub <noreply@github.com>
Mon, 3 Oct 2016 21:04:34 +0000 (17:04 -0400)
mcs/class/corlib/System.Reflection.Emit/DerivedTypes.cs
mcs/class/corlib/System.Reflection.Emit/GenericTypeParameterBuilder.cs
mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs
mono/metadata/icall-def.h
mono/metadata/object-internals.h
mono/metadata/reflection.c
mono/metadata/sre-encode.c
mono/metadata/sre-internals.h
mono/metadata/sre-save.c
mono/metadata/sre.c

index 771942f7bebbd8a3b604a7fb3c5390e68adbcc66..0e426991c6ec3392ece4fe91fb7342a7baa5fa61 100644 (file)
@@ -151,9 +151,17 @@ namespace System.Reflection.Emit
 
                internal override Type InternalResolve ()
                {
-                       Type et = m_baseType.InternalResolve (); 
+                       Type et = m_baseType.InternalResolve ();
                        if (rank == 0)
-                               return et.MakeArrayType ();                     
+                               return et.MakeArrayType ();
+                       return et.MakeArrayType (rank);
+               }
+
+               internal override Type RuntimeResolve ()
+               {
+                       Type et = m_baseType.RuntimeResolve ();
+                       if (rank == 0)
+                               return et.MakeArrayType ();
                        return et.MakeArrayType (rank);
                }
 
index 4dbda5d0aca4679bb389e6ad66cbcc298e222398..30b6aac80e572f9402afd9b4403a9cf03e23c95b 100644 (file)
@@ -82,8 +82,6 @@ namespace System.Reflection.Emit
                        this.mbuilder = mbuilder;
                        this.name = name;
                        this.index = index;
-
-                       initialize ();
                }
 
                internal override Type InternalResolve ()
@@ -100,9 +98,6 @@ namespace System.Reflection.Emit
                        return tbuilder.RuntimeResolve ().GetGenericArguments () [index];
                }
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private extern void initialize ();
-
                [ComVisible (true)]
                public override bool IsSubclassOf (Type c)
                {
index 56625f1ecc6f2f0a23f24f38a03d91ec77527fc2..e97a1b4c944d0ddd652315adcfec7dc7b8d96656 100644 (file)
@@ -92,12 +92,6 @@ namespace System.Reflection.Emit
                {
                        return attrs;
                }
-               
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private extern void setup_internal_class ();
-               
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private extern void create_generic_class ();
 
                internal TypeBuilder (ModuleBuilder mb, TypeAttributes attr, int table_idx)
                {
@@ -109,7 +103,6 @@ namespace System.Reflection.Emit
                        this.nspace = String.Empty;
                        this.fullname = TypeIdentifiers.WithoutEscape(this.tname);
                        pmodule = mb;
-                       setup_internal_class ();
                }
 
                internal TypeBuilder (ModuleBuilder mb, string name, TypeAttributes attr, Type parent, Type[] interfaces, PackingSize packing_size, int type_size, Type nesting_type)
@@ -145,7 +138,6 @@ namespace System.Reflection.Emit
 
                        // skip .<Module> ?
                        table_idx = mb.get_next_table_index (this, 0x02, true);
-                       setup_internal_class ();
                        fullname = GetFullName ();
                }
 
@@ -762,8 +754,6 @@ namespace System.Reflection.Emit
                                SetParent (pmodule.assemblyb.corlib_object_type);
                        }
 
-                       create_generic_class ();
-
                        // Fire TypeResolve events for fields whose type is an unfinished
                        // value type.
                        if (fields != null) {
@@ -1604,9 +1594,6 @@ namespace System.Reflection.Emit
                                this.parent = parent;
                        }
                        this.parent = ResolveUserType (this.parent);
-
-                       // will just set the parent-related bits if called a second time
-                       setup_internal_class ();
                }
 
                internal int get_next_table_index (object obj, int table, bool inc) {
index 0ec53a6f56f52fe5e0f3a45e95904fbaac937f24..7683be244b008dce75cb90cb38faaa7d56d32ba7 100644 (file)
@@ -784,9 +784,6 @@ ICALL(DYNM_1, "create_dynamic_method", ves_icall_DynamicMethod_create_dynamic_me
 ICALL_TYPE(ENUMB, "System.Reflection.Emit.EnumBuilder", ENUMB_1)
 ICALL(ENUMB_1, "setup_enum_type", ves_icall_EnumBuilder_setup_enum_type)
 
-ICALL_TYPE(GPARB, "System.Reflection.Emit.GenericTypeParameterBuilder", GPARB_1)
-ICALL(GPARB_1, "initialize", ves_icall_GenericTypeParameterBuilder_initialize)
-
 ICALL_TYPE(METHODB, "System.Reflection.Emit.MethodBuilder", METHODB_1)
 ICALL(METHODB_1, "MakeGenericMethod", ves_icall_MethodBuilder_MakeGenericMethod)
 
@@ -806,9 +803,7 @@ ICALL(SIGH_1, "get_signature_field", ves_icall_SignatureHelper_get_signature_fie
 ICALL(SIGH_2, "get_signature_local", ves_icall_SignatureHelper_get_signature_local)
 
 ICALL_TYPE(TYPEB, "System.Reflection.Emit.TypeBuilder", TYPEB_1)
-ICALL(TYPEB_1, "create_generic_class", ves_icall_TypeBuilder_create_generic_class)
-ICALL(TYPEB_3, "create_runtime_class", ves_icall_TypeBuilder_create_runtime_class)
-ICALL(TYPEB_7, "setup_internal_class", ves_icall_TypeBuilder_setup_internal_class)
+ICALL(TYPEB_1, "create_runtime_class", ves_icall_TypeBuilder_create_runtime_class)
 
 ICALL_TYPE(EVENTI, "System.Reflection.EventInfo", EVENTI_1)
 ICALL(EVENTI_1, "internal_from_handle_type", ves_icall_System_Reflection_EventInfo_internal_from_handle_type)
index 83257bda8060757f56f6e538464f3699d9042b8e..a77c581fb3f3dee26e5eb00686d547a3ea2551ce 100644 (file)
@@ -1180,6 +1180,11 @@ typedef struct {
        guint32 attrs;
 } MonoReflectionGenericParam;
 
+typedef struct {
+       MonoReflectionType type;
+       MonoReflectionTypeBuilder *tb;
+} MonoReflectionEnumBuilder;
+
 typedef struct _MonoReflectionGenericClass MonoReflectionGenericClass;
 struct _MonoReflectionGenericClass {
        MonoReflectionType type;
index 45d1cd830a8441345b0cfeea3eebeb1edfe62c1d..67a6ec956f325731f6f80a5e3de913109fff7ce4 100644 (file)
@@ -497,7 +497,7 @@ mono_type_get_object_checked (MonoDomain *domain, MonoType *type, MonoError *err
                if (klass->byval_arg.type == MONO_TYPE_MVAR || klass->byval_arg.type == MONO_TYPE_VAR) {
                        MonoGenericParam *gparam = klass->byval_arg.data.generic_param;
 
-                       if (gparam->owner && gparam->owner->is_method) {
+                       if (gparam->owner && gparam->owner->is_method && !gparam->owner->is_anonymous) {
                                MonoMethod *method = gparam->owner->owner.method;
                                if (method && mono_class_get_generic_type_definition (method->klass)->wastypebuilder)
                                        is_type_done = FALSE;
@@ -2205,6 +2205,7 @@ mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc
                }
        }
 
+#if 0
        /* FIXME: fix the CreateGenericParameters protocol to avoid the two stage setup of TypeBuilders */
        if (tb && tb->generic_container) {
                if (!mono_reflection_create_generic_class (tb, error)) {
@@ -2212,6 +2213,7 @@ mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc
                        return NULL;
                }
        }
+#endif
 
        MonoType *t = mono_reflection_type_get_handle (type, error);
        if (!is_ok (error)) {
index ef91c85b0ace8172ccd7a7aa23727f40a6fe643d..93ccd119bbab5c0a6498fd021b5944d2701e647d 100644 (file)
@@ -591,7 +591,6 @@ handle_enum:
        return idx;
 }
 
-
 guint32
 mono_dynimage_encode_field_signature (MonoDynamicImage *assembly, MonoReflectionFieldBuilder *fb, MonoError *error)
 {
@@ -605,9 +604,6 @@ mono_dynimage_encode_field_signature (MonoDynamicImage *assembly, MonoReflection
        MonoType *type;
        MonoClass *klass;
 
-       mono_reflection_init_type_builder_generics (fb->type, error);
-       return_val_if_nok (error, 0);
-
        type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, error);
        return_val_if_nok (error, 0);
        klass = mono_class_from_mono_type (type);
index e1564e5350d8f4579e6226d2166bb88dde415d9b..9ab949b7ebe817231c6a4f1a6b140443d298adc4 100644 (file)
@@ -95,9 +95,6 @@ mono_reflection_methodbuilder_from_method_builder (ReflectionMethodBuilder *rmb,
 gboolean
 mono_reflection_methodbuilder_from_ctor_builder (ReflectionMethodBuilder *rmb, MonoReflectionCtorBuilder *mb,
                                                 MonoError *error);
-
-void
-mono_reflection_init_type_builder_generics (MonoObject *type, MonoError *error);
                                                            
 guint32
 mono_reflection_resolution_scope_from_image (MonoDynamicImage *assembly, MonoImage *image);
index 38cd13f0cc79b7110520bfd4070065cdd6fefe72..3256f8cb1990d4e3b18a5d2e8e92d668ada6fa08 100644 (file)
@@ -705,7 +705,6 @@ mono_image_get_field_info (MonoReflectionFieldBuilder *fb, MonoDynamicImage *ass
        values [MONO_FIELD_SIGNATURE] = mono_dynimage_encode_field_signature (assembly, fb, error);
        return_if_nok (error);
 
-
        if (fb->offset != -1) {
                table = &assembly->tables [MONO_TABLE_FIELDLAYOUT];
                table->rows ++;
index e9c77580461d9c7169c343e16eb21eadcad7f572..4492571990efaa9abad45c83962a1c353b246e8c 100644 (file)
@@ -51,6 +51,7 @@ static guint32 mono_image_get_sighelper_token (MonoDynamicImage *assembly, MonoR
 static gboolean ensure_runtime_vtable (MonoClass *klass, MonoError  *error);
 static guint32 mono_image_get_methodref_token_for_methodbuilder (MonoDynamicImage *assembly, MonoReflectionMethodBuilder *method, MonoError *error);
 static void reflection_methodbuilder_from_dynamic_method (ReflectionMethodBuilder *rmb, MonoReflectionDynamicMethod *mb);
+static gboolean reflection_setup_internal_class (MonoReflectionTypeBuilder *tb, MonoError *error);
 
 static gpointer register_assembly (MonoDomain *domain, MonoReflectionAssembly *res, MonoAssembly *assembly);
 #endif
@@ -65,6 +66,7 @@ static gboolean is_sre_type_builder (MonoClass *klass);
 static gboolean is_sre_method_builder (MonoClass *klass);
 static gboolean is_sre_field_builder (MonoClass *klass);
 static gboolean is_sre_gparam_builder (MonoClass *klass);
+static gboolean is_sre_enum_builder (MonoClass *klass);
 static gboolean is_sr_mono_method (MonoClass *klass);
 static gboolean is_sr_mono_field (MonoClass *klass);
 
@@ -915,21 +917,6 @@ mono_image_get_inflated_method_token (MonoDynamicImage *assembly, MonoMethod *m)
        return token;
 }
 
-void
-mono_reflection_init_type_builder_generics (MonoObject *type, MonoError *error)
-{
-       MonoReflectionTypeBuilder *tb;
-
-       mono_error_init (error);
-
-       if (!is_sre_type_builder(mono_object_class (type)))
-               return;
-       tb = (MonoReflectionTypeBuilder *)type;
-
-       if (tb && tb->generic_container)
-               mono_reflection_create_generic_class (tb, error);
-}
-
 static guint32 
 mono_image_get_sighelper_token (MonoDynamicImage *assembly, MonoReflectionSigHelper *helper, MonoError *error)
 {
@@ -1581,6 +1568,12 @@ is_sre_gparam_builder (MonoClass *klass)
        check_corlib_type_cached (klass, "System.Reflection.Emit", "GenericTypeParameterBuilder");
 }
 
+static gboolean
+is_sre_enum_builder (MonoClass *klass)
+{
+       check_corlib_type_cached (klass, "System.Reflection.Emit", "EnumBuilder");
+}
+
 gboolean
 mono_is_sre_method_on_tb_inst (MonoClass *klass)
 {
@@ -1699,11 +1692,23 @@ mono_reflection_type_get_handle (MonoReflectionType* ref, MonoError *error)
                param->param.num = gparam->index;
 
                if (gparam->mbuilder) {
-                       g_assert (gparam->mbuilder->generic_container);
+                       if (!gparam->mbuilder->generic_container) {
+                               gparam->mbuilder->generic_container = (MonoGenericContainer *)mono_image_alloc0 (image, sizeof (MonoGenericContainer));
+                               gparam->mbuilder->generic_container->is_method = TRUE;
+                               /*
+                                * Cannot set owner.method, since the MonoMethod is not created yet.
+                                * Set the image field instead, so type_in_image () works.
+                                */
+                               gparam->mbuilder->generic_container->is_anonymous = TRUE;
+                               gparam->mbuilder->generic_container->owner.image = image;
+                       }
                        param->param.owner = gparam->mbuilder->generic_container;
                } else if (gparam->tbuilder) {
-                       g_assert (gparam->tbuilder->generic_container);
-                       param->param.owner = gparam->tbuilder->generic_container;
+                       MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)(gparam->tbuilder), error);
+                       mono_error_assert_ok (error);
+                       MonoClass *owner = mono_class_from_mono_type (type);
+                       g_assert (owner->generic_container);
+                       param->param.owner = owner->generic_container;
                }
 
                pklass = mono_class_from_generic_parameter_internal ((MonoGenericParam *) param);
@@ -1714,6 +1719,18 @@ mono_reflection_type_get_handle (MonoReflectionType* ref, MonoError *error)
                mono_image_append_class_to_reflection_info_set (pklass);
 
                return &pklass->byval_arg;
+       } else if (is_sre_enum_builder (klass)) {
+               MonoReflectionEnumBuilder *ebuilder = (MonoReflectionEnumBuilder *)ref;
+
+               return mono_reflection_type_get_handle ((MonoReflectionType*)ebuilder->tb, error);
+       } else if (is_sre_type_builder (klass)) {
+               MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)ref;
+
+               /* This happens when a finished type references an unfinished one. Have to create the minimal type */
+               reflection_setup_internal_class (tb, error);
+               mono_error_assert_ok (error);
+               g_assert (ref->type);
+               return ref->type;
        }
 
        g_error ("Cannot handle corlib user type %s", mono_type_full_name (&mono_object_class(ref)->byval_arg));
@@ -2479,6 +2496,7 @@ reflection_setup_internal_class (MonoReflectionTypeBuilder *tb, MonoError *error
        tb->type.type = &klass->byval_arg;
 
        if (tb->nesting_type) {
+               reflection_setup_internal_class ((MonoReflectionTypeBuilder*)tb->nesting_type, error);
                g_assert (tb->nesting_type->type);
                MonoType *nesting_type = mono_reflection_type_get_handle (tb->nesting_type, error);
                if (!is_ok (error)) goto failure;
@@ -2497,24 +2515,6 @@ failure:
        return FALSE;
 }
 
-/**
- * ves_icall_TypeBuilder_setup_internal_class:
- * @tb: a TypeBuilder object
- *
- * (icall)
- * Creates a MonoClass that represents the TypeBuilder.
- * This is a trick that lets us simplify a lot of reflection code
- * (and will allow us to support Build and Run assemblies easier).
- *
- */
-void
-ves_icall_TypeBuilder_setup_internal_class (MonoReflectionTypeBuilder *tb)
-{
-       MonoError error;
-       (void) reflection_setup_internal_class (tb, &error);
-       mono_error_set_pending_exception (&error);
-}
-
 /**
  * mono_reflection_create_generic_class:
  * @tb: a TypeBuilder object
@@ -2522,26 +2522,24 @@ ves_icall_TypeBuilder_setup_internal_class (MonoReflectionTypeBuilder *tb)
  *
  * Creates the generic class after all generic parameters have been added.
  * On success returns TRUE, on failure returns FALSE and sets @error.
- * 
  */
 gboolean
 mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb, MonoError *error)
 {
-
        MonoClass *klass;
        int count, i;
 
        mono_error_init (error);
 
+       reflection_setup_internal_class (tb, error);
+
        klass = 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))
+       if (count == 0)
                return TRUE;
 
-       g_assert (tb->generic_container && (tb->generic_container->owner.klass == klass));
-
        klass->generic_container = (MonoGenericContainer *)mono_image_alloc0 (klass->image, sizeof (MonoGenericContainer));
 
        klass->generic_container->owner.klass = klass;
@@ -2812,14 +2810,14 @@ reflection_methodbuilder_to_mono_method (MonoClass *klass,
 
        if (rmb->generic_params) {
                int count = mono_array_length (rmb->generic_params);
-               MonoGenericContainer *container = rmb->generic_container;
-
-               g_assert (container);
+               MonoGenericContainer *container;
 
+               container = (MonoGenericContainer *)mono_image_alloc0 (klass->image, sizeof (MonoGenericContainer));
+               container->is_method = TRUE;
+               container->is_anonymous = FALSE;
                container->type_argc = count;
                container->type_params = image_g_new0 (image, MonoGenericParamFull, count);
                container->owner.method = m;
-               container->is_anonymous = FALSE; // Method is now known, container is no longer anonymous
 
                m->is_generic = TRUE;
                mono_method_set_generic_container (m, container);
@@ -2831,6 +2829,9 @@ reflection_methodbuilder_to_mono_method (MonoClass *klass,
                        mono_error_assert_ok (error);
                        MonoGenericParamFull *param = (MonoGenericParamFull *) gp_type->data.generic_param;
                        container->type_params [i] = *param;
+                       container->type_params [i].param.owner = container;
+
+                       gp->type.type->data.generic_param = (MonoGenericParam*)&container->type_params [i];
                }
 
                /*
@@ -2962,14 +2963,15 @@ ctorbuilder_to_mono_method (MonoClass *klass, MonoReflectionCtorBuilder* mb, Mon
        MonoMethodSignature *sig;
 
        mono_loader_lock ();
+
+       if (!mono_reflection_methodbuilder_from_ctor_builder (&rmb, mb, error))
+               return NULL;
+
        g_assert (klass->image != NULL);
        sig = ctor_builder_to_signature (klass->image, mb, error);
        mono_loader_unlock ();
        return_val_if_nok (error, NULL);
 
-       if (!mono_reflection_methodbuilder_from_ctor_builder (&rmb, mb, error))
-               return NULL;
-
        mb->mhandle = reflection_methodbuilder_to_mono_method (klass, &rmb, sig, error);
        return_val_if_nok (error, NULL);
        mono_save_custom_attrs (klass->image, mb->mhandle, mb->cattrs);
@@ -2991,14 +2993,15 @@ methodbuilder_to_mono_method (MonoClass *klass, MonoReflectionMethodBuilder* mb,
        mono_error_init (error);
 
        mono_loader_lock ();
+
+       if (!mono_reflection_methodbuilder_from_method_builder (&rmb, mb, error))
+               return NULL;
+
        g_assert (klass->image != NULL);
        sig = method_builder_to_signature (klass->image, mb, error);
        mono_loader_unlock ();
        return_val_if_nok (error, NULL);
 
-       if (!mono_reflection_methodbuilder_from_method_builder (&rmb, mb, error))
-               return NULL;
-
        mb->mhandle = reflection_methodbuilder_to_mono_method (klass, &rmb, sig, error);
        return_val_if_nok (error, NULL);
        mono_save_custom_attrs (klass->image, mb->mhandle, mb->cattrs);
@@ -3530,6 +3533,9 @@ ves_icall_TypeBuilder_create_runtime_class (MonoReflectionTypeBuilder *tb)
 
        mono_error_init (&error);
 
+       mono_reflection_create_generic_class (tb, &error);
+       mono_error_assert_ok (&error);
+
        domain = mono_object_domain (tb);
        klass = mono_class_from_mono_type (tb->type.type);
 
@@ -3572,6 +3578,12 @@ ves_icall_TypeBuilder_create_runtime_class (MonoReflectionTypeBuilder *tb)
                for (i = 0; i < mono_array_length (tb->subtypes); ++i) {
                        MonoReflectionTypeBuilder *subtb = mono_array_get (tb->subtypes, MonoReflectionTypeBuilder*, i);
                        mono_class_alloc_ext (klass);
+
+                       if (!subtb->type.type) {
+                               reflection_setup_internal_class (subtb, &error);
+                               mono_error_assert_ok (&error);
+                       }
+
                        MonoType *subtype = mono_reflection_type_get_handle ((MonoReflectionType*)subtb, &error);
                        if (!is_ok (&error)) goto failure;
                        klass->ext->nested_classes = g_list_prepend_image (klass->image, klass->ext->nested_classes, mono_class_from_mono_type (subtype));
@@ -3654,52 +3666,6 @@ failure_unlocked:
        return NULL;
 }
 
-static gboolean
-reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam, MonoError *error)
-{
-       MonoImage *image;
-
-       mono_error_init (error);
-
-       image = &gparam->tbuilder->module->dynamic_image->image;
-
-       if (gparam->mbuilder) {
-               if (!gparam->mbuilder->generic_container) {
-                       MonoType *tb = mono_reflection_type_get_handle ((MonoReflectionType*)gparam->mbuilder->type, error);
-                       return_val_if_nok (error, FALSE);
-
-                       MonoClass *klass = mono_class_from_mono_type (tb);
-                       gparam->mbuilder->generic_container = (MonoGenericContainer *)mono_image_alloc0 (klass->image, sizeof (MonoGenericContainer));
-                       gparam->mbuilder->generic_container->is_method = TRUE;
-                       /* 
-                        * Cannot set owner.method, since the MonoMethod is not created yet.
-                        * Set the image field instead, so type_in_image () works.
-                        */
-                       gparam->mbuilder->generic_container->is_anonymous = TRUE;
-                       gparam->mbuilder->generic_container->owner.image = klass->image;
-               }
-       } else if (gparam->tbuilder) {
-               if (!gparam->tbuilder->generic_container) {
-                       MonoType *tb = mono_reflection_type_get_handle ((MonoReflectionType*)gparam->tbuilder, error);
-                       return_val_if_nok (error, FALSE);
-                       MonoClass *klass = mono_class_from_mono_type (tb);
-                       gparam->tbuilder->generic_container = (MonoGenericContainer *)mono_image_alloc0 (klass->image, sizeof (MonoGenericContainer));
-                       gparam->tbuilder->generic_container->owner.klass = klass;
-               }
-       }
-
-       return TRUE;
-}
-
-void
-ves_icall_GenericTypeParameterBuilder_initialize (MonoReflectionGenericParam *gparam)
-{
-       MonoError error;
-       (void) reflection_initialize_generic_parameter (gparam, &error);
-       mono_error_set_pending_exception (&error);
-}
-
-
 typedef struct {
        MonoMethod *handle;
        MonoDomain *domain;
@@ -4286,21 +4252,6 @@ ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilder *mb, gui
        return obj;
 }
 
-/**
- * ves_icall_TypeBuilder_create_generic_class:
- * @tb: a TypeBuilder object
- *
- * (icall)
- * Creates the generic class after all generic parameters have been added.
- */
-void
-ves_icall_TypeBuilder_create_generic_class (MonoReflectionTypeBuilder *tb)
-{
-       MonoError error;
-       (void) mono_reflection_create_generic_class (tb, &error);
-       mono_error_set_pending_exception (&error);
-}
-
 #ifndef DISABLE_REFLECTION_EMIT
 MonoArray*
 ves_icall_CustomAttributeBuilder_GetBlob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues)