1 #ifndef __MONO_OBJECT_INTERNALS_H__
2 #define __MONO_OBJECT_INTERNALS_H__
4 #include <mono/metadata/object.h>
5 #include <mono/metadata/reflection.h>
6 #include <mono/io-layer/io-layer.h>
10 #define mono_assert(expr) G_STMT_START{ \
14 char *msg = g_strdup_printf ("file %s: line %d (%s): " \
15 "assertion failed: (%s)", __FILE__, __LINE__, \
16 __PRETTY_FUNCTION__, #expr); \
17 ex = mono_get_exception_execution_engine (msg); \
19 mono_raise_exception (ex); \
22 #define mono_assert_not_reached() G_STMT_START{ \
24 char *msg = g_strdup_printf ("file %s: line %d (%s): " \
25 "should not be reached", __FILE__, __LINE__, __PRETTY_FUNCTION__); \
26 ex = mono_get_exception_execution_engine (msg); \
28 mono_raise_exception (ex); \
31 #define mono_assert(expr) G_STMT_START{ \
35 char *msg = g_strdup_printf ("file %s: line %d: " \
36 "assertion failed: (%s)", __FILE__, __LINE__, \
38 ex = mono_get_exception_execution_engine (msg); \
40 mono_raise_exception (ex); \
43 #define mono_assert_not_reached() G_STMT_START{ \
45 char *msg = g_strdup_printf ("file %s: line %d): " \
46 "should not be reached", __FILE__, __LINE__); \
47 ex = mono_get_exception_execution_engine (msg); \
49 mono_raise_exception (ex); \
53 #define mono_assert(expr) g_assert(expr)
54 #define mono_assert_not_reached() g_assert_not_reached()
57 #define MONO_CHECK_ARG(arg, expr) G_STMT_START{ \
61 char *msg = g_strdup_printf ("assertion `%s' failed", \
63 if (arg) {} /* check if the name exists */ \
64 ex = mono_get_exception_argument (#arg, msg); \
66 mono_raise_exception (ex); \
69 #define MONO_CHECK_ARG_NULL(arg) G_STMT_START{ \
73 if (arg) {} /* check if the name exists */ \
74 ex = mono_get_exception_argument_null (#arg); \
75 mono_raise_exception (ex); \
79 #define mono_stringbuilder_capacity(sb) ((sb)->str->length)
84 } MonoMarshalByRefObject;
86 /* This is a copy of System.AppDomain */
87 struct _MonoAppDomain {
88 MonoMarshalByRefObject mbr;
106 } MonoArgumentHandle;
109 MonoMethodSignature *sig;
115 struct _MonoException {
117 MonoArray *trace_ips;
118 MonoObject *inner_ex;
120 MonoString *help_link;
121 MonoString *class_name;
122 MonoString *stack_trace;
123 MonoString *remote_stack_trace;
124 gint32 remote_stack_index;
131 } MonoSystemException;
134 MonoSystemException base;
135 MonoString *param_name;
136 } MonoArgumentException;
139 MonoSystemException base;
141 MonoString *type_name;
142 } MonoTypeLoadException;
146 MonoObject *async_state;
148 MonoObject *async_delegate;
150 MonoBoolean sync_completed;
151 MonoBoolean completed;
152 MonoBoolean endinvoke_called;
153 MonoObject *async_callback;
157 MonoMarshalByRefObject object;
159 MonoBoolean disposed;
162 /* This is a copy of System.Runtime.Remoting.Messaging.CallType */
165 CallType_BeginInvoke = 1,
166 CallType_EndInvoke = 2,
170 struct _MonoReflectionType {
177 MonoReflectionType *class_to_proxy;
179 MonoObject *unwrapped_server;
180 gint32 target_domain_id;
181 MonoString *target_uri;
187 MonoRemoteClass *remote_class;
188 MonoBoolean custom_type_info;
189 } MonoTransparentProxy;
193 MonoReflectionMethod *method;
196 MonoArray *arg_types;
200 MonoAsyncResult *async_result;
207 gint32 native_offset;
208 MonoReflectionMethod *method;
209 MonoString *filename;
217 MonoObject **culture_info;
218 MonoObject **ui_culture_info;
219 MonoBoolean threadpool_thread;
223 MonoException *abort_exc;
224 MonoObject *abort_state;
228 gpointer *static_data;
231 GSList *appdomain_refs;
232 MonoBoolean interruption_requested;
233 gpointer suspend_event;
234 gpointer resume_event;
235 MonoObject *synch_lock;
236 guint8* serialized_culture_info;
237 guint32 serialized_culture_info_len;
238 guint8* serialized_ui_culture_info;
239 guint32 serialized_ui_culture_info_len;
244 MonoReflectionType *type;
246 } MonoSerializationEntry;
250 MonoObject *additional;
251 } MonoStreamingContext;
255 MonoBoolean readOnly;
256 MonoString *AMDesignator;
257 MonoString *PMDesignator;
258 MonoString *DateSeparator;
259 MonoString *TimeSeparator;
260 MonoString *ShortDatePattern;
261 MonoString *LongDatePattern;
262 MonoString *ShortTimePattern;
263 MonoString *LongTimePattern;
264 MonoString *MonthDayPattern;
265 MonoString *YearMonthPattern;
266 MonoString *FullDateTimePattern;
267 MonoString *RFC1123Pattern;
268 MonoString *SortableDateTimePattern;
269 MonoString *UniversalSortableDateTimePattern;
270 guint32 FirstDayOfWeek;
271 MonoObject *Calendar;
272 guint32 CalendarWeekRule;
273 MonoArray *AbbreviatedDayNames;
275 MonoArray *MonthNames;
276 MonoArray *AbbreviatedMonthNames;
277 MonoArray *ShortDatePatterns;
278 MonoArray *LongDatePatterns;
279 MonoArray *ShortTimePatterns;
280 MonoArray *LongTimePatterns;
281 } MonoDateTimeFormatInfo;
286 MonoBoolean readOnly;
287 MonoString *decimalFormats;
288 MonoString *currencyFormats;
289 MonoString *percentFormats;
290 MonoString *digitPattern;
291 MonoString *zeroPattern;
292 gint32 currencyDecimalDigits;
293 MonoString *currencyDecimalSeparator;
294 MonoString *currencyGroupSeparator;
295 MonoArray *currencyGroupSizes;
296 gint32 currencyNegativePattern;
297 gint32 currencyPositivePattern;
298 MonoString *currencySymbol;
299 MonoString *naNSymbol;
300 MonoString *negativeInfinitySymbol;
301 MonoString *negativeSign;
302 guint32 numberDecimalDigits;
303 MonoString *numberDecimalSeparator;
304 MonoString *numberGroupSeparator;
305 MonoArray *numberGroupSizes;
306 gint32 numberNegativePattern;
307 gint32 percentDecimalDigits;
308 MonoString *percentDecimalSeparator;
309 MonoString *percentGroupSeparator;
310 MonoArray *percentGroupSizes;
311 gint32 percentNegativePattern;
312 gint32 percentPositivePattern;
313 MonoString *percentSymbol;
314 MonoString *perMilleSymbol;
315 MonoString *positiveInfinitySymbol;
316 MonoString *positiveSign;
317 } MonoNumberFormatInfo;
322 MonoString *icu_name;
323 gpointer ICU_collator;
328 MonoBoolean is_read_only;
331 gint32 specific_lcid;
332 gint32 datetime_index;
334 MonoBoolean use_user_override;
335 MonoNumberFormatInfo *number_format;
336 MonoDateTimeFormatInfo *datetime_format;
337 MonoObject *textinfo;
339 MonoString *displayname;
340 MonoString *englishname;
341 MonoString *nativename;
342 MonoString *iso3lang;
343 MonoString *iso2lang;
344 MonoString *icu_name;
345 MonoString *win3lang;
346 MonoCompareInfo *compareinfo;
347 const gint32 *calendar_data;
348 const void* text_info_data;
359 /* used to free a dynamic method */
360 typedef void (*MonoFreeMethodFunc) (MonoDomain *domain, MonoMethod *method);
362 /* remoting and async support */
365 mono_async_result_new (MonoDomain *domain, HANDLE handle,
366 MonoObject *state, gpointer data);
369 mono_wait_handle_new (MonoDomain *domain, HANDLE handle);
372 mono_message_init (MonoDomain *domain, MonoMethodMessage *this_obj,
373 MonoReflectionMethod *method, MonoArray *out_args);
376 mono_remoting_invoke (MonoObject *real_proxy, MonoMethodMessage *msg,
377 MonoObject **exc, MonoArray **out_args);
380 mono_message_invoke (MonoObject *target, MonoMethodMessage *msg,
381 MonoObject **exc, MonoArray **out_args);
384 mono_method_call_message_new (MonoMethod *method, gpointer *params, MonoMethod *invoke,
385 MonoDelegate **cb, MonoObject **state);
388 mono_method_return_message_restore (MonoMethod *method, gpointer *params, MonoArray *out_args);
391 mono_delegate_ctor (MonoObject *this_obj, MonoObject *target, gpointer addr);
394 mono_runtime_free_method (MonoDomain *domain, MonoMethod *method);
396 /* runtime initialization functions */
397 typedef void (*MonoExceptionFunc) (MonoException *ex);
400 mono_install_handler (MonoExceptionFunc func);
403 mono_install_runtime_invoke (MonoInvokeFunc func);
406 mono_install_compile_method (MonoCompileFunc func);
409 mono_install_free_method (MonoFreeMethodFunc func);
412 mono_type_initialization_init (void);
415 mono_thread_get_tls_key (void);
418 mono_domain_get_tls_key (void);
420 /* Reflection and Reflection.Emit support */
423 * The following structure must match the C# implementation in our corlib.
426 struct _MonoReflectionMethod {
430 MonoReflectionType *reftype;
433 typedef struct _MonoReflectionGenericMethod MonoReflectionGenericMethod;
434 struct _MonoReflectionGenericMethod {
435 MonoReflectionMethod method;
438 struct _MonoDelegate {
440 MonoObject *target_type;
442 MonoString *method_name;
444 gpointer delegate_trampoline;
445 MonoReflectionMethod *method_info;
448 typedef struct _MonoMulticastDelegate MonoMulticastDelegate;
449 struct _MonoMulticastDelegate {
450 MonoDelegate delegate;
451 MonoMulticastDelegate *prev;
454 struct _MonoReflectionField {
457 MonoClassField *field;
459 MonoReflectionType *type;
463 struct _MonoReflectionProperty {
466 MonoProperty *property;
469 struct _MonoReflectionEvent {
477 MonoReflectionType *ClassImpl;
478 MonoObject *DefaultValueImpl;
479 MonoObject *MemberImpl;
480 MonoString *NameImpl;
483 MonoObject *MarshalAsImpl;
484 } MonoReflectionParameter;
486 struct _MonoReflectionMethodBody {
491 MonoBoolean init_locals;
496 struct _MonoReflectionAssembly {
498 MonoAssembly *assembly;
499 MonoObject *resolve_event_holder;
501 MonoObject *evidence; /* Evidence */
502 MonoObject *minimum; /* PermissionSet - for SecurityAction.RequestMinimum */
503 MonoObject *optional; /* PermissionSet - for SecurityAction.RequestOptional */
504 MonoObject *refuse; /* PermissionSet - for SecurityAction.RequestRefuse */
505 MonoObject *granted; /* PermissionSet - for the resolved assembly granted permissions */
506 MonoObject *denied; /* PermissionSet - for the resolved assembly denied permissions */
510 MonoReflectionType *utype;
516 MonoReflectionType *parent;
517 MonoReflectionType *ret;
524 MonoReflectionType *parent;
526 MonoReflectionMethod *get;
527 MonoReflectionMethod *set;
532 MonoReflectionType *declaring_type;
533 MonoReflectionType *reflected_type;
535 MonoReflectionMethod *add_method;
536 MonoReflectionMethod *remove_method;
537 MonoReflectionMethod *raise_method;
539 MonoArray *other_methods;
544 MonoString *name_space;
545 MonoReflectionType *etype;
546 MonoReflectionType *nested_in;
547 MonoReflectionAssembly *assembly;
549 MonoBoolean isprimitive;
555 } MonoReflectionILTokenInfo;
564 MonoArray *ex_handlers;
565 gint32 num_token_fixups;
566 MonoArray *token_fixups;
567 } MonoReflectionILGen;
574 } MonoILExceptionInfo;
577 MonoReflectionType *extype;
581 gint32 filter_offset;
582 } MonoILExceptionBlock;
586 MonoReflectionType *local_type;
587 MonoBoolean is_pinned;
589 } MonoReflectionLocalVariableInfo;
593 * Must have the same layout as MonoReflectionLocalVariableInfo, since
594 * LocalBuilder inherits from it under net 2.0.
597 MonoReflectionType *type;
598 MonoBoolean is_pinned;
601 } MonoReflectionLocalBuilder;
610 MonoString *marshaltype;
611 MonoReflectionType *marshaltyperef;
612 } MonoReflectionMarshal;
619 MonoReflectionMarshal *marshal_info;
623 MonoObject *def_value;
624 } MonoReflectionParamBuilder;
629 MonoReflectionILGen *ilgen;
630 MonoArray *parameters;
638 MonoBoolean init_locals;
639 MonoArray *param_modreq;
640 MonoArray *param_modopt;
641 MonoArray *permissions;
642 } MonoReflectionCtorBuilder;
647 MonoReflectionType *rtype;
648 MonoArray *parameters;
654 MonoReflectionILGen *ilgen;
658 MonoReflectionMethod *override_method;
660 MonoString *dllentry;
664 MonoBoolean init_locals;
665 MonoGenericContainer *generic_container;
666 MonoArray *generic_params;
667 MonoArray *return_modreq;
668 MonoArray *return_modopt;
669 MonoArray *param_modreq;
670 MonoArray *param_modopt;
671 MonoArray *permissions;
672 } MonoReflectionMethodBuilder;
677 MonoReflectionType *parent;
678 MonoReflectionType *ret;
679 MonoArray *parameters;
683 } MonoReflectionArrayMethod;
688 MonoString *filename;
691 } MonoReflectionResource;
698 } MonoReflectionWin32Resource;
703 } MonoReflectionPermissionSet;
706 MonoReflectionAssembly assembly;
707 MonoDynamicAssembly *dynamic_assembly;
708 MonoReflectionMethod *entry_point;
713 MonoArray *resources;
714 MonoArray *public_key;
720 MonoBoolean delay_sign;
722 MonoArray *loaded_modules;
723 MonoArray *win32_resources;
725 MonoArray *permissions_minimum;
726 MonoArray *permissions_optional;
727 MonoArray *permissions_refused;
730 MonoBoolean corlib_internal;
731 } MonoReflectionAssemblyBuilder;
736 MonoReflectionType *type;
738 MonoObject *def_value;
741 MonoReflectionType *typeb;
744 MonoReflectionMarshal *marshal_info;
745 MonoClassField *handle;
748 } MonoReflectionFieldBuilder;
754 MonoReflectionType *type;
755 MonoArray *parameters;
757 MonoObject *def_value;
758 MonoReflectionMethodBuilder *set_method;
759 MonoReflectionMethodBuilder *get_method;
761 } MonoReflectionPropertyBuilder;
763 struct _MonoReflectionModule {
766 MonoReflectionAssembly *assembly;
769 MonoString *scopename;
770 MonoBoolean is_resource;
775 MonoReflectionModule module;
776 MonoDynamicImage *dynamic_image;
782 MonoReflectionAssemblyBuilder *assemblyb;
783 MonoArray *global_methods;
784 MonoArray *global_fields;
786 MonoArray *resources;
787 } MonoReflectionModuleBuilder;
790 MonoReflectionType type;
793 MonoReflectionType *parent;
794 MonoReflectionType *nesting_type;
795 MonoArray *interfaces;
799 MonoArray *properties;
807 MonoReflectionModuleBuilder *module;
810 MonoGenericContainer *generic_container;
811 MonoArray *generic_params;
812 MonoArray *permissions;
813 MonoReflectionType *created;
814 } MonoReflectionTypeBuilder;
817 MonoReflectionType type;
818 MonoReflectionTypeBuilder *tbuilder;
819 MonoReflectionMethodBuilder *mbuilder;
822 MonoReflectionType *base_type;
823 MonoArray *iface_constraints;
825 } MonoReflectionGenericParam;
827 typedef struct _MonoReflectionGenericClass MonoReflectionGenericClass;
828 struct _MonoReflectionGenericClass {
829 MonoReflectionType type;
830 MonoReflectionType *generic_type;
837 MonoString *codebase;
838 gint32 major, minor, build, revision;
839 /* FIXME: add missing stuff */
840 /* CultureInfo cultureinfo;
841 AssemblyNameFlags flags;
842 AssemblyHashAlgorithm hashalg;
843 StrongNameKeyPair keypair;
844 AssemblyVersionCompatibility versioncompat;*/
845 MonoObject *cultureInfo;
849 MonoArray *publicKey;
851 MonoObject *versioncompat;
852 } MonoReflectionAssemblyName;
857 MonoReflectionType *type;
858 MonoReflectionTypeBuilder *typeb;
860 MonoReflectionMethodBuilder *add_method;
861 MonoReflectionMethodBuilder *remove_method;
862 MonoReflectionMethodBuilder *raise_method;
863 MonoArray *other_methods;
866 } MonoReflectionEventBuilder;
870 MonoReflectionMethod *ctor;
872 } MonoReflectionCustomAttr;
879 MonoString *entry_point;
880 MonoBoolean exact_spelling;
881 MonoBoolean preserve_sig;
882 MonoBoolean set_last_error;
883 MonoBoolean best_fit_mapping;
884 MonoBoolean throw_on_unmappable;
885 } MonoReflectionDllImportAttribute;
891 MonoReflectionType *rtype;
892 MonoArray *parameters;
895 MonoReflectionModule *module;
896 MonoBoolean skip_visibility;
897 MonoBoolean init_locals;
898 MonoReflectionILGen *ilgen;
901 } MonoReflectionDynamicMethod;
905 MonoReflectionModuleBuilder *module;
906 MonoArray *arguments;
908 MonoReflectionType *return_type;
910 guint32 unmanaged_call_conv;
911 } MonoReflectionSigHelper;
914 RESOURCE_LOCATION_EMBEDDED = 1,
915 RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,
916 RESOURCE_LOCATION_IN_MANIFEST = 4
921 MonoReflectionAssembly *assembly;
922 MonoString *filename;
924 } MonoManifestResourceInfo;
926 /* Keep in sync with System.GenericParameterAttributes */
928 GENERIC_PARAMETER_ATTRIBUTE_NON_VARIANT = 0,
929 GENERIC_PARAMETER_ATTRIBUTE_COVARIANT = 1,
930 GENERIC_PARAMETER_ATTRIBUTE_CONTRAVARIANT = 2,
931 GENERIC_PARAMETER_ATTRIBUTE_VARIANCE_MASK = 3,
933 GENERIC_PARAMETER_ATTRIBUTE_NO_SPECIAL_CONSTRAINT = 0,
934 GENERIC_PARAMETER_ATTRIBUTE_REFERENCE_TYPE_CONSTRAINT = 4,
935 GENERIC_PARAMETER_ATTRIBUTE_VALUE_TYPE_CONSTRAINT = 8,
936 GENERIC_PARAMETER_ATTRIBUTE_CONSTRUCTOR_CONSTRAINT = 16,
937 GENERIC_PARAMETER_ATTRIBUTE_SPECIAL_CONSTRAINTS_MASK = 28
938 } GenericParameterAttributes;
940 void mono_image_create_pefile (MonoReflectionModuleBuilder *module, HANDLE file);
941 void mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
942 MonoReflectionModule * mono_image_load_module (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name);
943 guint32 mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str);
944 guint32 mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj, gboolean create_methodspec);
945 guint32 mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, MonoArray *opt_param_types);
946 void mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
948 void mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb);
950 void mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
952 void mono_reflection_setup_generic_class (MonoReflectionTypeBuilder *tb);
954 void mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb);
956 MonoReflectionType* mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb);
958 void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m);
960 void mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam);
963 mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types);
964 MonoReflectionMethod*
965 mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types);
967 mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, MonoArray *methods, MonoArray *ctors, MonoArray *fields, MonoArray *properties, MonoArray *events);
968 MonoReflectionEvent *
969 mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb);
971 MonoArray *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
973 MonoArray *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
975 MonoReflectionMarshal* mono_reflection_marshal_from_marshal_spec (MonoDomain *domain, MonoClass *klass, MonoMarshalSpec *spec);
978 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token);
981 mono_image_build_metadata (MonoReflectionModuleBuilder *module);
984 mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const char *blob, void *value);
987 mono_release_type_locks (MonoThread *thread);
990 mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array);
993 mono_array_full_copy (MonoArray *src, MonoArray *dest);
996 mono_remote_class_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, MonoRealProxy *real_proxy);
999 mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 token, MonoGenericContext *context);
1001 #endif /* __MONO_OBJECT_INTERNALS_H__ */