mono_loader_unlock ();
#endif
}
+
+MonoType*
+mono_class_gtd_get_canonical_inst (MonoClass *klass)
+{
+ g_assert (mono_class_is_gtd (klass));
+ return &((MonoClassGtd*)klass)->canonical_inst;
+}
typedef struct {
MonoClassDef class;
MonoGenericContainer *generic_container;
+ /* The canonical GENERICINST where we instantiate a generic type definition with its own generic parameters.*/
+ /* Suppose we have class T`2<A,B> {...}. canonical_inst is the GTD T`2 applied to A and B. */
+ MonoType canonical_inst;
} MonoClassGtd;
typedef struct {
void
mono_class_set_generic_container (MonoClass *klass, MonoGenericContainer *container);
+MonoType*
+mono_class_gtd_get_canonical_inst (MonoClass *klass);
+
guint32
mono_class_get_first_method_idx (MonoClass *klass);
generic_container->is_anonymous = FALSE; // Owner class is now known, container is no longer anonymous
context = &generic_container->context;
mono_class_set_generic_container (klass, generic_container);
+ MonoType *canonical_inst = &((MonoClassGtd*)klass)->canonical_inst;
+ canonical_inst->type = MONO_TYPE_GENERICINST;
+ canonical_inst->data.generic_class = mono_metadata_lookup_generic_class (klass, context->class_inst, FALSE);
enable_gclass_recording ();
}
}
generic_container->context.class_inst = mono_get_shared_generic_inst (generic_container);
+ MonoGenericContext* context = &generic_container->context;
+ MonoType *canonical_inst = &((MonoClassGtd*)klass)->canonical_inst;
+ canonical_inst->type = MONO_TYPE_GENERICINST;
+ canonical_inst->data.generic_class = mono_metadata_lookup_generic_class (klass, context->class_inst, FALSE);
+
leave:
HANDLE_FUNCTION_RETURN_VAL (is_ok (error));
}