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;
185 MonoRemoteClass *remote_class;
186 MonoBoolean custom_type_info;
187 } MonoTransparentProxy;
191 MonoReflectionMethod *method;
194 MonoArray *arg_types;
198 MonoAsyncResult *async_result;
205 gint32 native_offset;
206 MonoReflectionMethod *method;
207 MonoString *filename;
215 MonoObject *culture_info;
216 MonoObject *ui_culture_info;
217 MonoBoolean threadpool_thread;
221 MonoException *abort_exc;
222 MonoObject *abort_state;
226 gpointer *static_data;
229 GSList *appdomain_refs;
230 MonoBoolean interruption_requested;
231 gpointer suspend_event;
232 gpointer resume_event;
233 MonoObject *synch_lock;
238 MonoReflectionType *type;
240 } MonoSerializationEntry;
244 MonoObject *additional;
245 } MonoStreamingContext;
249 MonoBoolean readOnly;
250 MonoString *AMDesignator;
251 MonoString *PMDesignator;
252 MonoString *DateSeparator;
253 MonoString *TimeSeparator;
254 MonoString *ShortDatePattern;
255 MonoString *LongDatePattern;
256 MonoString *ShortTimePattern;
257 MonoString *LongTimePattern;
258 MonoString *MonthDayPattern;
259 MonoString *YearMonthPattern;
260 MonoString *FullDateTimePattern;
261 MonoString *RFC1123Pattern;
262 MonoString *SortableDateTimePattern;
263 MonoString *UniversalSortableDateTimePattern;
264 guint32 FirstDayOfWeek;
265 MonoObject *Calendar;
266 guint32 CalendarWeekRule;
267 MonoArray *AbbreviatedDayNames;
269 MonoArray *MonthNames;
270 MonoArray *AbbreviatedMonthNames;
271 MonoArray *ShortDatePatterns;
272 MonoArray *LongDatePatterns;
273 MonoArray *ShortTimePatterns;
274 MonoArray *LongTimePatterns;
275 } MonoDateTimeFormatInfo;
280 MonoBoolean readOnly;
281 MonoString *decimalFormats;
282 MonoString *currencyFormats;
283 MonoString *percentFormats;
284 MonoString *digitPattern;
285 MonoString *zeroPattern;
286 gint32 currencyDecimalDigits;
287 MonoString *currencyDecimalSeparator;
288 MonoString *currencyGroupSeparator;
289 MonoArray *currencyGroupSizes;
290 gint32 currencyNegativePattern;
291 gint32 currencyPositivePattern;
292 MonoString *currencySymbol;
293 MonoString *naNSymbol;
294 MonoString *negativeInfinitySymbol;
295 MonoString *negativeSign;
296 guint32 numberDecimalDigits;
297 MonoString *numberDecimalSeparator;
298 MonoString *numberGroupSeparator;
299 MonoArray *numberGroupSizes;
300 gint32 numberNegativePattern;
301 gint32 percentDecimalDigits;
302 MonoString *percentDecimalSeparator;
303 MonoString *percentGroupSeparator;
304 MonoArray *percentGroupSizes;
305 gint32 percentNegativePattern;
306 gint32 percentPositivePattern;
307 MonoString *percentSymbol;
308 MonoString *perMilleSymbol;
309 MonoString *positiveInfinitySymbol;
310 MonoString *positiveSign;
311 } MonoNumberFormatInfo;
316 MonoString *icu_name;
317 gpointer ICU_collator;
322 MonoBoolean is_read_only;
325 gint32 specific_lcid;
326 gint32 datetime_index;
328 MonoBoolean use_user_override;
329 MonoNumberFormatInfo *number_format;
330 MonoDateTimeFormatInfo *datetime_format;
331 MonoObject *textinfo;
333 MonoString *displayname;
334 MonoString *englishname;
335 MonoString *nativename;
336 MonoString *iso3lang;
337 MonoString *iso2lang;
338 MonoString *icu_name;
339 MonoString *win3lang;
340 MonoCompareInfo *compareinfo;
341 const gint32 *calendar_data;
352 /* remoting and async support */
355 mono_async_result_new (MonoDomain *domain, HANDLE handle,
356 MonoObject *state, gpointer data);
359 mono_wait_handle_new (MonoDomain *domain, HANDLE handle);
362 mono_message_init (MonoDomain *domain, MonoMethodMessage *this_obj,
363 MonoReflectionMethod *method, MonoArray *out_args);
366 mono_remoting_invoke (MonoObject *real_proxy, MonoMethodMessage *msg,
367 MonoObject **exc, MonoArray **out_args);
370 mono_message_invoke (MonoObject *target, MonoMethodMessage *msg,
371 MonoObject **exc, MonoArray **out_args);
374 mono_method_call_message_new (MonoMethod *method, gpointer *params, MonoMethod *invoke,
375 MonoDelegate **cb, MonoObject **state);
378 mono_method_return_message_restore (MonoMethod *method, gpointer *params, MonoArray *out_args);
381 mono_delegate_ctor (MonoObject *this_obj, MonoObject *target, gpointer addr);
383 /* runtime initialization functions */
384 typedef void (*MonoExceptionFunc) (MonoException *ex);
387 mono_install_handler (MonoExceptionFunc func);
390 mono_install_runtime_invoke (MonoInvokeFunc func);
393 mono_install_compile_method (MonoCompileFunc func);
396 mono_install_free_method (MonoFreeMethodFunc func);
399 mono_type_initialization_init (void);
401 /* Reflection and Reflection.Emit support */
404 * The followinbg structure must match the C# implementation in our corlib.
407 struct _MonoReflectionMethod {
411 MonoReflectionType *reftype;
414 struct _MonoDelegate {
416 MonoObject *target_type;
418 MonoString *method_name;
420 gpointer delegate_trampoline;
421 MonoReflectionMethod *method_info;
424 typedef struct _MonoMulticastDelegate MonoMulticastDelegate;
425 struct _MonoMulticastDelegate {
426 MonoDelegate delegate;
427 MonoMulticastDelegate *prev;
430 struct _MonoReflectionField {
433 MonoClassField *field;
435 MonoReflectionType *type;
439 struct _MonoReflectionProperty {
442 MonoProperty *property;
445 struct _MonoReflectionEvent {
453 MonoReflectionType *ClassImpl;
454 MonoObject *DefaultValueImpl;
455 MonoObject *MemberImpl;
456 MonoString *NameImpl;
459 MonoObject *MarshalAsImpl;
460 } MonoReflectionParameter;
462 struct _MonoReflectionAssembly {
464 MonoAssembly *assembly;
465 MonoObject *resolve_event_holder;
467 MonoObject *evidence; /* Evidence */
468 MonoObject *minimum; /* PermissionSet - for SecurityAction.RequestMinimum */
469 MonoObject *optional; /* PermissionSet - for SecurityAction.RequestOptional */
470 MonoObject *refuse; /* PermissionSet - for SecurityAction.RequestRefuse */
471 MonoObject *granted; /* PermissionSet - for the resolved assembly granted permissions */
472 MonoObject *denied; /* PermissionSet - for the resolved assembly denied permissions */
476 MonoReflectionType *utype;
482 MonoReflectionType *parent;
483 MonoReflectionType *ret;
490 MonoReflectionType *parent;
492 MonoReflectionMethod *get;
493 MonoReflectionMethod *set;
498 MonoReflectionType *declaring_type;
499 MonoReflectionType *reflected_type;
501 MonoReflectionMethod *add_method;
502 MonoReflectionMethod *remove_method;
503 MonoReflectionMethod *raise_method;
505 MonoArray *other_methods;
510 MonoString *name_space;
511 MonoReflectionType *etype;
512 MonoReflectionType *nested_in;
513 MonoReflectionAssembly *assembly;
515 MonoBoolean isprimitive;
521 } MonoReflectionILTokenInfo;
530 MonoArray *ex_handlers;
531 gint32 num_token_fixups;
532 MonoArray *token_fixups;
533 } MonoReflectionILGen;
540 } MonoILExceptionInfo;
543 MonoReflectionType *extype;
547 gint32 filter_offset;
548 } MonoILExceptionBlock;
552 MonoReflectionType *type;
554 MonoBoolean is_pinned;
555 } MonoReflectionLocalBuilder;
564 MonoString *marshaltype;
565 MonoReflectionType *marshaltyperef;
566 } MonoReflectionMarshal;
573 MonoReflectionMarshal *marshal_info;
577 MonoObject *def_value;
578 } MonoReflectionParamBuilder;
583 MonoReflectionILGen *ilgen;
584 MonoArray *parameters;
592 MonoBoolean init_locals;
593 MonoArray *param_modreq;
594 MonoArray *param_modopt;
595 MonoArray *permissions;
596 } MonoReflectionCtorBuilder;
601 MonoReflectionType *rtype;
602 MonoArray *parameters;
608 MonoReflectionILGen *ilgen;
612 MonoReflectionMethod *override_method;
614 MonoString *dllentry;
618 MonoBoolean init_locals;
619 MonoArray *generic_params;
620 MonoArray *return_modreq;
621 MonoArray *return_modopt;
622 MonoArray *param_modreq;
623 MonoArray *param_modopt;
624 MonoArray *permissions;
625 } MonoReflectionMethodBuilder;
630 MonoReflectionType *parent;
631 MonoReflectionType *ret;
632 MonoArray *parameters;
636 } MonoReflectionArrayMethod;
641 MonoString *filename;
644 } MonoReflectionResource;
651 } MonoReflectionWin32Resource;
656 } MonoReflectionPermissionSet;
659 MonoReflectionAssembly assembly;
660 MonoDynamicAssembly *dynamic_assembly;
661 MonoReflectionMethod *entry_point;
666 MonoArray *resources;
667 MonoArray *public_key;
673 MonoBoolean delay_sign;
675 MonoArray *loaded_modules;
676 MonoArray *win32_resources;
678 MonoArray *permissions_minimum;
679 MonoArray *permissions_optional;
680 MonoArray *permissions_refused;
681 } MonoReflectionAssemblyBuilder;
686 MonoReflectionType *type;
688 MonoObject *def_value;
691 MonoReflectionType *typeb;
694 MonoReflectionMarshal *marshal_info;
695 MonoClassField *handle;
698 } MonoReflectionFieldBuilder;
704 MonoReflectionType *type;
705 MonoArray *parameters;
707 MonoObject *def_value;
708 MonoReflectionMethodBuilder *set_method;
709 MonoReflectionMethodBuilder *get_method;
711 } MonoReflectionPropertyBuilder;
713 struct _MonoReflectionModule {
716 MonoReflectionAssembly *assembly;
719 MonoString *scopename;
720 MonoBoolean is_resource;
725 MonoReflectionModule module;
726 MonoDynamicImage *dynamic_image;
732 MonoReflectionAssemblyBuilder *assemblyb;
733 MonoArray *global_methods;
734 MonoArray *global_fields;
736 MonoArray *resources;
737 } MonoReflectionModuleBuilder;
740 MonoReflectionType type;
743 MonoReflectionType *parent;
744 MonoReflectionType *nesting_type;
745 MonoArray *interfaces;
749 MonoArray *properties;
757 MonoReflectionModuleBuilder *module;
760 MonoArray *generic_params;
761 MonoArray *permissions;
762 } MonoReflectionTypeBuilder;
765 MonoReflectionType type;
766 MonoReflectionTypeBuilder *tbuilder;
767 MonoReflectionMethodBuilder *mbuilder;
770 MonoReflectionType *base_type;
771 MonoArray *iface_constraints;
773 } MonoReflectionGenericParam;
775 typedef struct _MonoReflectionGenericInst MonoReflectionGenericInst;
776 struct _MonoReflectionGenericInst {
777 MonoReflectionType type;
778 MonoReflectionType *generic_type;
785 MonoString *codebase;
786 gint32 major, minor, build, revision;
787 /* FIXME: add missing stuff */
788 /* CultureInfo cultureinfo;
789 AssemblyNameFlags flags;
790 AssemblyHashAlgorithm hashalg;
791 StrongNameKeyPair keypair;
792 AssemblyVersionCompatibility versioncompat;*/
793 MonoObject *cultureInfo;
797 MonoArray *publicKey;
799 MonoObject *versioncompat;
800 } MonoReflectionAssemblyName;
805 MonoReflectionType *type;
806 MonoReflectionTypeBuilder *typeb;
808 MonoReflectionMethodBuilder *add_method;
809 MonoReflectionMethodBuilder *remove_method;
810 MonoReflectionMethodBuilder *raise_method;
811 MonoArray *other_methods;
814 } MonoReflectionEventBuilder;
818 MonoReflectionMethod *ctor;
820 } MonoReflectionCustomAttr;
827 MonoString *entry_point;
828 MonoBoolean exact_spelling;
829 MonoBoolean preserve_sig;
830 MonoBoolean set_last_error;
831 MonoBoolean best_fit_mapping;
832 MonoBoolean throw_on_unmappable;
833 } MonoReflectionDllImportAttribute;
839 MonoReflectionType *rtype;
840 MonoArray *parameters;
843 MonoReflectionModule *module;
844 MonoBoolean skip_visibility;
845 MonoBoolean init_locals;
846 MonoReflectionILGen *ilgen;
849 } MonoReflectionDynamicMethod;
853 MonoReflectionModuleBuilder *module;
854 MonoArray *arguments;
856 MonoReflectionType *return_type;
858 guint32 unmanaged_call_conv;
859 } MonoReflectionSigHelper;
862 RESOURCE_LOCATION_EMBEDDED = 1,
863 RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,
864 RESOURCE_LOCATION_IN_MANIFEST = 4
869 MonoReflectionAssembly *assembly;
870 MonoString *filename;
872 } MonoManifestResourceInfo;
874 /* Keep in sync with System.GenericParameterAttributes */
876 GENERIC_PARAMETER_ATTRIBUTE_NON_VARIANT = 0,
877 GENERIC_PARAMETER_ATTRIBUTE_COVARIANT = 1,
878 GENERIC_PARAMETER_ATTRIBUTE_CONTRAVARIANT = 2,
879 GENERIC_PARAMETER_ATTRIBUTE_VARIANCE_MASK = 3,
881 GENERIC_PARAMETER_ATTRIBUTE_NO_SPECIAL_CONSTRAINT = 0,
882 GENERIC_PARAMETER_ATTRIBUTE_REFERENCE_TYPE_CONSTRAINT = 4,
883 GENERIC_PARAMETER_ATTRIBUTE_VALUE_TYPE_CONSTRAINT = 8,
884 GENERIC_PARAMETER_ATTRIBUTE_CONSTRUCTOR_CONSTRAINT = 16,
885 GENREIC_PARAMETER_ATTRIBUTE_SPECIAL_CONSTRAINTS_MASK = 28
886 } GenericParameterAttributes;
888 void mono_image_create_pefile (MonoReflectionModuleBuilder *module);
889 void mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
890 MonoReflectionModule * mono_image_load_module (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name);
891 guint32 mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str);
892 guint32 mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj, gboolean create_methodspec);
893 guint32 mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, MonoArray *opt_param_types);
894 void mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
896 void mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb);
898 void mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
900 void mono_reflection_setup_generic_class (MonoReflectionTypeBuilder *tb);
902 MonoReflectionType* mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb);
904 void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m);
906 void mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam);
909 mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types);
910 MonoReflectionMethod*
911 mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types);
913 mono_reflection_generic_inst_initialize (MonoReflectionGenericInst *type, MonoArray *methods, MonoArray *ctors, MonoArray *fields, MonoArray *properties, MonoArray *events);
914 MonoReflectionEvent *
915 mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb);
917 MonoArray *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
919 MonoArray *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
921 MonoReflectionMarshal* mono_reflection_marshal_from_marshal_spec (MonoDomain *domain, MonoClass *klass, MonoMarshalSpec *spec);
924 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token);
927 mono_image_build_metadata (MonoReflectionModuleBuilder *module);
930 mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, char *blob, void *value);
933 mono_release_type_locks (MonoThread *thread);
935 #endif /* __MONO_OBJECT_INTERNALS_H__ */