Merge pull request #5415 from kumpera/wasm-support
[mono.git] / mono / metadata / class-internals.h
index 74af882ca4394ab598dffc2eb052d15a7326877c..67f360e975e3bd44ed0f3f8213170d341c133904 100644 (file)
@@ -1,4 +1,5 @@
-/* 
+/**
+ * \file
  * Copyright 2012 Xamarin Inc
  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
@@ -9,7 +10,7 @@
 #include <mono/metadata/object.h>
 #include <mono/metadata/mempool.h>
 #include <mono/metadata/metadata-internals.h>
-#include <mono/io-layer/io-layer.h>
+#include <mono/metadata/property-bag.h>
 #include "mono/utils/mono-compiler.h"
 #include "mono/utils/mono-error.h"
 #include "mono/sgen/gc-internal-agnostic.h"
@@ -36,8 +37,10 @@ typedef struct _MonoMethodPInvoke MonoMethodPInvoke;
 
 #ifdef ENABLE_ICALL_EXPORT
 #pragma GCC diagnostic ignored "-Wmissing-prototypes"
+#define ICALL_DECL_EXPORT MONO_API
 #define ICALL_EXPORT MONO_API
 #else
+#define ICALL_DECL_EXPORT
 #define ICALL_EXPORT static
 #endif
 
@@ -164,6 +167,8 @@ typedef struct {
 } MonoMarshalField;
 
 typedef struct {
+       MonoPropertyBagItem head;
+
        guint32 native_size, min_align;
        guint32 num_fields;
        MonoMethod *ptr_to_str;
@@ -224,37 +229,21 @@ typedef struct {
 
 #define MONO_SIZEOF_CLASS_RUNTIME_INFO (sizeof (MonoClassRuntimeInfo) - MONO_ZERO_LEN_ARRAY * SIZEOF_VOID_P)
 
-#define MONO_CLASS_PROP_EXCEPTION_DATA 0
-
-/* 
- * This structure contains the rarely used fields of MonoClass
- * Since using just one field causes the whole structure to be allocated, it should
- * be used for fields which are only used in like 5% of all classes.
- */
 typedef struct {
-       struct {
-#if MONO_SMALL_CONFIG
-               guint16 first, count;
-#else
-               guint32 first, count;
-#endif
-       } property, event;
+       MonoPropertyBagItem head;
 
-       /* Initialized by a call to mono_class_setup_properties () */
        MonoProperty *properties;
+       guint32 first, count;
+       MonoFieldDefaultValue *def_values;
+} MonoClassPropertyInfo;
+
+typedef struct {
+       MonoPropertyBagItem head;
 
        /* Initialized by a call to mono_class_setup_events () */
        MonoEvent *events;
-
-       guint32    declsec_flags;       /* declarative security attributes flags */
-
-       /* Default values/RVA for fields and properties */
-       /* Accessed using mono_class_get_field_default_value () / mono_field_get_data () */
-       MonoFieldDefaultValue *field_def_values;
-       MonoFieldDefaultValue *prop_def_values;
-
-       GList      *nested_classes;
-} MonoClassExt;
+       guint32 first, count;
+} MonoClassEventInfo;
 
 typedef enum {
        MONO_CLASS_DEF = 1, /* non-generic type */
@@ -290,13 +279,16 @@ struct _MonoClass {
         * to 1, because we know the instance size now. After that we 
         * initialise all static fields.
         */
-       /* size_inited is accessed without locks, so it needs a memory barrier */
+
+       /* ALL BITFIELDS SHOULD BE WRITTEN WHILE HOLDING THE LOADER LOCK */
        guint size_inited     : 1;
        guint valuetype       : 1; /* derives from System.ValueType */
        guint enumtype        : 1; /* derives from System.Enum */
        guint blittable       : 1; /* class is blittable */
        guint unicode         : 1; /* class uses unicode char when marshalled */
        guint wastypebuilder  : 1; /* class was created at runtime from a TypeBuilder */
+       guint is_array_special_interface : 1; /* gtd or ginst of once of the magic interfaces that arrays implement */
+
        /* next byte */
        guint8 min_align;
 
@@ -329,7 +321,7 @@ struct _MonoClass {
        guint simd_type : 1; /* class is a simd intrinsic type */
        guint has_finalize_inited    : 1; /* has_finalize is initialized */
        guint fields_inited : 1; /* setup_fields () has finished */
-       guint has_failure : 1; /* See MONO_CLASS_PROP_EXCEPTION_DATA for a MonoErrorBoxed with the details */
+       guint has_failure : 1; /* See mono_class_get_exception_data () for a MonoErrorBoxed with the details */
 
        MonoClass  *parent;
        MonoClass  *nested_in;
@@ -342,8 +334,8 @@ struct _MonoClass {
        int        vtable_size; /* number of slots */
 
        guint16     interface_count;
-       guint16     interface_id;        /* unique inderface id (for interfaces) */
-       guint16     max_interface_id;
+       guint32     interface_id;        /* unique inderface id (for interfaces) */
+       guint32     max_interface_id;
        
        guint16     interface_offsets_count;
        MonoClass **interfaces_packed;
@@ -362,24 +354,6 @@ struct _MonoClass {
                int generic_param_token; /* for generic param types, both var and mvar */
        } sizes;
 
-       /*
-        * From the TypeDef table
-        */
-       guint32    flags;
-       struct {
-#if MONO_SMALL_CONFIG
-               guint16 first, count;
-#else
-               guint32 first, count;
-#endif
-       } field, method;
-
-       /* A GC handle pointing to the corresponding type builder/generic param builder */
-       guint32 ref_info_handle;
-
-       /* loaded on demand */
-       MonoMarshalType *marshal_info;
-
        /*
         * Field information: Type and location from object base
         */
@@ -391,28 +365,36 @@ struct _MonoClass {
        MonoType this_arg;
        MonoType byval_arg;
 
-       MonoGenericContainer *generic_container;
-
        MonoGCDescriptor gc_descr;
 
        MonoClassRuntimeInfo *runtime_info;
 
-       /* next element in the class_cache hash list (in MonoImage) */
-       MonoClass *next_class_cache;
-
        /* Generic vtable. Initialized by a call to mono_class_setup_vtable () */
        MonoMethod **vtable;
 
-       /* Rarely used fields of classes */
-       MonoClassExt *ext;
+       /* Infrequently used items. See class-accessors.c: InfrequentDataKind for what goes into here. */
+       MonoPropertyBag infrequent_data;
 };
 
 typedef struct {
        MonoClass class;
+       guint32 flags;
+       /*
+        * From the TypeDef table
+        */
+       guint32 first_method_idx;
+       guint32 first_field_idx;
+       guint32 method_count, field_count;
+       /* next element in the class_cache hash list (in MonoImage) */
+       MonoClass *next_class_cache;
 } MonoClassDef;
 
 typedef struct {
-       MonoClass class;
+       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 {
@@ -426,6 +408,7 @@ typedef struct {
 
 typedef struct {
        MonoClass class;
+       guint32 method_count;
 } MonoClassArray;
 
 typedef struct {
@@ -457,10 +440,8 @@ int mono_class_interface_match (const uint8_t *bitmap, int id);
 
 #ifdef DISABLE_COM
 #define mono_class_is_com_object(klass) (FALSE)
-#define mono_class_set_is_com_object(klass) do {} while (0)
 #else
 #define mono_class_is_com_object(klass) ((klass)->is_com_object)
-#define mono_class_set_is_com_object(klass) do { (klass)->is_com_object = 1; } while (0)
 #endif
 
 
@@ -480,10 +461,11 @@ struct MonoVTable {
        MonoDomain *domain;  /* each object/vtable belongs to exactly one domain */
         gpointer    type; /* System.Type type for klass */
        guint8     *interface_bitmap;
-       guint16     max_interface_id;
+       guint32     max_interface_id;
        guint8      rank;
+       /* Keep this a guint8, the jit depends on it */
+       guint8      initialized; /* cctor has been run */
        guint remote          : 1; /* class is remotely activated */
-       guint initialized     : 1; /* cctor has been run */
        guint init_failed     : 1; /* cctor execution failed */
        guint has_static_fields : 1; /* pointer to the data stored at the end of the vtable array */
        guint gc_bits         : MONO_VTABLE_AVAILABLE_GC_BITS; /* Those bits are reserved for the usaged of the GC */
@@ -512,7 +494,7 @@ struct MonoVTable {
  */
 struct _MonoGenericInst {
 #ifndef MONO_SMALL_CONFIG
-       guint id;                       /* unique ID for debugging */
+       gint32 id;                      /* unique ID for debugging */
 #endif
        guint type_argc    : 22;        /* number of type arguments */
        guint is_open      :  1;        /* if this is an open type */
@@ -774,39 +756,31 @@ typedef struct {
 #define MONO_SIZEOF_REMOTE_CLASS (sizeof (MonoRemoteClass) - MONO_ZERO_LEN_ARRAY * SIZEOF_VOID_P)
 
 typedef struct {
-       guint64 new_object_count;
-       size_t initialized_class_count;
-       size_t generic_vtable_count;
-       size_t used_class_count;
-       size_t method_count;
-       size_t class_vtable_size;
-       size_t class_static_data_size;
-       size_t generic_instance_count;
-       size_t generic_class_count;
-       size_t inflated_method_count;
-       size_t inflated_method_count_2;
-       size_t inflated_type_count;
-       size_t generics_metadata_size;
-       size_t delegate_creations;
-       size_t imt_tables_size;
-       size_t imt_number_of_tables;
-       size_t imt_number_of_methods;
-       size_t imt_used_slots;
-       size_t imt_slots_with_collisions;
-       size_t imt_max_collisions_in_slot;
-       size_t imt_method_count_when_max_collisions;
-       size_t imt_trampolines_size;
-       size_t jit_info_table_insert_count;
-       size_t jit_info_table_remove_count;
-       size_t jit_info_table_lookup_count;
-       size_t generics_sharable_methods;
-       size_t generics_unsharable_methods;
-       size_t generics_shared_methods;
-       size_t gsharedvt_methods;
-       size_t minor_gc_count;
-       size_t major_gc_count;
-       size_t minor_gc_time_usecs;
-       size_t major_gc_time_usecs;
+       gint32 initialized_class_count;
+       gint32 generic_vtable_count;
+       gint32 used_class_count;
+       gint32 method_count;
+       gint32 class_vtable_size;
+       gint32 class_static_data_size;
+       gint32 generic_class_count;
+       gint32 inflated_method_count;
+       gint32 inflated_type_count;
+       gint32 delegate_creations;
+       gint32 imt_tables_size;
+       gint32 imt_number_of_tables;
+       gint32 imt_number_of_methods;
+       gint32 imt_used_slots;
+       gint32 imt_slots_with_collisions;
+       gint32 imt_max_collisions_in_slot;
+       gint32 imt_method_count_when_max_collisions;
+       gint32 imt_trampolines_size;
+       gint32 jit_info_table_insert_count;
+       gint32 jit_info_table_remove_count;
+       gint32 jit_info_table_lookup_count;
+       gint32 generics_sharable_methods;
+       gint32 generics_unsharable_methods;
+       gint32 generics_shared_methods;
+       gint32 gsharedvt_methods;
        gboolean enabled;
 } MonoStats;
 
@@ -916,9 +890,6 @@ typedef struct {
 
 extern MonoStats mono_stats;
 
-typedef gpointer (*MonoRemotingTrampoline)       (MonoDomain *domain, MonoMethod *method, MonoRemotingTarget target, MonoError *error);
-typedef gpointer (*MonoDelegateTrampoline)       (MonoDomain *domain, MonoClass *klass);
-
 typedef gboolean (*MonoGetCachedClassInfo) (MonoClass *klass, MonoCachedClassInfo *res);
 
 typedef gboolean (*MonoGetClassFromName) (MonoImage *image, const char *name_space, const char *name, MonoClass **res);
@@ -983,7 +954,7 @@ mono_class_get_overrides_full (MonoImage *image, guint32 type_token, MonoMethod
                               MonoGenericContext *generic_context);
 
 MonoMethod*
-mono_class_get_cctor (MonoClass *klass);
+mono_class_get_cctor (MonoClass *klass) MONO_LLVM_INTERNAL;
 
 MonoMethod*
 mono_class_get_finalizer (MonoClass *klass);
@@ -1006,9 +977,6 @@ mono_class_get_field_default_value (MonoClassField *field, MonoTypeEnum *def_typ
 const char*
 mono_class_get_property_default_value (MonoProperty *property, MonoTypeEnum *def_type);
 
-void
-mono_install_delegate_trampoline (MonoDelegateTrampoline func);
-
 gpointer
 mono_lookup_dynamic_token (MonoImage *image, guint32 token, MonoGenericContext *context, MonoError *error);
 
@@ -1027,16 +995,16 @@ mono_install_get_cached_class_info (MonoGetCachedClassInfo func);
 void
 mono_install_get_class_from_name (MonoGetClassFromName func);
 
-MonoGenericContext*
+MONO_PROFILER_API MonoGenericContext*
 mono_class_get_context (MonoClass *klass);
 
-MonoMethodSignature*
+MONO_PROFILER_API MonoMethodSignature*
 mono_method_signature_checked (MonoMethod *m, MonoError *err);
 
 MonoGenericContext*
 mono_method_get_context_general (MonoMethod *method, gboolean uninflated);
 
-MonoGenericContext*
+MONO_PROFILER_API MonoGenericContext*
 mono_method_get_context (MonoMethod *method);
 
 /* Used by monodis, thus cannot be MONO_INTERNAL */
@@ -1145,19 +1113,13 @@ typedef struct {
 #ifdef DISABLE_REMOTING
 #define mono_class_is_transparent_proxy(klass) (FALSE)
 #define mono_class_is_real_proxy(klass) (FALSE)
-#define mono_object_is_transparent_proxy(object) (FALSE)
 #else
-MonoRemoteClass*
-mono_remote_class (MonoDomain *domain, MonoString *class_name, MonoClass *proxy_class, MonoError *error);
-
-void
-mono_install_remoting_trampoline (MonoRemotingTrampoline func);
-
 #define mono_class_is_transparent_proxy(klass) ((klass) == mono_defaults.transparent_proxy_class)
 #define mono_class_is_real_proxy(klass) ((klass) == mono_defaults.real_proxy_class)
-#define mono_object_is_transparent_proxy(object) (((MonoObject*)object)->vtable->klass == mono_defaults.transparent_proxy_class)
 #endif
 
+#define mono_object_is_transparent_proxy(object) (mono_class_is_transparent_proxy (mono_object_class (object)))
+
 
 #define GENERATE_GET_CLASS_WITH_CACHE_DECL(shortname) \
 MonoClass* mono_class_get_##shortname##_class (void);
@@ -1165,21 +1127,21 @@ MonoClass* mono_class_get_##shortname##_class (void);
 #define GENERATE_TRY_GET_CLASS_WITH_CACHE_DECL(shortname) \
 MonoClass* mono_class_try_get_##shortname##_class (void);
 
-#define GENERATE_GET_CLASS_WITH_CACHE(shortname,namespace,name) \
+#define GENERATE_GET_CLASS_WITH_CACHE(shortname,name_space,name) \
 MonoClass*     \
 mono_class_get_##shortname##_class (void)      \
 {      \
        static MonoClass *tmp_class;    \
        MonoClass *klass = tmp_class;   \
        if (!klass) {   \
-               klass = mono_class_load_from_name (mono_defaults.corlib, #namespace, #name);    \
+               klass = mono_class_load_from_name (mono_defaults.corlib, name_space, name);     \
                mono_memory_barrier (); \
                tmp_class = klass;      \
        }       \
        return klass;   \
 }
 
-#define GENERATE_TRY_GET_CLASS_WITH_CACHE(shortname,namespace,name) \
+#define GENERATE_TRY_GET_CLASS_WITH_CACHE(shortname,name_space,name) \
 MonoClass*     \
 mono_class_try_get_##shortname##_class (void)  \
 {      \
@@ -1188,7 +1150,7 @@ mono_class_try_get_##shortname##_class (void)     \
        MonoClass *klass = (MonoClass *)tmp_class;      \
        mono_memory_barrier (); \
        if (!inited) {  \
-               klass = mono_class_try_load_from_name (mono_defaults.corlib, #namespace, #name);        \
+               klass = mono_class_try_load_from_name (mono_defaults.corlib, name_space, name); \
                tmp_class = klass;      \
                mono_memory_barrier (); \
                inited = TRUE;  \
@@ -1317,7 +1279,7 @@ MONO_API void mono_class_describe_statics (MonoClass* klass);
 /* method debugging functions, for use inside gdb */
 MONO_API void mono_method_print_code (MonoMethod *method);
 
-char *mono_signature_full_name (MonoMethodSignature *sig);
+MONO_PROFILER_API char *mono_signature_full_name (MonoMethodSignature *sig);
 
 /*Enum validation related functions*/
 MONO_API gboolean
@@ -1326,6 +1288,9 @@ mono_type_is_valid_enum_basetype (MonoType * type);
 MONO_API gboolean
 mono_class_is_valid_enum (MonoClass *klass);
 
+MONO_PROFILER_API gboolean
+mono_type_is_primitive (MonoType *type);
+
 MonoType *
 mono_type_get_checked        (MonoImage *image, guint32 type_token, MonoGenericContext *context, MonoError *error);
 
@@ -1359,6 +1324,9 @@ mono_method_get_vtable_slot (MonoMethod *method);
 int
 mono_method_get_vtable_index (MonoMethod *method);
 
+MonoMethod*
+mono_method_get_base_method (MonoMethod *method, gboolean definition, MonoError *error);
+
 MonoMethod*
 mono_method_search_in_array_class (MonoClass *klass, const char *name, MonoMethodSignature *sig);
 
@@ -1374,9 +1342,6 @@ mono_class_alloc (MonoClass *klass, int size);
 gpointer
 mono_class_alloc0 (MonoClass *klass, int size);
 
-void
-mono_class_alloc_ext (MonoClass *klass);
-
 void
 mono_class_setup_interfaces (MonoClass *klass, MonoError *error);
 
@@ -1467,6 +1432,92 @@ mono_class_get_generic_class (MonoClass *klass);
 MonoGenericClass*
 mono_class_try_get_generic_class (MonoClass *klass);
 
+void
+mono_class_set_flags (MonoClass *klass, guint32 flags);
+
+MonoGenericContainer*
+mono_class_try_get_generic_container (MonoClass *klass);
+
+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);
+
+void
+mono_class_set_first_method_idx (MonoClass *klass, guint32 idx);
+
+guint32
+mono_class_get_first_field_idx (MonoClass *klass);
+
+void
+mono_class_set_first_field_idx (MonoClass *klass, guint32 idx);
+
+guint32
+mono_class_get_method_count (MonoClass *klass);
+
+void
+mono_class_set_method_count (MonoClass *klass, guint32 count);
+
+guint32
+mono_class_get_field_count (MonoClass *klass);
+
+void
+mono_class_set_field_count (MonoClass *klass, guint32 count);
+
+MonoMarshalType*
+mono_class_get_marshal_info (MonoClass *class);
+
+void
+mono_class_set_marshal_info (MonoClass *class, MonoMarshalType *marshal_info);
+
+guint32
+mono_class_get_ref_info_handle (MonoClass *class);
+
+guint32
+mono_class_set_ref_info_handle (MonoClass *class, guint32 value);
+
+MonoErrorBoxed*
+mono_class_get_exception_data (MonoClass *klass);
+
+void
+mono_class_set_exception_data (MonoClass *klass, MonoErrorBoxed *value);
+
+GList*
+mono_class_get_nested_classes_property (MonoClass *klass);
+
+void
+mono_class_set_nested_classes_property (MonoClass *klass, GList *value);
+
+MonoClassPropertyInfo*
+mono_class_get_property_info (MonoClass *klass);
+
+void
+mono_class_set_property_info (MonoClass *klass, MonoClassPropertyInfo *info);
+
+MonoClassEventInfo*
+mono_class_get_event_info (MonoClass *klass);
+
+void
+mono_class_set_event_info (MonoClass *klass, MonoClassEventInfo *info);
+
+MonoFieldDefaultValue*
+mono_class_get_field_def_values (MonoClass *klass);
+
+void
+mono_class_set_field_def_values (MonoClass *klass, MonoFieldDefaultValue *values);
+
+guint32
+mono_class_get_declsec_flags (MonoClass *class);
+
+void
+mono_class_set_declsec_flags (MonoClass *class, guint32 value);
+
+void
+mono_class_set_is_com_object (MonoClass *klass);
 
 /*Now that everything has been defined, let's include the inline functions */
 #include <mono/metadata/class-inlines.h>