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;
}
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) {
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);
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;
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) {
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;
}
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;
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
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;
} 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 ();
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;
}
} 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;
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);
}
/*