2007-09-11 Mark Probst <mark.probst@gmail.com>
[mono.git] / mono / metadata / object-internals.h
index 3b5a440c388da33423fc23476d7e984745c7634b..e62d3883c2ed4e411e85503684651abebdba7756 100644 (file)
@@ -5,6 +5,7 @@
 #include <mono/metadata/reflection.h>
 #include <mono/metadata/mempool.h>
 #include <mono/io-layer/io-layer.h>
+#include "mono/utils/mono-compiler.h"
 
 #if 1
 #ifdef __GNUC__
@@ -128,6 +129,7 @@ struct _MonoException {
        gint32      remote_stack_index;
        gint32      hresult;
        MonoString *source;
+       MonoObject *_data;
 };
 
 typedef struct {
@@ -186,8 +188,23 @@ typedef struct {
        MonoObject *unwrapped_server;
        gint32      target_domain_id;
        MonoString *target_uri;
+       MonoObject *object_identity;
+       MonoObject *obj_TP;
+       MonoObject *stub_data;
 } MonoRealProxy;
 
+typedef struct {
+       MonoMarshalByRefObject object;
+       gpointer iunknown;
+       GHashTable* itf_hash;
+} MonoComObject;
+
+typedef struct {
+       MonoRealProxy real_proxy;
+       MonoComObject *com_object;
+       gint32 ref_count;
+} MonoComInteropProxy;
+
 typedef struct {
        MonoObject       object;
        MonoRealProxy   *rp;    
@@ -257,9 +274,11 @@ struct _MonoThread {
         */
        MonoBoolean thread_dump_requested;
        gpointer end_stack; /* This is only used when running in the debugger. */
-       gpointer unused3;
-       gpointer unused4;
-       gpointer unused5;
+       MonoBoolean thread_interrupt_requested;
+       guint8  apartment_state;
+       gssize small_id;    /* A small, unique id, used for the hazard
+                              pointer table.  Should be changed to a
+                              guint32 at the next corlib version bump. */
        gpointer unused6;
        gpointer unused7;
 };
@@ -303,6 +322,9 @@ typedef struct {
        MonoArray *LongDatePatterns;
        MonoArray *ShortTimePatterns;
        MonoArray *LongTimePatterns;
+       MonoArray *MonthDayPatterns;
+       MonoArray *YearMonthPatterns;
+       MonoArray *shortDayNames;
 } MonoDateTimeFormatInfo;
 
 typedef struct 
@@ -368,6 +390,7 @@ typedef struct {
        MonoString *iso2lang;
        MonoString *icu_name;
        MonoString *win3lang;
+       MonoString *territory;
        MonoCompareInfo *compareinfo;
        const gint32 *calendar_data;
        const void* text_info_data;
@@ -408,71 +431,77 @@ typedef gboolean    (*MonoInitVTableFunc)    (MonoVTable *vtable);
 
 MonoAsyncResult *
 mono_async_result_new      (MonoDomain *domain, HANDLE handle, 
-                            MonoObject *state, gpointer data, MonoObject *object_data);
+                            MonoObject *state, gpointer data, MonoObject *object_data) MONO_INTERNAL;
 
 MonoWaitHandle *
-mono_wait_handle_new       (MonoDomain *domain, HANDLE handle);
+mono_wait_handle_new       (MonoDomain *domain, HANDLE handle) MONO_INTERNAL;
+
+HANDLE
+mono_wait_handle_get_handle (MonoWaitHandle *handle) MONO_INTERNAL;
 
 void
 mono_message_init          (MonoDomain *domain, MonoMethodMessage *this_obj, 
-                            MonoReflectionMethod *method, MonoArray *out_args);
+                            MonoReflectionMethod *method, MonoArray *out_args) MONO_INTERNAL;
 
 MonoObject *
 mono_remoting_invoke       (MonoObject *real_proxy, MonoMethodMessage *msg, 
-                            MonoObject **exc, MonoArray **out_args);
+                            MonoObject **exc, MonoArray **out_args) MONO_INTERNAL;
 
 MonoObject *
 mono_message_invoke        (MonoObject *target, MonoMethodMessage *msg, 
-                            MonoObject **exc, MonoArray **out_args);
+                            MonoObject **exc, MonoArray **out_args) MONO_INTERNAL;
 
 MonoMethodMessage *
 mono_method_call_message_new (MonoMethod *method, gpointer *params, MonoMethod *invoke, 
-                             MonoDelegate **cb, MonoObject **state);
+                             MonoDelegate **cb, MonoObject **state) MONO_INTERNAL;
 
 void
