static MonoGetClassFromName get_class_from_name = NULL;
static MonoClass * mono_class_create_from_typedef (MonoImage *image, guint32 type_token);
-static void mono_class_create_generic (MonoInflatedGenericClass *gclass);
static gboolean mono_class_get_cached_class_info (MonoClass *klass, MonoCachedClassInfo *res);
void (*mono_debugger_start_class_init_func) (MonoClass *klass) = NULL;
return class->generic_class ? mono_generic_class_get_context (class->generic_class) : NULL;
}
-MonoInflatedGenericClass*
-mono_get_inflated_generic_class (MonoGenericClass *gclass)
-{
- g_assert (gclass->is_inflated);
- mono_class_create_generic ((MonoInflatedGenericClass *) gclass);
- return (MonoInflatedGenericClass *) gclass;
-}
-
/*
* mono_class_inflate_generic_type:
* @type: a type
mono_stats.initialized_class_count++;
if (class->generic_class && !class->generic_class->is_dynamic) {
- MonoInflatedGenericClass *gclass;
- MonoClass *gklass;
-
- gclass = mono_get_inflated_generic_class (class->generic_class);
- gklass = gclass->generic_class.container_class;
+ MonoClass *gklass = class->generic_class->container_class;
mono_stats.generic_class_count++;
for (i = 0; i < class->method.count; i++) {
MonoMethod *inflated = mono_class_inflate_generic_method_full (
- gklass->methods [i], class, mono_generic_class_get_context ((MonoGenericClass *) gclass));
+ gklass->methods [i], class, mono_class_get_context (class));
class->methods [i] = mono_get_inflated_method (inflated);
}
if (prop->get)
prop->get = mono_class_inflate_generic_method_full (
- prop->get, class, mono_generic_class_get_context ((MonoGenericClass *) gclass));
+ prop->get, class, mono_class_get_context (class));
if (prop->set)
prop->set = mono_class_inflate_generic_method_full (
- prop->set, class, mono_generic_class_get_context ((MonoGenericClass *) gclass));
+ prop->set, class, mono_class_get_context (class));
prop->parent = class;
}
* Create the `MonoClass' for an instantiation of a generic type.
* We only do this if we actually need it.
*/
-static void
-mono_class_create_generic (MonoInflatedGenericClass *gclass)
+static MonoClass*
+mono_generic_class_get_class (MonoGenericClass *gclass)
{
+ MonoInflatedGenericClass *igclass;
MonoClass *klass, *gklass;
int i;
+ g_assert (gclass->is_inflated);
+ igclass = (MonoInflatedGenericClass *) gclass;
+
mono_loader_lock ();
- if (gclass->klass) {
+ if (igclass->klass) {
mono_loader_unlock ();
- return;
+ return igclass->klass;
}
- gclass->klass = g_malloc0 (sizeof (MonoClass));
- klass = gclass->klass;
+ igclass->klass = g_malloc0 (sizeof (MonoClass));
+ klass = igclass->klass;
- gklass = gclass->generic_class.container_class;
+ gklass = gclass->container_class;
if (gklass->nested_in) {
/*
* generic parameters...
*/
MonoType *inflated = mono_class_inflate_generic_type (
- &gklass->nested_in->byval_arg, mono_generic_class_get_context ((MonoGenericClass *) gclass));
+ &gklass->nested_in->byval_arg, mono_generic_class_get_context (gclass));
klass->nested_in = mono_class_from_mono_type (inflated);
}
klass->flags = gklass->flags;
klass->type_token = gklass->type_token;
- klass->generic_class = &gclass->generic_class;
+ klass->generic_class = gclass;
klass->this_arg.type = klass->byval_arg.type = MONO_TYPE_GENERICINST;
- klass->this_arg.data.generic_class = klass->byval_arg.data.generic_class = &gclass->generic_class;
+ klass->this_arg.data.generic_class = klass->byval_arg.data.generic_class = gclass;
klass->this_arg.byref = TRUE;
klass->cast_class = klass->element_class = klass;
if (mono_class_is_nullable (klass))
klass->cast_class = klass->element_class = mono_class_get_nullable_param (klass);
- if (gclass->generic_class.is_dynamic) {
+ if (gclass->is_dynamic) {
klass->instance_size = gklass->instance_size;
klass->sizes.class_size = gklass->sizes.class_size;
klass->size_inited = 1;
klass->interfaces = g_new0 (MonoClass *, klass->interface_count);
for (i = 0; i < klass->interface_count; i++) {
MonoType *it = &gklass->interfaces [i]->byval_arg;
- MonoType *inflated = mono_class_inflate_generic_type (
- it, mono_generic_class_get_context ((MonoGenericClass *) gclass));
+ MonoType *inflated = mono_class_inflate_generic_type (it, mono_generic_class_get_context (gclass));
klass->interfaces [i] = mono_class_from_mono_type (inflated);
}
if (gklass->parent) {
MonoType *inflated = mono_class_inflate_generic_type (
- &gklass->parent->byval_arg, mono_generic_class_get_context ((MonoGenericClass *) gclass));
+ &gklass->parent->byval_arg, mono_generic_class_get_context (gclass));
klass->parent = mono_class_from_mono_type (inflated);
}
setup_interface_offsets (klass, 0);
mono_loader_unlock ();
+
+ return klass;
}
MonoClass *
case MONO_TYPE_CLASS:
case MONO_TYPE_VALUETYPE:
return type->data.klass;
- case MONO_TYPE_GENERICINST: {
- MonoInflatedGenericClass *gclass;
- gclass = mono_get_inflated_generic_class (type->data.generic_class);
- g_assert (gclass->klass);
- return gclass->klass;
- }
+ case MONO_TYPE_GENERICINST:
+ return mono_generic_class_get_class (type->data.generic_class);
case MONO_TYPE_VAR:
return mono_class_from_generic_parameter (type->data.generic_param, NULL, FALSE);
case MONO_TYPE_MVAR:
case MONO_TYPE_TYPEDBYREF:
return mono_class_value_size (mono_defaults.typed_reference_class, align);
case MONO_TYPE_GENERICINST: {
- MonoInflatedGenericClass *gclass;
- MonoClass *container_class;
+ MonoGenericClass *gclass = t->data.generic_class;
+ MonoClass *container_class = gclass->container_class;
- gclass = mono_get_inflated_generic_class (t->data.generic_class);
- // g_assert (!gclass->generic_class.inst->is_open);
- // g_assert (!gclass->klass->generic_container);
-
- container_class = gclass->generic_class.container_class;
+ // g_assert (!gclass->inst->is_open);
if (container_class->valuetype) {
if (container_class->enumtype)
return mono_type_size (container_class->enum_basetype, align);
else
- return mono_class_value_size (gclass->klass, align);
+ return mono_class_value_size (mono_class_from_mono_type (t), align);
} else {
*align = __alignof__(gpointer);
return sizeof (gpointer);
}
}
case MONO_TYPE_GENERICINST: {
- MonoInflatedGenericClass *gclass;
- MonoClass *container_class;
-
- gclass = mono_get_inflated_generic_class (t->data.generic_class);
- container_class = gclass->generic_class.container_class;
+ MonoGenericClass *gclass = t->data.generic_class;
+ MonoClass *container_class = gclass->container_class;
- g_assert (!gclass->generic_class.inst->is_open);
- g_assert (!gclass->klass->generic_container);
+ g_assert (!gclass->inst->is_open);
if (container_class->valuetype) {
if (container_class->enumtype)
return mono_type_stack_size (container_class->enum_basetype, align);
else {
- guint32 size = mono_class_value_size (gclass->klass, align);
+ guint32 size = mono_class_value_size (mono_class_from_mono_type (t), align);
*align = *align + __alignof__(gpointer) - 1;
*align &= ~(__alignof__(gpointer) - 1);
{
static MonoClass *System_Reflection_MonoGenericClass;
MonoReflectionGenericClass *res;
- MonoInflatedGenericClass *gclass;
- MonoClass *gklass;
+ MonoClass *klass, *gklass;
if (!System_Reflection_MonoGenericClass) {
System_Reflection_MonoGenericClass = mono_class_from_name (
g_assert (System_Reflection_MonoGenericClass);
}
- gclass = mono_get_inflated_generic_class (geninst->data.generic_class);
- gklass = gclass->generic_class.container_class;
- g_assert (gklass->generic_container);
+ klass = mono_class_from_mono_type (geninst);
+ gklass = klass->generic_class->container_class;
- mono_class_init (gclass->klass);
+ mono_class_init (klass);
#ifdef HAVE_SGEN_GC
/* FIXME: allow unpinned later */
inflate_mono_method (MonoReflectionGenericClass *type, MonoMethod *method, MonoObject *obj)
{
MonoGenericMethod *gmethod = NULL;
- MonoInflatedGenericClass *gclass;
MonoGenericContext *context;
MonoClass *klass;
int i, n;
klass = mono_class_from_mono_type (type->type.type);
- gclass = mono_get_inflated_generic_class (type->type.type->data.generic_class);
- n = mono_method_signature (method)->generic_param_count;
+ g_assert (klass->generic_class);
+ context = mono_class_get_context (klass);
- context = mono_generic_class_get_context ((MonoGenericClass *) gclass);
+ n = mono_method_signature (method)->generic_param_count;
if (n) {
gmethod = g_new0 (MonoGenericMethod, 1);
- gmethod->class_inst = gclass->generic_class.inst;
+ gmethod->class_inst = klass->generic_class->inst;
gmethod->container = method->generic_container;
MOVING_GC_REGISTER (&gmethod->reflection_info);
gmethod->reflection_info = obj;
gmethod->inst->type_argv [i] = &gparam->pklass->byval_arg;
}
- g_assert (gmethod->container->parent == ((MonoGenericClass *)gclass)->container_class->generic_container);
+ g_assert (gmethod->container->parent == klass->generic_class->container_class->generic_container);
context = g_new0 (MonoGenericContext, 1);
- context->class_inst = gclass->generic_class.inst;
+ context->class_inst = klass->generic_class->inst;
context->gmethod = gmethod;
}