Sat Jan 8 19:03:26 CET 2005 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / metadata / class-internals.h
index d660eefdf3c6d3ea2e23e4d537884b9147ef5aa1..636cb475cd8f6dadec9d0ed6a2e2e28790748f1d 100644 (file)
@@ -10,7 +10,7 @@
 
 extern gboolean mono_print_vtable;
 
-typedef void     (*MonoStackWalkImpl) (MonoStackWalk func, gpointer user_data);
+typedef void     (*MonoStackWalkImpl) (MonoStackWalk func, gboolean do_il_offset, gpointer user_data);
 
 typedef struct _MonoMethodNormal MonoMethodNormal;
 typedef struct _MonoMethodWrapper MonoMethodWrapper;
@@ -27,36 +27,48 @@ typedef enum {
        MONO_WRAPPER_MANAGED_TO_NATIVE,
        MONO_WRAPPER_REMOTING_INVOKE,
        MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK,
+       MONO_WRAPPER_XDOMAIN_INVOKE,
+       MONO_WRAPPER_XDOMAIN_DISPATCH,
        MONO_WRAPPER_LDFLD,
        MONO_WRAPPER_STFLD,
        MONO_WRAPPER_SYNCHRONIZED,
        MONO_WRAPPER_DYNAMIC_METHOD,
+       MONO_WRAPPER_ISINST,
+       MONO_WRAPPER_CASTCLASS,
+       MONO_WRAPPER_PROXY_ISINST,
+       MONO_WRAPPER_STELEMREF,
+       MONO_WRAPPER_UNBOX,
        MONO_WRAPPER_UNKNOWN
 } MonoWrapperType;
 
+typedef enum {
+       MONO_REMOTING_TARGET_UNKNOWN,
+       MONO_REMOTING_TARGET_APPDOMAIN
+} MonoRemotingTarget;
+
 struct _MonoMethod {
        guint16 flags;  /* method flags */
        guint16 iflags; /* method implementation flags */
        guint32 token;
        MonoClass *klass;
        MonoMethodSignature *signature;
-       gpointer addr;
        gpointer info; /* runtime info */
-       gpointer remoting_tramp; 
-       gint slot;
        /* name is useful mostly for debugging */
        const char *name;
        /* this is used by the inlining algorithm */
        unsigned int inline_info:1;
        unsigned int uses_this:1;
-       unsigned int wrapper_type:4;
+       unsigned int wrapper_type:5;
        unsigned int string_ctor:1;
        unsigned int save_lmf:1;
-       gint16 inline_count;
+       unsigned int dynamic:1; /* created & destroyed during runtime */
+       unsigned int is_inflated:1;
+       gint slot : 21;
 };
 
 struct _MonoMethodNormal {
        MonoMethod method;
+       MonoGenericContainer *generic_container;
        MonoMethodHeader *header;
 };
 
@@ -69,21 +81,17 @@ struct _MonoMethodInflated {
        MonoMethodNormal nmethod;
        MonoGenericContext *context;
        MonoMethod *declaring;
+       MonoMethodInflated *inflated;
 };
 
 struct _MonoMethodPInvoke {
        MonoMethod method;
-       void  (*code) (void);
+       gpointer addr;
        /* add marshal info */
        guint16 piflags;  /* pinvoke flags */
        guint16 implmap_idx;  /* index into IMPLMAP */
 };
 