-mono_method_return_message_restore (MonoMethod *method, gpointer *params, MonoArray *out_args);
+mono_method_return_message_restore (MonoMethod *method, gpointer *params, MonoArray *out_args) MONO_INTERNAL;
 
 void
-mono_delegate_ctor         (MonoObject *this_obj, MonoObject *target, gpointer addr);
+mono_delegate_ctor         (MonoObject *this_obj, MonoObject *target, gpointer addr) MONO_INTERNAL;
 
 void*
-mono_class_get_allocation_ftn (MonoVTable *vtable, gboolean for_box, gboolean *pass_size_in_words);
+mono_class_get_allocation_ftn (MonoVTable *vtable, gboolean for_box, gboolean *pass_size_in_words) MONO_INTERNAL;
 
 void
-mono_runtime_free_method    (MonoDomain *domain, MonoMethod *method);
+mono_runtime_free_method    (MonoDomain *domain, MonoMethod *method) MONO_INTERNAL;
 
 /* runtime initialization functions */
 typedef void (*MonoExceptionFunc) (MonoException *ex);
 
 void
-mono_install_handler       (MonoExceptionFunc func);
+mono_install_handler       (MonoExceptionFunc func) MONO_INTERNAL;
 
 void       
-mono_install_runtime_invoke (MonoInvokeFunc func);
+mono_install_runtime_invoke (MonoInvokeFunc func) MONO_INTERNAL;
 
 void       
-mono_install_compile_method (MonoCompileFunc func);
+mono_install_compile_method (MonoCompileFunc func) MONO_INTERNAL;
+
+void
+mono_install_free_method    (MonoFreeMethodFunc func) MONO_INTERNAL;
 
 void
-mono_install_free_method    (MonoFreeMethodFunc func);
+mono_install_init_vtable    (MonoInitVTableFunc func) MONO_INTERNAL;
 
 void
-mono_install_init_vtable    (MonoInitVTableFunc func);
+mono_type_initialization_init (void) MONO_INTERNAL;
 
 void
-mono_type_initialization_init (void);
+mono_type_initialization_cleanup (void) MONO_INTERNAL;
 
 guint32
-mono_thread_get_tls_key    (void);
+mono_thread_get_tls_key    (void) MONO_INTERNAL;
 
 gint32
-mono_thread_get_tls_offset (void);
+mono_thread_get_tls_offset (void) MONO_INTERNAL;
 
 guint32
-mono_domain_get_tls_key    (void);
+mono_domain_get_tls_key    (void) MONO_INTERNAL;
 
 gint32
-mono_domain_get_tls_offset (void);
+mono_domain_get_tls_offset (void) MONO_INTERNAL;
 
 /* Reflection and Reflection.Emit support */
 
