2005-12-23 Dick Porter <dick@ximian.com>
[mono.git] / mono / metadata / class-internals.h
index eaefa1f91f306a69635cb231cebc59af8ab21024..18c41bedb31d5f18cf4f981dbac4433074caffac 100644 (file)
@@ -44,6 +44,7 @@ typedef enum {
        MONO_WRAPPER_PROXY_ISINST,
        MONO_WRAPPER_STELEMREF,
        MONO_WRAPPER_UNBOX,
+       MONO_WRAPPER_LDFLDA,
        MONO_WRAPPER_UNKNOWN
 } MonoWrapperType;
 
@@ -65,6 +66,7 @@ struct _MonoMethod {
        guint32 token;
        MonoClass *klass;
        MonoMethodSignature *signature;
+       MonoGenericContainer *generic_container;
        /* name is useful mostly for debugging */
        const char *name;
        /* this is used by the inlining algorithm */
@@ -74,13 +76,12 @@ struct _MonoMethod {
        unsigned int string_ctor:1;
        unsigned int save_lmf:1;
        unsigned int dynamic:1; /* created & destroyed during runtime */
-       unsigned int is_inflated:1;
+       unsigned int is_inflated:1; /* whether we're a MonoMethodInflated */
        signed int slot : 21;
 };
 
 struct _MonoMethodNormal {
        MonoMethod method;
-       MonoGenericContainer *generic_container;
        MonoMethodHeader *header;
 };
 
@@ -89,13 +90,6 @@ struct _MonoMethodWrapper {
        void *method_data;
 };
 
-struct _MonoMethodInflated {
-       MonoMethodNormal nmethod;
-       MonoGenericContext *context;
-       MonoMethod *declaring;
-       MonoMethodInflated *inflated;
-};
-
 struct _MonoMethodPInvoke {
        MonoMethod method;
        gpointer addr;
@@ -104,6 +98,30 @@ struct _MonoMethodPInvoke {
        guint16 implmap_idx;  /* index into IMPLMAP */
 };
 
+/*
+ * Inflated generic method.
+ */
+struct _MonoMethodInflated {
+       union {
+               MonoMethod method;
+               MonoMethodNormal normal;
+               MonoMethodPInvoke pinvoke;
+       } method;
+       MonoGenericContext *context;    /* The current context. */
+       MonoMethod *declaring;          /* the generic method definition. */
+       /* This is a big performance optimization:
+        *
+        * mono_class_inflate_generic_method() just creates a copy of the method
+        * and computes its new context, but it doesn't actually inflate the
+        * method's signature and header.  Very often, we don't actually need them
+        * (for instance because the method is stored in a class'es vtable).
+        *
+        * If the `inflated' field in non-NULL, mono_get_inflated_method() already
+        * inflated the signature and header and stored it there.
+        */
+       MonoMethodInflated *inflated;
+};
+
 typedef struct {
        MonoType *generic_type;
        gpointer reflection_info;
@@ -344,28 +362,47 @@ struct MonoVTable {
 /*
  * Generic instantiation data type encoding.
  */
+
+/*
+ * A particular generic instantiation:
+ *
+ * All instantiations are cached and we don't distinguish between class and method
+ * instantiations here.
+ */
 struct _MonoGenericInst {
-       guint id;
-       guint type_argc    : 22;
-       guint is_open      :  1;
-       guint is_reference :  1;
+       guint id;                       /* unique ID for debugging */
+       guint type_argc    : 22;        /* number of type arguments */
+       guint is_open      :  1;        /* if this is an open type */
+       guint is_reference :  1;        /* if this is a reference type */
        MonoType **type_argv;
 };
 
+/*
+ * A particular instantiation of a generic type.
+ */
 struct _MonoGenericClass {
-       MonoGenericInst *inst;
-       MonoClass *container_class;
-       MonoGenericContext *context;
-       guint is_dynamic  : 1;
-       guint is_inflated : 1;
+       MonoGenericInst *inst;          /* the instantiation */
+       MonoClass *container_class;     /* the generic type definition */
+       MonoGenericContext *context;    /* current context */
+       guint is_dynamic  : 1;          /* We're a MonoDynamicGenericClass */
+       guint is_inflated : 1;          /* We're a MonoInflatedGenericClass */
 };
 
+/*
+ * Performance optimization:
+ * We don't create the `MonoClass' for a `MonoGenericClass' until we really
+ * need it.
+ */
 struct _MonoInflatedGenericClass {
        MonoGenericClass generic_class;
        guint is_initialized   : 1;
        MonoClass *klass;
 };
 
+/*
+ * This is used when instantiating a generic type definition which is
+ * a TypeBuilder.
+ */
 struct _MonoDynamicGenericClass {
        MonoInflatedGenericClass generic_class;
        MonoType *parent;
@@ -384,34 +421,62 @@ struct _MonoDynamicGenericClass {
        guint initialized;
 };
 
+/*
+ * A particular instantiation of a generic method.
+ */
 struct _MonoGenericMethod {
-       MonoGenericInst *inst;
-       MonoGenericClass *generic_class;
-       MonoGenericContainer *container;
+       MonoGenericInst *inst;                  /* the instantiation */
+       MonoGenericClass *generic_class;        /* if we're in a generic type */
+       MonoGenericContainer *container;        /* type parameters */
        gpointer reflection_info;
 };
 
+/*
+ * The generic context.
+ */
 struct _MonoGenericContext {
+       /*
+        * The current container:
+        *
+        * If we're in a generic method, the generic method definition's container.
+        * Otherwise the generic type's container.
+        */
        MonoGenericContainer *container;
+       /* The current generic class */
        MonoGenericClass *gclass;
+       /* The current generic method */
        MonoGenericMethod *gmethod;
 };
 
+/*
+ * The generic container.
+ *
+ * Stores the type parameters of a generic type definition or a generic method definition.
+ */
 struct _MonoGenericContainer {
        MonoGenericContext context;
+       /* If we're a generic method definition, the containing class'es context. */
        MonoGenericContainer *parent;
+       /* If we're a generic method definition, caches all their instantiations. */
        GHashTable *method_hash;
+       /* If we're a generic type definition, its `MonoClass'. */
        MonoClass *klass;
        int type_argc    : 6;
+       /* If true, we're a generic method, otherwise a generic type definition. */
        int is_method    : 1;
-       int is_signature : 1;
+       /* Our type parameters. */
        MonoGenericParam *type_params;
+       /* Cache for MonoTypes */
+       MonoType **types;
 };
 
+/*
+ * A type parameter.
+ */
 struct _MonoGenericParam {
-       MonoGenericContainer *owner;
-       MonoClass *pklass;
-       MonoMethod *method;
+       MonoGenericContainer *owner;    /* Type or method this parameter was defined in. */
+       MonoClass *pklass;              /* The corresponding `MonoClass'. */
+       MonoMethod *method;             /* If we're a method type parameter, the method. */
        const char *name;
        guint16 flags;
        guint16 num;
@@ -617,6 +682,7 @@ typedef struct {
        MonoClass *runtimesecurityframe_class;
        MonoClass *executioncontext_class;
        MonoClass *generic_array_class;
+       MonoClass *generic_nullable_class;
 } MonoDefaults;
 
 extern MonoDefaults mono_defaults;
@@ -701,8 +767,14 @@ mono_class_get_exception_for_failure (MonoClass *klass);
 char*
 mono_type_get_name_full (MonoType *type, MonoTypeNameFormat format);
 
+char*
+mono_type_get_full_name (MonoClass *class);
+
 MonoArrayType *mono_dup_array_type (MonoArrayType *a);
 MonoMethodSignature *mono_metadata_signature_deep_dup (MonoMethodSignature *sig);
 
+gboolean mono_class_is_nullable (MonoClass *klass);
+MonoClass *mono_class_get_nullable_param (MonoClass *klass);
+
 #endif /* __MONO_METADATA_CLASS_INTERBALS_H__ */