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;
241 MonoReflectionType *type;
243 } MonoSerializationEntry;
247 MonoObject *additional;
248 } MonoStreamingContext;
252 MonoBoolean readOnly;
253 MonoString *AMDesignator;
254 MonoString *PMDesignator;
255 MonoString *DateSeparator;
256 MonoString *TimeSeparator;
257 MonoString *ShortDatePattern;
258 MonoString *LongDatePattern;
259 MonoString *ShortTimePattern;
260 MonoString *LongTimePattern;
261 MonoString *MonthDayPattern;
262 MonoString *YearMonthPattern;
263 MonoString *FullDateTimePattern;
264 MonoString *RFC1123Pattern;
265 MonoString *SortableDateTimePattern;
266 MonoString *UniversalSortableDateTimePattern;
267 guint32 FirstDayOfWeek;
268 MonoObject *Calendar;
269 guint32 CalendarWeekRule;
270 MonoArray *AbbreviatedDayNames;
272 MonoArray *MonthNames;
273 MonoArray *AbbreviatedMonthNames;
274 MonoArray *ShortDatePatterns;
275 MonoArray *LongDatePatterns;
276 MonoArray *ShortTimePatterns;
277 MonoArray *LongTimePatterns;
278 } MonoDateTimeFormatInfo;
283 MonoBoolean readOnly;
284 MonoString *decimalFormats;
285 MonoString *currencyFormats;
286 MonoString *percentFormats;
287 MonoString *digitPattern;
288 MonoString *zeroPattern;
289 gint32 currencyDecimalDigits;
290 MonoString *currencyDecimalSeparator;
291 MonoString *currencyGroupSeparator;
292 MonoArray *currencyGroupSizes;
293 gint32 currencyNegativePattern;
294 gint32 currencyPositivePattern;
295 MonoString *currencySymbol;
296 MonoString *naNSymbol;
297 MonoString *negativeInfinitySymbol;
298 MonoString *negativeSign;
299 guint32 numberDecimalDigits;
300 MonoString *numberDecimalSeparator;
301 MonoString *numberGroupSeparator;
302 MonoArray *numberGroupSizes;
303 gint32 numberNegativePattern;
304 gint32 percentDecimalDigits;
305 MonoString *percentDecimalSeparator;
306 MonoString *percentGroupSeparator;
307 MonoArray *percentGroupSizes;
308 gint32 percentNegativePattern;
309 gint32 percentPositivePattern;
310 MonoString *percentSymbol;
311 MonoString *perMilleSymbol;
312 MonoString *positiveInfinitySymbol;
313 MonoString *positiveSign;
314 } MonoNumberFormatInfo;
319 MonoString *icu_name;
320 gpointer ICU_collator;
325 MonoBoolean is_read_only;
328 gint32 specific_lcid;
329 gint32 datetime_index;
331 MonoBoolean use_user_override;
332 MonoNumberFormatInfo *number_format;
333 MonoDateTimeFormatInfo *datetime_format;
334 MonoObject *textinfo;
336 MonoString *displayname;
337 MonoString *englishname;
338 MonoString *nativename;
339 MonoString *iso3lang;
340 MonoString *iso2lang;
341 MonoString *icu_name;
342 MonoString *win3lang;
343 MonoCompareInfo *compareinfo;
344 const gint32 *calendar_data;
355 /* used to free a dynamic method */
356 typedef void (*MonoFreeMethodFunc) (MonoDomain *domain, MonoMethod *method);
358 /* remoting and async support */
361 mono_async_result_new (MonoDomain *domain, HANDLE handle,
362 MonoObject *state, gpointer data);
365 mono_wait_handle_new (MonoDomain *domain, HANDLE handle);
368 mono_message_init (MonoDomain *domain, MonoMethodMessage *this_obj,
369 MonoReflectionMethod *method, MonoArray *out_args);
372 mono_remoting_invoke (MonoObject *real_proxy, MonoMethodMessage *msg,
373 MonoObject **exc, MonoArray **out_args);
376 mono_message_invoke (MonoObject *target, MonoMethodMessage *msg,
377 MonoObject **exc, MonoArray **out_args);
380 mono_method_call_message_new (MonoMethod *method, gpointer *params, MonoMethod *invoke,
381 MonoDelegate **cb, MonoObject **state);
384 mono_method_return_message_restore (MonoMethod *method, gpointer *params, MonoArray *out_args);
387 mono_delegate_ctor (MonoObject *this_obj, MonoObject *target, gpointer addr);
390 mono_runtime_free_method (MonoDomain *domain, MonoMethod *method);
392 /* runtime initialization functions */
393 typedef void (*MonoExceptionFunc) (MonoException *ex);
396 mono_install_handler (MonoExceptionFunc func);
399 mono_install_runtime_invoke (MonoInvokeFunc func);
402 mono_install_compile_method (MonoCompileFunc func);
405 mono_install_free_method (MonoFreeMethodFunc func);
408 mono_type_initialization_init (void);
410 /* Reflection and Reflection.Emit support */
413 * The following structure must match the C# implementation in our corlib.
416 struct _MonoReflectionMethod {
420 MonoReflectionType *reftype;
423 struct _MonoDelegate {
425 MonoObject *target_type;
427 MonoString *method_name;
429 gpointer delegate_trampoline;
430 MonoReflectionMethod *method_info;
433 typedef struct _MonoMulticastDelegate MonoMulticastDelegate;
434 struct _MonoMulticastDelegate {
435 MonoDelegate delegate;
436 MonoMulticastDelegate *prev;
439 struct _MonoReflectionField {
442 MonoClassField *field;
444 MonoReflectionType *type;
448 struct _MonoReflectionProperty {
451 MonoProperty *property;
454 struct _MonoReflectionEvent {
462 MonoReflectionType *ClassImpl;
463 MonoObject *DefaultValueImpl;
464 MonoObject *MemberImpl;
465 MonoString *NameImpl;
468 MonoObject *MarshalAsImpl;
469 } MonoReflectionParameter;
471 struct _MonoReflectionMethodBody {
476 MonoBoolean init_locals;
481 struct _MonoReflectionAssembly {
483 MonoAssembly *assembly;
484 MonoObject *resolve_event_holder;
486 MonoObject *evidence; /* Evidence */
487 MonoObject *minimum; /* PermissionSet - for SecurityAction.RequestMinimum */
488 MonoObject *optional; /* PermissionSet - for SecurityAction.RequestOptional */
489 MonoObject *refuse; /* PermissionSet - for SecurityAction.RequestRefuse */
490 MonoObject *granted; /* PermissionSet - for the resolved assembly granted permissions */
491 MonoObject *denied; /* PermissionSet - for the resolved assembly denied permissions */
495 MonoReflectionType *utype;
501 MonoReflectionType *parent;
502 MonoReflectionType *ret;
509 MonoReflectionType *parent;
511 MonoReflectionMethod *get;
512 MonoReflectionMethod *set;
517 MonoReflectionType *declaring_type;
518 MonoReflectionType *reflected_type;
520 MonoReflectionMethod *add_method;
521 MonoReflectionMethod *remove_method;
522 MonoReflectionMethod *raise_method;
524 MonoArray *other_methods;
529 MonoString *name_space;
530 MonoReflectionType *etype;
531 MonoReflectionType *nested_in;
532 MonoReflectionAssembly *assembly;
534 MonoBoolean isprimitive;
540 } MonoReflectionILTokenInfo;
549 MonoArray *ex_handlers;
550 gint32 num_token_fixups;
551 MonoArray *token_fixups;
552 } MonoReflectionILGen;
559 } MonoILExceptionInfo;
562 MonoReflectionType *extype;
566 gint32 filter_offset;
567 } MonoILExceptionBlock;
571 MonoReflectionType *local_type;
572 MonoBoolean is_pinned;
574 } MonoReflectionLocalVariableInfo;
578 * Must have the same layout as MonoReflectionLocalVariableInfo, since
579 * LocalBuilder inherits from it under net 2.0.
582 MonoReflectionType *type;
583 MonoBoolean is_pinned;
586 } MonoReflectionLocalBuilder;
595 MonoString *marshaltype;
596 MonoReflectionType *marshaltyperef;
597 } MonoReflectionMarshal;
604 MonoReflectionMarshal *marshal_info;
608 MonoObject *def_value;
609 } MonoReflectionParamBuilder;
614 MonoReflectionILGen *ilgen;
615 MonoArray *parameters;
623 MonoBoolean init_locals;
624 MonoArray *param_modreq;
625 MonoArray *param_modopt;
626 MonoArray *permissions;
627 } MonoReflectionCtorBuilder;
632 MonoReflectionType *rtype;
633 MonoArray *parameters;
639 MonoReflectionILGen *ilgen;
643 MonoReflectionMethod *override_method;
645 MonoString *dllentry;
649 MonoBoolean init_locals;
650 MonoGenericContainer *generic_container;
651 MonoArray *generic_params;
652 MonoArray *return_modreq;
653 MonoArray *return_modopt;
654 MonoArray *param_modreq;
655 MonoArray *param_modopt;
656 MonoArray *permissions;
657 } MonoReflectionMethodBuilder;
662 MonoReflectionType *parent;
663 MonoReflectionType *ret;
664 MonoArray *parameters;
668 } MonoReflectionArrayMethod;
673 MonoString *filename;
676 } MonoReflectionResource;
683 } MonoReflectionWin32Resource;
688 } MonoReflectionPermissionSet;
691 MonoReflectionAssembly assembly;
692 MonoDynamicAssembly *dynamic_assembly;
693 MonoReflectionMethod *entry_point;
698 MonoArray *resources;
699 MonoArray *public_key;
705 MonoBoolean delay_sign;
707 MonoArray *loaded_modules;
708 MonoArray *win32_resources;
710 MonoArray *permissions_minimum;
711 MonoArray *permissions_optional;
712 MonoArray *permissions_refused;
715 } MonoReflectionAssemblyBuilder;
720 MonoReflectionType *type;
722 MonoObject *def_value;
725 MonoReflectionType *typeb;
728 MonoReflectionMarshal *marshal_info;
729 MonoClassField *handle;
732 } MonoReflectionFieldBuilder;
738 MonoReflectionType *type;
739 MonoArray *parameters;
741 MonoObject *def_value;
742 MonoReflectionMethodBuilder *set_method;
743 MonoReflectionMethodBuilder *get_method;
745 } MonoReflectionPropertyBuilder;
747 struct _MonoReflectionModule {
750 MonoReflectionAssembly *assembly;
753 MonoString *scopename;
754 MonoBoolean is_resource;
759 MonoReflectionModule module;
760 MonoDynamicImage *dynamic_image;
766 MonoReflectionAssemblyBuilder *assemblyb;
767 MonoArray *global_methods;
768 MonoArray *global_fields;
770 MonoArray *resources;
771 } MonoReflectionModuleBuilder;
774 MonoReflectionType type;
777 MonoReflectionType *parent;
778 MonoReflectionType *nesting_type;
779 MonoArray *interfaces;
783 MonoArray *properties;
791 MonoReflectionModuleBuilder *module;
794 MonoGenericContainer *generic_container;
795 MonoArray *generic_params;
796 MonoArray *permissions;
797 MonoReflectionType *created;
798 } MonoReflectionTypeBuilder;
801 MonoReflectionType type;
802 MonoReflectionTypeBuilder *tbuilder;
803 MonoReflectionMethodBuilder *mbuilder;
806 MonoReflectionType *base_type;
807 MonoArray *iface_constraints;
809 } MonoReflectionGenericParam;
811 typedef struct _MonoReflectionGenericInst MonoReflectionGenericInst;
812 struct _MonoReflectionGenericInst {
813 MonoReflectionType type;
814 MonoReflectionType *generic_type;
821 MonoString *codebase;
822 gint32 major, minor, build, revision;
823 /* FIXME: add missing stuff */
824 /* CultureInfo cultureinfo;
825 AssemblyNameFlags flags;
826 AssemblyHashAlgorithm hashalg;
827 StrongNameKeyPair keypair;
828 AssemblyVersionCompatibility versioncompat;*/
829 MonoObject *cultureInfo;
833 MonoArray *publicKey;
835 MonoObject *versioncompat;
836 } MonoReflectionAssemblyName;
841 MonoReflectionType *type;
842 MonoReflectionTypeBuilder *typeb;
844 MonoReflectionMethodBuilder *add_method;
845 MonoReflectionMethodBuilder *remove_method;
846 MonoReflectionMethodBuilder *raise_method;
847 MonoArray *other_methods;
850 } MonoReflectionEventBuilder;
854 MonoReflectionMethod *ctor;
856 } MonoReflectionCustomAttr;
863 MonoString *entry_point;
864 MonoBoolean exact_spelling;
865 MonoBoolean preserve_sig;
866 MonoBoolean set_last_error;
867 MonoBoolean best_fit_mapping;
868 MonoBoolean throw_on_unmappable;
869 } MonoReflectionDllImportAttribute;
875 MonoReflectionType *rtype;
876 MonoArray *parameters;
879 MonoReflectionModule *module;
880 MonoBoolean skip_visibility;
881 MonoBoolean init_locals;
882 MonoReflectionILGen *ilgen;
885 } MonoReflectionDynamicMethod;
889 MonoReflectionModuleBuilder *module;
890 MonoArray *arguments;
892 MonoReflectionType *return_type;
894 guint32 unmanaged_call_conv;
895 } MonoReflectionSigHelper;
898 RESOURCE_LOCATION_EMBEDDED = 1,
899 RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,
900 RESOURCE_LOCATION_IN_MANIFEST = 4
905 MonoReflectionAssembly *assembly;
906 MonoString *filename;
908 } MonoManifestResourceInfo;
910 /* Keep in sync with System.GenericParameterAttributes */
912 GENERIC_PARAMETER_ATTRIBUTE_NON_VARIANT = 0,
913 GENERIC_PARAMETER_ATTRIBUTE_COVARIANT = 1,
914 GENERIC_PARAMETER_ATTRIBUTE_CONTRAVARIANT = 2,
915 GENERIC_PARAMETER_ATTRIBUTE_VARIANCE_MASK = 3,
917 GENERIC_PARAMETER_ATTRIBUTE_NO_SPECIAL_CONSTRAINT = 0,
918 GENERIC_PARAMETER_ATTRIBUTE_REFERENCE_TYPE_CONSTRAINT = 4,
919 GENERIC_PARAMETER_ATTRIBUTE_VALUE_TYPE_CONSTRAINT = 8,
920 GENERIC_PARAMETER_ATTRIBUTE_CONSTRUCTOR_CONSTRAINT = 16,
921 GENREIC_PARAMETER_ATTRIBUTE_SPECIAL_CONSTRAINTS_MASK = 28
922 } GenericParameterAttributes;
924 void mono_image_create_pefile (MonoReflectionModuleBuilder *module, HANDLE file);
925 void mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
926 MonoReflectionModule * mono_image_load_module (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name);
927 guint32 mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str);
928 guint32 mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj, gboolean create_methodspec);
929 guint32 mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, MonoArray *opt_param_types);
930 void mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
932 void mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb);
934 void mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
936 void mono_reflection_setup_generic_class (MonoReflectionTypeBuilder *tb);
938 void mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb);
940 MonoReflectionType* mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb);
942 void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m);
944 void mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam);
947 mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types);
948 MonoReflectionMethod*
949 mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types);
951 mono_reflection_generic_inst_initialize (MonoReflectionGenericInst *type, MonoArray *methods, MonoArray *ctors, MonoArray *fields, MonoArray *properties, MonoArray *events);
952 MonoReflectionEvent *
953 mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb);
955 MonoArray *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
957 MonoArray *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
959 MonoReflectionMarshal* mono_reflection_marshal_from_marshal_spec (MonoDomain *domain, MonoClass *klass, MonoMarshalSpec *spec);
962 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token);
965 mono_image_build_metadata (MonoReflectionModuleBuilder *module);
968 mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const char *blob, void *value);
971 mono_release_type_locks (MonoThread *thread);
974 mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array);
977 mono_array_full_copy (MonoArray *src, MonoArray *dest);
980 mono_remote_class_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, MonoRealProxy *real_proxy);
982 #endif /* __MONO_OBJECT_INTERNALS_H__ */