-typedef struct {
-       MonoTypeEnum type;
-       gpointer value;
-} MonoConstant;
-
 typedef struct {
        MonoType *generic_type;
        gpointer reflection_info;
@@ -116,8 +124,10 @@ struct _MonoClassField {
        const char      *name;
 
        /*
-        * Pointer to the data (from the RVA address, valid only for
-        * fields with the has rva flag).
+        * If the field is constant, pointer to the metadata constant
+        * value.
+        * If the field has an RVA flag, pointer to the data.
+        * Else, invalid.
         */
        const char      *data;
 
@@ -125,10 +135,9 @@ struct _MonoClassField {
        MonoClass       *parent;
 
        /*
-        * If the field is constant, pointer to the metadata where the
-        * constant value can be loaded. Initialized lazily during vtable creation.
+        * If the field is constant, the type of the constant.
         */
-       MonoConstant    *def_value;
+       MonoTypeEnum     def_type;
 };
 
 /* a field is ignored if it's named "_Deleted" and it has the specialname and rtspecialname flags set */
@@ -205,6 +214,7 @@ struct _MonoClass {
        guint delegate        : 1; /* class is a Delegate */
        guint gc_descr_inited : 1; /* gc_descr is initialized */
        guint dummy           : 1; /* temporary hack */
+       guint32 declsec_flags;     /* declarative security attributes flags */
 
        MonoClass  *parent;
        MonoClass  *nested_in;
@@ -258,9 +268,8 @@ struct _MonoClass {
        MonoType this_arg;
        MonoType byval_arg;
 
-       MonoGenericInst *generic_inst;
-       MonoGenericParam *gen_params;
-       guint16 num_gen_params;
+       MonoGenericClass *generic_class;
+       MonoGenericContainer *generic_container;
 
        void *reflection_info;
 
@@ -282,7 +291,7 @@ struct MonoVTable {
         */
        void *gc_descr;         
        MonoDomain *domain;  /* each object/vtable belongs to exactly one domain */
-       guint       max_interface_id;
+       guint32       max_interface_id;
         gpointer   *interface_offsets;   
         gpointer    data; /* to store static class data */
         gpointer    type; /* System.Type type for klass */
@@ -296,22 +305,27 @@ struct MonoVTable {
  * Generic instantiation data type encoding.
  */
 struct _MonoGenericInst {
+       int id;
+       int type_argc  : 23;
+       int is_open    : 1;
+       MonoType **type_argv;
+};
+
+struct _MonoGenericClass {
+       MonoGenericInst *inst;
+       MonoClass *container_class;
        MonoGenericContext *context;
        MonoClass *klass;
        MonoType *parent;
-       int count_ifaces;
+       guint count_ifaces  : 29;
+       guint initialized   :  1;
+       guint init_pending  :  1;
+       guint is_dynamic    :  1;
        MonoType **ifaces;
-       MonoType *generic_type;
-       MonoDynamicGenericInst *dynamic_info;
-       int type_argc;
-       MonoType **type_argv;
-       guint is_open       : 1;
-       guint initialized   : 1;
-       guint init_pending  : 1;
-       guint is_dynamic    : 1;
 };
 
-struct _MonoDynamicGenericInst {
+struct _MonoDynamicGenericClass {
+       MonoGenericClass generic_class;
        int count_methods;
        MonoMethod **methods;
        int count_ctors;
@@ -325,18 +339,30 @@ struct _MonoDynamicGenericInst {
 };
 
 struct _MonoGenericMethod {
+       MonoGenericInst *inst;
+       MonoGenericContainer *container;
        gpointer reflection_info;
-       int mtype_argc;
-       MonoType **mtype_argv;
-       guint is_open       : 1;
 };
 
 struct _MonoGenericContext {
-       MonoGenericInst *ginst;
+       MonoGenericContainer *container;
+       MonoGenericClass *gclass;
        MonoGenericMethod *gmethod;
 };
 
+struct _MonoGenericContainer {
+       MonoGenericContext context;
+       MonoGenericContainer *parent;
+       GHashTable *method_hash;
+       MonoClass *klass;
+       int type_argc    : 6;
+       int is_method    : 1;
+       int is_signature : 1;
+       MonoGenericParam *type_params;
+};
+
 struct _MonoGenericParam {
+       MonoGenericContainer *owner;
        MonoClass *pklass;
        MonoMethod *method;
        const char *name;
@@ -345,6 +371,13 @@ struct _MonoGenericParam {
        MonoClass** constraints; /* NULL means end of list */
 };
 
+typedef struct {
+       const char *name;
+       gconstpointer func;
+       gconstpointer wrapper;
+       MonoMethodSignature *sig;
+} MonoJitICallInfo;
+
 #define mono_class_has_parent(klass,parent) (((klass)->idepth >= (parent)->idepth) && ((klass)->supertypes [(parent)->idepth - 1] == (parent)))
 
 typedef struct {
@@ -354,14 +387,18 @@ typedef struct {
        gulong class_vtable_size;
        gulong class_static_data_size;
        gulong generic_instance_count;
+       gulong generic_class_count;
        gulong inflated_method_count;
+       gulong inflated_method_count_2;
        gulong inflated_type_count;
        gulong generics_metadata_size;
+       gboolean enabled;
 } MonoStats;
 
 extern MonoStats mono_stats;
 
 typedef gpointer (*MonoTrampoline)       (MonoMethod *method);
+typedef gpointer (*MonoRemotingTrampoline)       (MonoMethod *method, MonoRemotingTarget target);
 
 typedef gpointer (*MonoLookupDynamicToken) (MonoImage *image, guint32 token);
 
@@ -383,6 +420,9 @@ mono_class_setup_parent    (MonoClass *klass, MonoClass *parent);
 void
 mono_class_setup_supertypes (MonoClass *klass);
 
+GPtrArray*
+mono_class_get_implemented_interfaces (MonoClass *klass);
+
 gboolean
 mono_class_is_open_constructed_type (MonoType *t);
 
@@ -396,7 +436,7 @@ void
 mono_install_trampoline (MonoTrampoline func);
 
 void
-mono_install_remoting_trampoline (MonoTrampoline func);
+mono_install_remoting_trampoline (MonoRemotingTrampoline func);
 
 gpointer
 mono_lookup_dynamic_token (MonoImage *image, guint32 token);
@@ -404,6 +444,12 @@ mono_lookup_dynamic_token (MonoImage *image, guint32 token);
 void
 mono_install_lookup_dynamic_token (MonoLookupDynamicToken func);
 
+void
+mono_class_create_generic (MonoGenericClass *gclass);
+
+void
+mono_class_create_generic_2 (MonoGenericClass *gclass);
+
 typedef struct {
        MonoImage *corlib;
        MonoClass *object_class;
@@ -455,6 +501,7 @@ typedef struct {
        MonoClass *marshalbyrefobject_class;
        MonoClass *monitor_class;
        MonoClass *iremotingtypeinfo_class;
+       MonoClass *runtimesecurityframe_class;
 } MonoDefaults;
 
 extern MonoDefaults mono_defaults;
@@ -477,7 +524,29 @@ mono_method_get_wrapper_data (MonoMethod *method, guint32 id);
 void
 mono_install_stack_walk (MonoStackWalkImpl func);
 
-MonoGenericParam *mono_metadata_load_generic_params (MonoImage *image, guint32 token, guint32 *num);
+MonoGenericContainer *mono_metadata_load_generic_params (MonoImage *image, guint32 token,
+                                                        MonoGenericContainer *parent_container);
+
+MonoMethodSignature*
+mono_create_icall_signature (const char *sigstr);
+
+MonoJitICallInfo *
+mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save);
+
+void
+mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper);
+
+MonoJitICallInfo *
+mono_find_jit_icall_by_name (const char *name);
+
+MonoJitICallInfo *
+mono_find_jit_icall_by_addr (gconstpointer addr);
+
+MonoMethodSignature*
+mono_class_inflate_generic_signature (MonoImage *image, MonoMethodSignature *sig, MonoGenericContext *context);
+
+MonoGenericClass *
+mono_get_shared_generic_class (MonoGenericContainer *container, gboolean is_dynamic);
 
 #endif /* __MONO_METADATA_CLASS_INTERBALS_H__ */