@@ -494,12 +523,14 @@ struct _MonoReflectionGenericMethod {
 
 struct _MonoDelegate {
        MonoObject object;
-       MonoObject *target_type;
+       gpointer method_ptr;
+       gpointer invoke_impl;
        MonoObject *target;
+       MonoObject *target_type;
        MonoString *method_name;
-       gpointer method_ptr;
        gpointer delegate_trampoline;
        MonoReflectionMethod *method_info;
+       MonoReflectionMethod *original_method_info;
 };
 
 typedef struct _MonoMulticastDelegate MonoMulticastDelegate;
@@ -965,6 +996,11 @@ typedef struct {
        MonoBoolean throw_on_unmappable;
 } MonoReflectionUnmanagedFunctionPointerAttribute;
 
+typedef struct {
+       MonoObject object;
+       MonoString *guid;
+} MonoReflectionGuidAttribute;
+
 typedef struct {
        MonoObject object;
        MonoMethod *mhandle;
@@ -979,6 +1015,7 @@ typedef struct {
        MonoReflectionILGen *ilgen;
        gint32 nrefs;
        MonoArray *refs;
+       GSList *referenced_by;
 } MonoReflectionDynamicMethod; 
 
 typedef struct {
@@ -1018,88 +1055,117 @@ typedef enum {
        GENERIC_PARAMETER_ATTRIBUTE_SPECIAL_CONSTRAINTS_MASK    = 28
 } GenericParameterAttributes;
 
-void          mono_image_create_pefile (MonoReflectionModuleBuilder *module, HANDLE file);
-void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
-MonoReflectionModule * mono_image_load_module (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name);
-guint32       mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str);
-guint32       mono_image_create_token  (MonoDynamicImage *assembly, MonoObject *obj, gboolean create_methodspec);
-guint32       mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, MonoArray *opt_param_types);
-void          mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
+void          mono_image_create_pefile (MonoReflectionModuleBuilder *module, HANDLE file) MONO_INTERNAL;
+void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly) MONO_INTERNAL;
+MonoReflectionModule * mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name) MONO_INTERNAL;
+guint32       mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str) MONO_INTERNAL;
+guint32       mono_image_create_token  (MonoDynamicImage *assembly, MonoObject *obj, gboolean create_methodspec) MONO_INTERNAL;
+guint32       mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, MonoArray *opt_param_types) MONO_INTERNAL;
+void          mono_image_module_basic_init (MonoReflectionModuleBuilder *module) MONO_INTERNAL;
 
-void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb);
+void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb) MONO_INTERNAL;
 
-void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
+void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb) MONO_INTERNAL;
 
-void        mono_reflection_setup_generic_class   (MonoReflectionTypeBuilder *tb);
+void        mono_reflection_setup_generic_class   (MonoReflectionTypeBuilder *tb) MONO_INTERNAL;
 
-void        mono_reflection_create_generic_class  (MonoReflectionTypeBuilder *tb);
+void        mono_reflection_create_generic_class  (MonoReflectionTypeBuilder *tb) MONO_INTERNAL;
 
-MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb);
+MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb) MONO_INTERNAL;
 
-void        mono_reflection_get_dynamic_overrides (MonoClass *klass, MonoMethod ***overrides, int *num_overrides);
+void        mono_reflection_get_dynamic_overrides (MonoClass *klass, MonoMethod ***overrides, int *num_overrides) MONO_INTERNAL;
 
-void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m);
+void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m) MONO_INTERNAL;
+void mono_reflection_destroy_dynamic_method (MonoReflectionDynamicMethod *mb) MONO_INTERNAL;
 
-void        mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam);
+void        mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam) MONO_INTERNAL;
 
+MonoClass*
+mono_class_bind_generic_parameters (MonoClass *klass, int type_argc, MonoType **types, gboolean is_dynamic) MONO_INTERNAL;
 MonoType*
-mono_class_bind_generic_parameters (MonoType *type, int type_argc, MonoType **types);
-MonoType*
-mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types);
+mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types) MONO_INTERNAL;
 MonoReflectionMethod*
-mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types);
+mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types) MONO_INTERNAL;
 void
-mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, MonoArray *methods, MonoArray *ctors, MonoArray *fields, MonoArray *properties, MonoArray *events);
+mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, MonoArray *methods, MonoArray *ctors, MonoArray *fields, MonoArray *properties, MonoArray *events) MONO_INTERNAL;
 MonoReflectionEvent *
-mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb);
+mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb) MONO_INTERNAL;
 
-MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
+MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig) MONO_INTERNAL;
 
-MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
+MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig) MONO_INTERNAL;
 
-MonoReflectionMarshal* mono_reflection_marshal_from_marshal_spec (MonoDomain *domain, MonoClass *klass, MonoMarshalSpec *spec);
+MonoReflectionMarshal* mono_reflection_marshal_from_marshal_spec (MonoDomain *domain, MonoClass *klass, MonoMarshalSpec *spec) MONO_INTERNAL;
 
 gpointer
-mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, MonoClass **handle_class);
+mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, MonoClass **handle_class, MonoGenericContext *context) MONO_INTERNAL;
 
 gboolean
-mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass);
+mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass) MONO_INTERNAL;
 
 void
-mono_image_build_metadata (MonoReflectionModuleBuilder *module);
+mono_image_build_metadata (MonoReflectionModuleBuilder *module) MONO_INTERNAL;
 
 int
-mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const char *blob, void *value);
+mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const char *blob, void *value) MONO_INTERNAL;
 
 void
-mono_release_type_locks (MonoThread *thread);
+mono_release_type_locks (MonoThread *thread) MONO_INTERNAL;
 
 char *
-mono_string_to_utf8_mp (MonoMemPool *mp, MonoString *s);
+mono_string_to_utf8_mp (MonoMemPool *mp, MonoString *s) MONO_INTERNAL;
 
 MonoArray*
-mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array);
+mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array) MONO_INTERNAL;
 
 void
-mono_array_full_copy (MonoArray *src, MonoArray *dest);
+mono_array_full_copy (MonoArray *src, MonoArray *dest) MONO_INTERNAL;
 
 gpointer
-mono_remote_class_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, MonoRealProxy *real_proxy);
-
-MonoMethodSignature*
-mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 token, MonoGenericContext *context);
+mono_remote_class_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, MonoRealProxy *real_proxy) MONO_INTERNAL;
 
 void
-mono_upgrade_remote_class (MonoDomain *domain, MonoObject *tproxy, MonoClass *klass);
+mono_upgrade_remote_class (MonoDomain *domain, MonoObject *tproxy, MonoClass *klass) MONO_INTERNAL;
 
 gpointer
-mono_get_addr_from_ftnptr (gpointer descr);
+mono_get_addr_from_ftnptr (gpointer descr) MONO_INTERNAL;
 
 void
-mono_nullable_init (guint8 *buf, MonoObject *value, MonoClass *klass);
+mono_nullable_init (guint8 *buf, MonoObject *value, MonoClass *klass) MONO_INTERNAL;
 
 MonoObject*
-mono_nullable_box (guint8 *buf, MonoClass *klass);
+mono_nullable_box (guint8 *buf, MonoClass *klass) MONO_INTERNAL;
+
+#define MONO_IMT_SIZE 19
+
+typedef struct _MonoImtBuilderEntry {
+       MonoMethod *method;
+       struct _MonoImtBuilderEntry *next;
+       int vtable_slot;
+       int children;
+} MonoImtBuilderEntry;
+
+typedef struct _MonoIMTCheckItem MonoIMTCheckItem;
+
+struct _MonoIMTCheckItem {
+       MonoMethod       *method;
+       int               check_target_idx;
+       int               vtable_slot;
+       guint8           *jmp_code;
+       guint8           *code_target;
+       guint8            is_equals;
+       guint8            compare_done;
+       guint8            chunk_size;
+       guint8            short_branch;
+};
+
+typedef gpointer (*MonoImtThunkBuilder) (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckItem **imt_entries, int count);
+
+void
+mono_install_imt_thunk_builder (MonoImtThunkBuilder func) MONO_INTERNAL;
+
+guint32
+mono_method_get_imt_slot (MonoMethod *method) MONO_INTERNAL;
 
 #endif /* __MONO_OBJECT_INTERNALS_H__ */