New test.
[mono.git] / mono / metadata / class-internals.h
index a8a8c49b6892175cf8ceb1557d470a151f6c1e64..c37b16bc49d3382653489a4a8e0abb8559d7e7ee 100644 (file)
@@ -30,6 +30,7 @@ typedef enum {
        MONO_WRAPPER_RUNTIME_INVOKE,
        MONO_WRAPPER_NATIVE_TO_MANAGED,
        MONO_WRAPPER_MANAGED_TO_NATIVE,
+       MONO_WRAPPER_MANAGED_TO_MANAGED,
        MONO_WRAPPER_REMOTING_INVOKE,
        MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK,
        MONO_WRAPPER_XDOMAIN_INVOKE,
@@ -46,7 +47,10 @@ typedef enum {
        MONO_WRAPPER_STELEMREF,
        MONO_WRAPPER_UNBOX,
        MONO_WRAPPER_LDFLDA,
-       MONO_WRAPPER_UNKNOWN
+       MONO_WRAPPER_WRITE_BARRIER,
+       MONO_WRAPPER_UNKNOWN,
+       MONO_WRAPPER_COMINTEROP_INVOKE,
+       MONO_WRAPPER_COMINTEROP
 } MonoWrapperType;
 
 typedef enum {
@@ -58,7 +62,8 @@ typedef enum {
 
 typedef enum {
        MONO_REMOTING_TARGET_UNKNOWN,
-       MONO_REMOTING_TARGET_APPDOMAIN
+       MONO_REMOTING_TARGET_APPDOMAIN,
+       MONO_REMOTING_TARGET_COMINTEROP
 } MonoRemotingTarget;
 
 struct _MonoMethod {
@@ -78,7 +83,8 @@ struct _MonoMethod {
        unsigned int save_lmf:1;
        unsigned int dynamic:1; /* created & destroyed during runtime */
        unsigned int is_inflated:1; /* whether we're a MonoMethodInflated */
-       signed int slot : 21;
+       unsigned int skip_visibility:1; /* whenever to skip JIT visibility checks */
+       signed int slot : 20;
 };
 
 struct _MonoMethodNormal {
@@ -259,11 +265,16 @@ struct _MonoClass {
        guint delegate        : 1; /* class is a Delegate */
        guint gc_descr_inited : 1; /* gc_descr is initialized */
        guint has_cctor       : 1; /* class has a cctor */
-       guint dummy           : 1; /* temporary hack */
-       /* next byte */
        guint has_references  : 1; /* it has GC-tracked references in the instance */
+       /* next byte */
        guint has_static_refs : 1; /* it has static fields that are GC-tracked */
        guint no_special_static_fields : 1; /* has no thread/context static fields */
+       /* directly or indirectly derives from ComImport attributed class.
+        * this means we need to create a proxy for instances of this class
+        * for COM Interop. set this flag on loading so all we need is a quick check
+        * during object creation rather than having to traverse supertypes
+        */
+       guint is_com_object : 1; 
 
        guint8     exception_type;      /* MONO_EXCEPTION_* */
        void*      exception_data;      /* Additional information about the exception */
@@ -291,8 +302,11 @@ struct _MonoClass {
         * Computed object instance size, total.
         */
        int        instance_size;
-       int        class_size;
        int        vtable_size; /* number of slots */
+       union {
+               int class_size; /* size of area for static fields */
+               int element_size; /* for array types */
+       } sizes;
 
        /*
         * From the TypeDef table
@@ -350,6 +364,7 @@ struct MonoVTable {
        guint8      rank;
        guint remote          : 1; /* class is remotely activated */
        guint initialized     : 1; /* cctor has been run */
+       guint init_failed     : 1; /* cctor execution failed */
        /* do not add any fields after vtable, the structure is dynamically extended */
         gpointer    vtable [MONO_ZERO_LEN_ARRAY];      
 };
@@ -514,14 +529,17 @@ typedef struct {
 typedef enum {
        MONO_LOADER_ERROR_TYPE,
        MONO_LOADER_ERROR_METHOD,
-       MONO_LOADER_ERROR_FIELD
+       MONO_LOADER_ERROR_FIELD,
+       MONO_LOADER_ERROR_ASSEMBLY
 } MonoLoaderErrorKind;
 
 typedef struct {
        MonoLoaderErrorKind kind;
-       char *class_name, *assembly_name; /* If kind == TYPE */
+       char *class_name; /* If kind == TYPE */
+       char *assembly_name; /* If kind == TYPE or ASSEMBLY */
        MonoClass *klass; /* If kind != TYPE */
        const char *member_name; /* If kind != TYPE */
+       gboolean ref_only; /* If kind == ASSEMBLY */
 } MonoLoaderError;
 
 #define mono_class_has_parent(klass,parent) (((klass)->idepth >= (parent)->idepth) && ((klass)->supertypes [(parent)->idepth - 1] == (parent)))
@@ -529,7 +547,9 @@ typedef struct {
 typedef struct {
        gulong new_object_count;
        gulong initialized_class_count;
+       gulong generic_vtable_count;
        gulong used_class_count;
+       gulong method_count;
        gulong class_vtable_size;
        gulong class_static_data_size;
        gulong generic_instance_count;
@@ -551,12 +571,20 @@ typedef gpointer (*MonoLookupDynamicToken) (MonoImage *image, guint32 token, Mon
 
 typedef gboolean (*MonoGetCachedClassInfo) (MonoClass *klass, MonoCachedClassInfo *res);
 
+typedef gboolean (*MonoGetClassFromName) (MonoImage *image, const char *name_space, const char *name, MonoClass **res);
+
 void
 mono_classes_init (void) MONO_INTERNAL;
 
+void
+mono_classes_cleanup (void) MONO_INTERNAL;
+
 void
 mono_class_layout_fields   (MonoClass *klass) MONO_INTERNAL;
 
+void
+mono_class_setup_interface_offsets (MonoClass *klass) MONO_INTERNAL;
+
 void
 mono_class_setup_vtable_general (MonoClass *klass, MonoMethod **overrides, int onum) MONO_INTERNAL;
 
@@ -618,6 +646,9 @@ mono_install_lookup_dynamic_token (MonoLookupDynamicToken func) MONO_INTERNAL;
 void
 mono_install_get_cached_class_info (MonoGetCachedClassInfo func) MONO_INTERNAL;
 
+void
+mono_install_get_class_from_name (MonoGetClassFromName func) MONO_INTERNAL;
+
 MonoInflatedGenericClass*
 mono_get_inflated_generic_class (MonoGenericClass *gclass) MONO_INTERNAL;
 
@@ -653,6 +684,7 @@ typedef struct {
        MonoClass *typehandle_class;
        MonoClass *fieldhandle_class;
        MonoClass *methodhandle_class;
+       MonoClass *systemtype_class;
        MonoClass *monotype_class;
        MonoClass *exception_class;
        MonoClass *threadabortexception_class;
@@ -679,8 +711,11 @@ typedef struct {
        MonoClass *runtimesecurityframe_class;
        MonoClass *executioncontext_class;
        MonoClass *internals_visible_class;
-       MonoClass *generic_array_class;
+       MonoClass *generic_ilist_class;
        MonoClass *generic_nullable_class;
+       MonoClass *variant_class;
+       MonoClass *com_object_class;
+       MonoClass *com_interop_proxy_class;
 } MonoDefaults;
 
 extern MonoDefaults mono_defaults MONO_INTERNAL;
@@ -688,6 +723,9 @@ extern MonoDefaults mono_defaults MONO_INTERNAL;
 void
 mono_loader_init           (void) MONO_INTERNAL;
 
+void
+mono_loader_cleanup        (void) MONO_INTERNAL;
+
 void
 mono_loader_lock           (void) MONO_INTERNAL;
 
@@ -695,15 +733,21 @@ void
 mono_loader_unlock         (void) MONO_INTERNAL;
 
 void
-mono_loader_set_error_type_load (char *class_name, char *assembly_name) MONO_INTERNAL;
+mono_loader_set_error_assembly_load (const char *assembly_name, gboolean ref_only) MONO_INTERNAL;
+
+void
+mono_loader_set_error_type_load (const char *class_name, const char *assembly_name) MONO_INTERNAL;
 
 void
-mono_loader_set_error_method_load (MonoClass *klass, const char *member_name) MONO_INTERNAL;
+mono_loader_set_error_method_load (const char *class_name, const char *member_name) MONO_INTERNAL;
 
 void
 mono_loader_set_error_field_load (MonoClass *klass, const char *member_name) MONO_INTERNAL;
 
-MonoLoaderError*
+MonoException *
+mono_loader_error_prepare_exception (MonoLoaderError *error) MONO_INTERNAL;
+
+MonoLoaderError *
 mono_loader_get_last_error (void) MONO_INTERNAL;
 
 void
@@ -771,8 +815,17 @@ mono_type_get_full_name (MonoClass *class) MONO_INTERNAL;
 MonoArrayType *mono_dup_array_type (MonoArrayType *a) MONO_INTERNAL;
 MonoMethodSignature *mono_metadata_signature_deep_dup (MonoMethodSignature *sig) MONO_INTERNAL;
 
+void
+mono_image_init_name_cache (MonoImage *image);
+
 gboolean mono_class_is_nullable (MonoClass *klass) MONO_INTERNAL;
 MonoClass *mono_class_get_nullable_param (MonoClass *klass) MONO_INTERNAL;
 
+/* object debugging functions, for use inside gdb */
+void mono_object_describe        (MonoObject *obj);
+void mono_object_describe_fields (MonoObject *obj);
+void mono_value_describe_fields  (MonoClass* klass, const char* addr);
+void mono_class_describe_statics (MonoClass* klass);
+
 #endif /* __MONO_METADATA_CLASS_INTERBALS_H__ */