Sat Jan 8 19:03:26 CET 2005 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / metadata / reflection.c
index 34ccca74c80455322fe699b170a5447beeb339ac..6f2ed9414154c65f78769320161a773c299c1440 100644 (file)
@@ -1313,9 +1313,9 @@ reflection_methodbuilder_from_method_builder (ReflectionMethodBuilder *rmb, Mono
        rmb->refs = NULL;
 
        if (mb->dll) {
-               rmb->charset = rmb->charset & 0xf;
-               rmb->lasterr = rmb->charset & 0x40;
-               rmb->native_cc = rmb->native_cc;
+               rmb->charset = mb->charset & 0xf;
+               rmb->lasterr = mb->charset & 0x40;
+               rmb->native_cc = mb->native_cc;
                rmb->dllentry = mb->dllentry;
                rmb->dll = mb->dll;
        }
@@ -1821,7 +1821,7 @@ property_encode_signature (MonoDynamicImage *assembly, MonoReflectionPropertyBui
                        MonoReflectionType *pt = mono_array_get (mb->parameters, MonoReflectionType*, i);
                        encode_reflection_type (assembly, pt, p, &p);
                }
-       } else {
+       } else if (smb) {
                /* the property type is the last param */
                encode_reflection_type (assembly, mono_array_get (smb->parameters, MonoReflectionType*, nparams), p, &p);
                for (i = 0; i < nparams; ++i) {
@@ -1829,6 +1829,10 @@ property_encode_signature (MonoDynamicImage *assembly, MonoReflectionPropertyBui
                        encode_reflection_type (assembly, pt, p, &p);
                }
        }
+       else {
+               encode_reflection_type (assembly, fb->type, p, &p);
+       }
+
        /* store length */
        g_assert (p - buf < size);
        mono_metadata_encode_value (p-buf, b, &b);
@@ -2462,7 +2466,8 @@ method_encode_methodspec (MonoDynamicImage *assembly, MonoMethod *method)
 
        table = &assembly->tables [MONO_TABLE_METHODSPEC];
 
-       g_assert (method->signature->is_inflated);
+       g_assert (method->is_inflated);
+       method = mono_get_inflated_method (method);
        imethod = (MonoMethodInflated *) method;
        declaring = imethod->declaring;
 
@@ -2508,7 +2513,8 @@ mono_image_get_methodspec_token (MonoDynamicImage *assembly, MonoMethod *m)
        if (token)
                return token;
 
-       g_assert (m->signature->is_inflated);
+       g_assert (m->is_inflated);
+       m = mono_get_inflated_method (m);
        imethod = (MonoMethodInflated *) m;
 
        if (imethod->declaring->signature->generic_param_count) {
@@ -3563,9 +3569,11 @@ fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *asse
                                am = (MonoReflectionArrayMethod*)iltoken->member;
                                idx = am->table_idx;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "MonoMethod") ||
-                                  !strcmp (iltoken->member->vtable->klass->name, "MonoCMethod")) {
+                                  !strcmp (iltoken->member->vtable->klass->name, "MonoCMethod") ||
+                                  !strcmp (iltoken->member->vtable->klass->name, "MonoGenericMethod") ||
+                                  !strcmp (iltoken->member->vtable->klass->name, "MonoGenericCMethod")) {
                                MonoMethod *m = ((MonoReflectionMethod*)iltoken->member)->method;
-                               g_assert (m->klass->generic_class);
+                               g_assert (m->klass->generic_class || m->klass->generic_container);
                                continue;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "FieldBuilder")) {
                                continue;
@@ -3580,7 +3588,7 @@ fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *asse
                        }
                        break;
                case MONO_TABLE_METHODSPEC:
