2008-01-18 Rodrigo Kumpera <rkumpera@novell.com>
[mono.git] / mono / metadata / metadata-internals.h
index 22a245884b320d0ac6460bc198db354e2f386717..3eb80f9cf088f993a82ae85e55cbd732622e1512 100644 (file)
@@ -7,13 +7,25 @@
 #include "mono/metadata/mempool.h"
 #include "mono/metadata/domain-internals.h"
 #include "mono/utils/mono-hash.h"
+#include "mono/utils/mono-compiler.h"
+#include "mono/utils/mono-dl.h"
+#include "mono/utils/monobitset.h"
 
 struct _MonoAssembly {
+       /* 
+        * The number of appdomains which have this assembly loaded plus the number of 
+        * assemblies referencing this assembly through an entry in their image->references
+        * arrays. The later is needed because entries in the image->references array
+        * might point to assemblies which are only loaded in some appdomains, and without
+        * the additional reference, they can be freed at any time.
+        * The ref_count is initially 0.
+        */
        int ref_count; /* use atomic operations only */
        char *basedir;
        MonoAssemblyName aname;
-       GModule *aot_module;
+       MonoDl *aot_module;
        MonoImage *image;
+       GSList *friend_assembly_names;
        guint8 in_gac;
        guint8 dynamic;
        guint8 corlib_internal;
@@ -48,24 +60,43 @@ struct _MonoTableInfo {
        guint32   size_bitfield;
 };
 
+#define REFERENCE_MISSING ((gpointer) -1)
+
+typedef struct _MonoDllMap MonoDllMap;
+
 struct _MonoImage {
+       /*
+        * The number of assemblies which reference this MonoImage though their 'image'
+        * field plus the number of images which reference this MonoImage through their 
+        * 'modules' field, plus the number of threads holding temporary references to
+        * this image between calls of mono_image_open () and mono_image_close ().
+        */
        int   ref_count;
-       FILE *file_descr;
-       /* if file_descr is NULL the image was loaded from raw data */
        char *raw_data;
        guint32 raw_data_len;
-       guint8 raw_data_allocated;
+       guint8 raw_buffer_used    : 1;
+       guint8 raw_data_allocated : 1;
 
        /* Whenever this is a dynamically emitted module */
-       guint8 dynamic;
+       guint8 dynamic : 1;
 
        /* Whenever this is a reflection only image */
-       guint8 ref_only;
+       guint8 ref_only : 1;
 
+       /* Whenever this image contains uncompressed metadata */
+       guint8 uncompressed_metadata : 1;
+
+       guint8 checked_module_cctor : 1;
+       guint8 has_module_cctor : 1;
+
+       guint8 idx_string_wide : 1;
+       guint8 idx_guid_wide : 1;
+       guint8 idx_blob_wide : 1;
+                           
        char *name;
        const char *assembly_name;
        const char *module_name;
-       const char *version;
+       char *version;
        gint16 md_version_major, md_version_minor;
        char *guid;
        void *image_info;
@@ -73,8 +104,6 @@ struct _MonoImage {
 
        char                *raw_metadata;
                            
-       guint8               idx_string_wide, idx_guid_wide, idx_blob_wide;
-                           
        MonoStreamHeader     heap_strings;
        MonoStreamHeader     heap_us;
        MonoStreamHeader     heap_blob;
@@ -96,6 +125,7 @@ struct _MonoImage {
 
        MonoImage **modules;
        guint32 module_count;
+       gboolean *modules_loaded;
 
        MonoImage **files;
 
@@ -108,7 +138,7 @@ struct _MonoImage {
         * Indexed by method tokens and typedef tokens.
         */
        GHashTable *method_cache;
-       GHashTable *class_cache;
+       MonoInternalHashTable class_cache;
        /*
         * Indexed by fielddef and memberref tokens
         */
@@ -120,16 +150,19 @@ struct _MonoImage {
        GHashTable *memberref_signatures;
        GHashTable *helper_signatures;
 
+       /* Indexed by blob heap indexes */
+       GHashTable *method_signatures;
+
        /*
         * Indexes namespaces to hash tables that map class name to typedef token.
         */
        GHashTable *name_cache;
 
        /*
-        * Indexed by ((rank << 24) | (typedef & 0xffffff)), which limits us to a
-        * maximal rank of 255
+        * Indexed by MonoClass
         */
        GHashTable *array_cache;
+       GHashTable *ptr_cache;
 
        /*
         * indexed by MonoMethodSignature 
@@ -137,16 +170,42 @@ struct _MonoImage {
        GHashTable *delegate_begin_invoke_cache;
        GHashTable *delegate_end_invoke_cache;
        GHashTable *delegate_invoke_cache;
+       GHashTable *runtime_invoke_cache;
+
+       /*
+        * indexed by SignatureMethodPair
+        */
+       GHashTable *delegate_abstract_invoke_cache;
 
        /*
         * indexed by MonoMethod pointers 
         */
-       GHashTable *runtime_invoke_cache;
+       GHashTable *runtime_invoke_direct_cache;
        GHashTable *managed_wrapper_cache;
        GHashTable *native_wrapper_cache;
        GHashTable *remoting_invoke_cache;
        GHashTable *synchronized_cache;
        GHashTable *unbox_wrapper_cache;
+       GHashTable *cominterop_invoke_cache;
+       GHashTable *cominterop_wrapper_cache;
+
+       /*
+        * indexed by MonoClass pointers
+        */
+       GHashTable *ldfld_wrapper_cache;
+       GHashTable *ldflda_wrapper_cache;
+       GHashTable *ldfld_remote_wrapper_cache;
+       GHashTable *stfld_wrapper_cache;
+       GHashTable *stfld_remote_wrapper_cache;
+       GHashTable *isinst_cache;
+       GHashTable *castclass_cache;
+       GHashTable *proxy_isinst_cache;
+       GHashTable *rgctx_template_hash;
+
+       /*
+        * indexed by token and MonoGenericContext pointer
+        */
+       GHashTable *generic_class_cache;
 
        void *reflection_info;
 
@@ -157,7 +216,10 @@ struct _MonoImage {
        void *user_info;
 
        /* dll map entries */
-       GHashTable *dll_map;
+       MonoDllMap *dll_map;
+
+       /* interfaces IDs from this image */
+       MonoBitSet *interface_bitset;
 };
 
 enum {
@@ -228,6 +290,8 @@ struct _MonoDynamicImage {
        guint32 strong_name_size;
        char *win32_res;
        guint32 win32_res_size;
+       guint8 *public_key;
+       int public_key_len;
        MonoDynamicStream sheap;
        MonoDynamicStream code; /* used to store method headers and bytecode */
        MonoDynamicStream resources; /* managed embedded resources */
@@ -254,42 +318,58 @@ typedef struct _MonoAssemblyBindingInfo {
        guint is_valid : 1;
 } MonoAssemblyBindingInfo;
 
+struct _MonoMethodHeader {
+       guint32      code_size;
+       const unsigned char  *code;
+       guint16      max_stack;
+       unsigned int num_clauses : 15;
+       /* if num_locals != 0, then the following apply: */
+       unsigned int init_locals : 1;
+       guint16      num_locals;
+       MonoExceptionClause *clauses;
+       MonoType    *locals [MONO_ZERO_LEN_ARRAY];
+};
+
 /* for use with allocated memory blocks (assumes alignment is to 8 bytes) */
-guint mono_aligned_addr_hash (gconstpointer ptr);
+guint mono_aligned_addr_hash (gconstpointer ptr) MONO_INTERNAL;
+
+void
+mono_image_check_for_module_cctor (MonoImage *image) MONO_INTERNAL;
+
+void
+mono_metadata_clean_for_image (MonoImage *image) MONO_INTERNAL;
+
+void
+mono_metadata_cleanup (void);
 
-const char *   mono_meta_table_name              (int table);
-void           mono_metadata_compute_table_bases (MonoImage *meta);
+const char *   mono_meta_table_name              (int table) MONO_INTERNAL;
+void           mono_metadata_compute_table_bases (MonoImage *meta) MONO_INTERNAL;
 
 gboolean
 mono_metadata_interfaces_from_typedef_full  (MonoImage             *image,
                                                                                         guint32                table_index,
                                                                                         MonoClass           ***interfaces,
                                                                                         guint                 *count,
-                                                                                        MonoGenericContext    *context);
+                                                                                        MonoGenericContext    *context) MONO_INTERNAL;
 
 MonoArrayType *
 mono_metadata_parse_array_full              (MonoImage             *image,
-                                            MonoGenericContext    *generic_context,
+                                            MonoGenericContainer  *container,
                                             const char            *ptr,
-                                            const char           **rptr);
+                                            const char           **rptr) MONO_INTERNAL;
 
 MonoType *
 mono_metadata_parse_type_full               (MonoImage             *image,
-                                            MonoGenericContext    *generic_context,
+                                            MonoGenericContainer  *container,
                                             MonoParseTypeMode      mode,
                                             short                  opt_attrs,
                                             const char            *ptr,
                                             const char           **rptr);
 
-MonoType *
-mono_type_create_from_typespec_full         (MonoImage             *image,
-                                            MonoGenericContext    *generic_context,
-                                            guint32                type_spec);
-
 MonoMethodSignature *
 mono_metadata_parse_signature_full          (MonoImage             *image,
                                             MonoGenericContainer  *generic_container,
-                                            guint32                token);
+                                            guint32                token) MONO_INTERNAL;
 
 MonoMethodSignature *
 mono_metadata_parse_method_signature_full   (MonoImage             *image,
@@ -300,43 +380,66 @@ mono_metadata_parse_method_signature_full   (MonoImage             *image,
 
 MonoMethodHeader *
 mono_metadata_parse_mh_full                 (MonoImage             *image,
-                                            MonoGenericContext    *generic_context,
+                                            MonoGenericContainer  *container,
                                             const char            *ptr);
 
+int* mono_metadata_get_param_attrs          (MonoImage *m, int def);
+
 guint
-mono_metadata_generic_method_hash           (MonoGenericMethod     *gmethod);
+mono_metadata_generic_context_hash          (const MonoGenericContext *context) MONO_INTERNAL;
 
 gboolean
-mono_metadata_generic_method_equal          (MonoGenericMethod     *g1,
-                                            MonoGenericMethod     *g2);
+mono_metadata_generic_context_equal         (const MonoGenericContext *g1,
+                                            const MonoGenericContext *g2) MONO_INTERNAL;
 
 MonoGenericInst *
 mono_metadata_parse_generic_inst            (MonoImage             *image,
-                                            MonoGenericContext    *generic_context,
+                                            MonoGenericContainer  *container,
                                             int                    count,
                                             const char            *ptr,
-                                            const char           **rptr);
+                                            const char           **rptr) MONO_INTERNAL;
 
 MonoGenericInst *
-mono_metadata_lookup_generic_inst           (MonoGenericInst       *ginst);
+mono_metadata_get_generic_inst              (int                   type_argc,
+                                            MonoType             **type_argv) MONO_INTERNAL;
 
 MonoGenericClass *
-mono_metadata_lookup_generic_class          (MonoGenericClass      *gclass);
+mono_metadata_lookup_generic_class          (MonoClass            *gclass,
+                                            MonoGenericInst       *inst,
+                                            gboolean               is_dynamic) MONO_INTERNAL;
 
 MonoGenericInst *
 mono_metadata_inflate_generic_inst          (MonoGenericInst       *ginst,
-                                            MonoGenericContext    *context);
+                                            MonoGenericContext    *context) MONO_INTERNAL;
 
-void mono_dynamic_stream_reset (MonoDynamicStream* stream);
-void mono_assembly_addref      (MonoAssembly *assembly);
+void mono_dynamic_stream_reset  (MonoDynamicStream* stream) MONO_INTERNAL;
+void mono_assembly_addref       (MonoAssembly *assembly) MONO_INTERNAL;
+void mono_assembly_load_friends (MonoAssembly* ass);
 
-void mono_config_parse_publisher_policy (const char *filename, MonoAssemblyBindingInfo *binding_info);
+void mono_config_parse_publisher_policy (const char *filename, MonoAssemblyBindingInfo *binding_info) MONO_INTERNAL;
 
 gboolean
 mono_assembly_name_parse_full               (const char           *name,
                                              MonoAssemblyName     *aname,
                                              gboolean save_public_key,
-                                             gboolean *is_version_defined);
+                                             gboolean *is_version_defined) MONO_INTERNAL;
+
+guint32 mono_metadata_get_generic_param_row (MonoImage *image, guint32 token, guint32 *owner);
+
+void mono_unload_interface_ids (MonoBitSet *bitset) MONO_INTERNAL;
+
+
+MonoType *mono_metadata_type_dup (MonoMemPool *mp, const MonoType *original) MONO_INTERNAL;
+
+MonoGenericInst *
+mono_get_shared_generic_inst (MonoGenericContainer *container) MONO_INTERNAL;
+
+int
+mono_type_stack_size_internal (MonoType *t, int *align, gboolean allow_open) MONO_INTERNAL;
+
+gboolean
+mono_metadata_type_equal_full (MonoType *t1, MonoType *t2, gboolean signature_only) MONO_INTERNAL;
+
 
 #endif /* __MONO_METADATA_INTERNALS_H__ */