-                       if (!strcmp (iltoken->member->vtable->klass->name, "MonoMethod")) {
+                       if (!strcmp (iltoken->member->vtable->klass->name, "MonoGenericMethod")) {
                                MonoMethod *m = ((MonoReflectionMethod*)iltoken->member)->method;
                                g_assert (m->signature->generic_param_count);
                                continue;
@@ -4127,9 +4135,11 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj, gboolean c
                token = mono_metadata_token_from_dor (
                        mono_image_typedef_or_ref (assembly, tb->type));
        } else if (strcmp (klass->name, "MonoCMethod") == 0 ||
-                       strcmp (klass->name, "MonoMethod") == 0) {
+                  strcmp (klass->name, "MonoMethod") == 0 ||
+                  strcmp (klass->name, "MonoGenericMethod") == 0 ||
+                  strcmp (klass->name, "MonoGenericCMethod") == 0) {
                MonoReflectionMethod *m = (MonoReflectionMethod *)obj;
-               if (m->method->signature->is_inflated) {
+               if (m->method->is_inflated) {
                        if (create_methodspec)
                                token = mono_image_get_methodspec_token (assembly, m->method);
                        else
@@ -5347,6 +5357,25 @@ mono_method_get_object (MonoDomain *domain, MonoMethod *method, MonoClass *refcl
        MonoClass *klass;
        MonoReflectionMethod *ret;
 
+       if (method->is_inflated) {
+               MonoReflectionGenericMethod *gret;
+
+               refclass = method->klass;
+               CHECK_OBJECT (MonoReflectionMethod *, method, refclass);
+               if ((*method->name == '.') && (!strcmp (method->name, ".ctor") || !strcmp (method->name, ".cctor")))
+                       cname = "MonoGenericCMethod";
+               else
+                       cname = "MonoGenericMethod";
+               klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", cname);
+
+               gret = (MonoReflectionGenericMethod*)mono_object_new (domain, klass);
+               gret->method.method = method;
+               gret->method.name = mono_string_new (domain, method->name);
+               gret->method.reftype = mono_type_get_object (domain, &refclass->byval_arg);
+               CACHE_OBJECT (method, gret, refclass);
+               return (MonoReflectionMethod *) gret;
+       }
+
        if (!refclass)
                refclass = method->klass;
 
@@ -6134,7 +6163,7 @@ mono_reflection_get_token (MonoObject *obj)
        } else if (strcmp (klass->name, "MonoCMethod") == 0 ||
                        strcmp (klass->name, "MonoMethod") == 0) {
                MonoReflectionMethod *m = (MonoReflectionMethod *)obj;
-               if (m->method->signature->is_inflated) {
+               if (m->method->is_inflated) {
                        g_assert_not_reached ();
                } else if (m->method->signature->generic_param_count) {
                        g_assert_not_reached ();
@@ -6729,8 +6758,7 @@ mono_custom_attrs_from_param (MonoMethod *method, guint32 param)
        method_index = find_method_index (method);
        ca = &image->tables [MONO_TABLE_METHOD];
 
-       if (method->klass->generic_class || method->klass->generic_container ||
-           method->signature->generic_param_count) {
+       if (method->klass->generic_class || method->signature->generic_param_count) {
                /* FIXME FIXME FIXME */
                return NULL;
        }
@@ -6798,6 +6826,9 @@ mono_reflection_get_custom_attrs (MonoObject *obj)
        } else if ((strcmp ("MonoMethod", klass->name) == 0) || (strcmp ("MonoCMethod", klass->name) == 0)) {
                MonoReflectionMethod *rmethod = (MonoReflectionMethod*)obj;
                cinfo = mono_custom_attrs_from_method (rmethod->method);
+       } else if ((strcmp ("MonoGenericMethod", klass->name) == 0) || (strcmp ("MonoGenericCMethod", klass->name) == 0)) {
+               MonoMethod *method = mono_get_inflated_method (((MonoReflectionMethod*)obj)->method);
+               cinfo = mono_custom_attrs_from_method (method);
        } else if (strcmp ("ParameterInfo", klass->name) == 0) {
                MonoReflectionParameter *param = (MonoReflectionParameter*)obj;
                MonoReflectionMethod *rmethod = (MonoReflectionMethod*)param->MemberImpl;
@@ -7413,6 +7444,8 @@ mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb)
                klass->generic_container->type_params [i] = *gparam->type.type->data.generic_param;
                g_assert (klass->generic_container->type_params [i].owner);
        }
+
+       klass->generic_container->context.gclass = mono_get_shared_generic_class (klass->generic_container, TRUE);
 }
 
 /*