5 #ifndef __MONO_OBJECT_INTERNALS_H__
6 #define __MONO_OBJECT_INTERNALS_H__
8 #include <mono/utils/mono-forward-internal.h>
9 #include <mono/metadata/object-forward.h>
10 #include <mono/metadata/handle-decl.h>
12 #include <mono/metadata/object.h>
13 #include <mono/metadata/threads.h>
14 #include <mono/metadata/reflection.h>
15 #include <mono/metadata/mempool.h>
16 #include <mono/metadata/class-internals.h>
17 #include <mono/metadata/threads-types.h>
18 #include <mono/metadata/handle.h>
19 #include <mono/metadata/abi-details.h>
20 #include "mono/utils/mono-compiler.h"
21 #include "mono/utils/mono-error.h"
22 #include "mono/utils/mono-error-internals.h"
23 #include "mono/utils/mono-machine.h"
24 #include "mono/utils/mono-stack-unwinding.h"
25 #include "mono/utils/mono-tls.h"
26 #include "mono/utils/mono-coop-mutex.h"
27 #include <mono/metadata/icalls.h>
29 /* Use this as MONO_CHECK_ARG (arg,expr,) in functions returning void */
30 #define MONO_CHECK_ARG(arg, expr, retval) do { \
31 if (G_UNLIKELY (!(expr))) \
33 if (0) { (void)(arg); } /* check if the name exists */ \
35 mono_error_set_argument_format (error, #arg, "assertion `%s' failed", #expr); \
36 mono_error_set_pending_exception (error); \
41 #define MONO_CHECK_ARG_NULL_NAMED(arg, argname, retval) do { \
42 if (G_UNLIKELY (!(arg))) \
45 mono_error_set_argument_null (error, (argname), ""); \
46 mono_error_set_pending_exception (error); \
50 /* Use this as MONO_CHECK_ARG_NULL (arg,) in functions returning void */
51 #define MONO_CHECK_ARG_NULL(arg, retval) do { \
52 if (G_UNLIKELY (!(arg))) \
54 mono_error_set_argument_null (error, #arg, ""); \
59 /* Use this as MONO_CHECK_ARG_NULL_HANDLE (arg,) in functions returning void */
60 #define MONO_CHECK_ARG_NULL_HANDLE(arg, retval) do { \
61 if (G_UNLIKELY (MONO_HANDLE_IS_NULL (arg))) \
63 mono_error_set_argument_null (error, #arg, ""); \
68 #define MONO_CHECK_ARG_NULL_HANDLE_NAMED(arg, argname, retval) do { \
69 if (G_UNLIKELY (MONO_HANDLE_IS_NULL (arg))) \
71 mono_error_set_argument_null (error, (argname), ""); \
76 /* Use this as MONO_CHECK_NULL (arg,) in functions returning void */
77 #define MONO_CHECK_NULL(arg, retval) do { \
78 if (G_UNLIKELY (!(arg))) \
81 mono_error_set_null_reference (error); \
82 mono_error_set_pending_exception (error); \
88 * Macros which cache the results of lookups locally.
89 * These should be used instead of the original versions, if the __GNUC__
90 * restriction is acceptable.
95 /* name should be a compile-time constant */
96 #define mono_class_get_field_from_name_cached(klass,name) ({ \
97 static MonoClassField *tmp_field; \
99 tmp_field = mono_class_get_field_from_name_full ((klass), (name), NULL); \
100 g_assert (tmp_field); \
103 /* eclass should be a run-time constant */
104 #define mono_array_class_get_cached(eclass,rank) ({ \
105 static MonoClass *tmp_klass; \
107 tmp_klass = mono_class_create_array ((eclass), (rank)); \
108 g_assert (tmp_klass); \
111 /* eclass should be a run-time constant */
112 #define mono_array_new_cached(domain, eclass, size, error) ({ \
113 MonoVTable *__vtable = mono_class_vtable_checked ((domain), mono_array_class_get_cached ((eclass), 1), (error)); \
114 MonoArray *__arr = NULL; \
115 if (is_ok ((error))) \
116 __arr = mono_array_new_specific_checked (__vtable, (size), (error)); \
119 /* eclass should be a run-time constant */
120 #define mono_array_new_cached_handle(domain, eclass, size, error) ({ \
121 MonoVTable *__vtable = mono_class_vtable_checked ((domain), mono_array_class_get_cached ((eclass), 1), (error)); \
122 MonoArrayHandle __arr = NULL_HANDLE_ARRAY; \
123 if (is_ok ((error))) \
124 __arr = mono_array_new_specific_handle (__vtable, (size), (error)); \
129 #define mono_class_get_field_from_name_cached(klass,name) mono_class_get_field_from_name ((klass), (name))
130 #define mono_array_class_get_cached(eclass,rank) mono_class_create_array ((eclass), (rank))
131 #define mono_array_new_cached(domain, eclass, size, error) mono_array_new_checked ((domain), (eclass), (size), (error))
132 #define mono_array_new_cached_handle(domain, eclass, size, error) (mono_array_new_handle ((domain), (eclass), (size), (error)))
136 #ifdef MONO_BIG_ARRAYS
137 typedef uint64_t mono_array_size_t
;
138 typedef int64_t mono_array_lower_bound_t
;
139 #define MONO_ARRAY_MAX_INDEX G_MAXINT64
140 #define MONO_ARRAY_MAX_SIZE G_MAXUINT64
142 typedef uint32_t mono_array_size_t
;
143 typedef int32_t mono_array_lower_bound_t
;
144 #define MONO_ARRAY_MAX_INDEX ((int32_t) 0x7fffffff)
145 #define MONO_ARRAY_MAX_SIZE ((uint32_t) 0xffffffff)
149 mono_array_size_t length
;
150 mono_array_lower_bound_t lower_bound
;
155 /* bounds is NULL for szarrays */
156 MonoArrayBounds
*bounds
;
157 /* total number of elements of the array */
158 mono_array_size_t max_length
;
159 /* we use mono_64bitaligned_t to ensure proper alignment on platforms that need it */
160 mono_64bitaligned_t vector
[MONO_ZERO_LEN_ARRAY
];
163 #define MONO_SIZEOF_MONO_ARRAY (MONO_STRUCT_OFFSET (MonoArray, vector))
168 mono_unichar2 chars
[MONO_ZERO_LEN_ARRAY
];
171 #define MONO_SIZEOF_MONO_STRING (MONO_STRUCT_OFFSET (MonoString, chars))
173 #define mono_object_class(obj) (((MonoObject*)(obj))->vtable->klass)
174 #define mono_object_domain(obj) (((MonoObject*)(obj))->vtable->domain)
176 #define mono_string_chars_fast(s) ((mono_unichar2*)(s)->chars)
177 #define mono_string_length_fast(s) ((s)->length)
180 * mono_array_length_internal:
181 * \param array a \c MonoArray*
182 * \returns the total number of elements in the array. This works for
183 * both vectors and multidimensional arrays.
185 #define mono_array_length_internal(array) ((array)->max_length)
189 mono_array_handle_length (MonoArrayHandle arr
)
191 MONO_REQ_GC_UNSAFE_MODE
;
193 return mono_array_length_internal (MONO_HANDLE_RAW (arr
));
196 // Equivalent to mono_array_addr_with_size, except:
197 // 1. A macro instead of a function -- the types of size and index are open.
198 // 2. mono_array_addr_with_size could, but does not, do GC mode transitions.
199 #define mono_array_addr_with_size_fast(array,size,index) ( ((char*)(array)->vector) + (size) * (index) )
201 #define mono_array_addr_fast(array,type,index) ((type*)(void*) mono_array_addr_with_size_fast (array, sizeof (type), index))
202 #define mono_array_get_fast(array,type,index) ( *(type*)mono_array_addr_fast ((array), type, (index)) )
203 #define mono_array_set_fast(array,type,index,value) \
205 type *__p = (type *) mono_array_addr_fast ((array), type, (index)); \
208 #define mono_array_setref_fast(array,index,value) \
210 void **__p = (void **) mono_array_addr_fast ((array), void*, (index)); \
211 mono_gc_wbarrier_set_arrayref_internal ((array), __p, (MonoObject*)(value)); \
212 /* *__p = (value);*/ \
214 #define mono_array_memcpy_refs_fast(dest,destidx,src,srcidx,count) \
216 void **__p = (void **) mono_array_addr_fast ((dest), void*, (destidx)); \
217 void **__s = mono_array_addr_fast ((src), void*, (srcidx)); \
218 mono_gc_wbarrier_arrayref_copy_internal (__p, __s, (count)); \
221 // _internal is like _fast, but preserves the preexisting subtlety of the closed types of things:
224 // in order to mimic non-_internal but without the GC mode transitions, or at least,
225 // to avoid the runtime using the embedding API, whether or not it has GC mode transitions.
227 mono_array_addr_with_size_internal (MonoArray
*array
, int size
, uintptr_t idx
)
229 return mono_array_addr_with_size_fast (array
, size
, idx
);
232 #define mono_array_addr_internal(array,type,index) ((type*)(void*) mono_array_addr_with_size_internal (array, sizeof (type), index))
233 #define mono_array_get_internal(array,type,index) ( *(type*)mono_array_addr_internal ((array), type, (index)) )
234 #define mono_array_set_internal(array,type,index,value) \
236 type *__p = (type *) mono_array_addr_internal ((array), type, (index)); \
239 #define mono_array_setref_internal(array,index,value) \
241 void **__p = (void **) mono_array_addr_internal ((array), void*, (index)); \
242 mono_gc_wbarrier_set_arrayref_internal ((array), __p, (MonoObject*)(value)); \
243 /* *__p = (value);*/ \
245 #define mono_array_memcpy_refs_internal(dest,destidx,src,srcidx,count) \
247 void **__p = (void **) mono_array_addr_internal ((dest), void*, (destidx)); \
248 void **__s = mono_array_addr_internal ((src), void*, (srcidx)); \
249 mono_gc_wbarrier_arrayref_copy_internal (__p, __s, (count)); \
252 static inline gboolean
253 mono_handle_array_has_bounds (MonoArrayHandle arr
)
255 return MONO_HANDLE_GETVAL (arr
, bounds
) != NULL
;
259 mono_handle_array_get_bounds_dim (MonoArrayHandle arr
, gint32 dim
, MonoArrayBounds
*bounds
)
261 *bounds
= MONO_HANDLE_GETVAL (arr
, bounds
[dim
]);
266 #ifndef ENABLE_NETCORE
267 MonoObject
*identity
;
269 } MonoMarshalByRefObject
;
271 TYPED_HANDLE_DECL (MonoMarshalByRefObject
);
273 /* This is a copy of System.AppDomain */
274 struct _MonoAppDomain
{
275 MonoMarshalByRefObject mbr
;
279 /* Safely access System.AppDomain from native code */
280 TYPED_HANDLE_DECL (MonoAppDomain
);
282 /* Safely access System.AppDomainSetup from native code. (struct is in domain-internals.h) */
283 TYPED_HANDLE_DECL (MonoAppDomainSetup
);
285 typedef struct _MonoStringBuilder MonoStringBuilder
;
286 TYPED_HANDLE_DECL (MonoStringBuilder
);
288 struct _MonoStringBuilder
{
290 MonoArray
*chunkChars
;
291 MonoStringBuilder
* chunkPrevious
; // Link to the block logically before this block
292 int chunkLength
; // The index in ChunkChars that represent the end of the block
293 int chunkOffset
; // The logial offset (sum of all characters in previous blocks)
298 mono_string_builder_capacity (MonoStringBuilderHandle sbh
)
300 MonoStringBuilder
*sb
= MONO_HANDLE_RAW (sbh
);
301 return sb
->chunkOffset
+ sb
->chunkChars
->max_length
;
305 mono_string_builder_string_length (MonoStringBuilderHandle sbh
)
307 MonoStringBuilder
*sb
= MONO_HANDLE_RAW (sbh
);
308 return sb
->chunkOffset
+ sb
->chunkLength
;
319 } MonoArgumentHandle
;
322 MonoMethodSignature
*sig
;
328 struct _MonoException
{
330 MonoString
*class_name
;
333 MonoObject
*inner_ex
;
334 MonoString
*help_link
;
335 /* Stores the IPs and the generic sharing infos
336 (vtable/MRGCTX) of the frames. */
337 MonoArray
*trace_ips
;
338 MonoString
*stack_trace
;
339 MonoString
*remote_stack_trace
;
340 gint32 remote_stack_index
;
341 /* Dynamic methods referenced by the stack trace */
342 MonoObject
*dynamic_methods
;
345 MonoObject
*serialization_manager
;
346 MonoObject
*captured_traces
;
347 MonoArray
*native_trace_ips
;
348 gint32 caught_in_unmanaged
;
353 } MonoSystemException
;
355 TYPED_HANDLE_DECL (MonoSystemException
);
357 #ifndef ENABLE_NETCORE
359 MonoSystemException base
;
360 MonoString
*param_name
;
361 } MonoArgumentException
;
366 MonoObject
*async_state
;
368 MonoObject
*async_delegate
;
370 MonoObject
*object_data
;
371 MonoBoolean sync_completed
;
372 MonoBoolean completed
;
373 MonoBoolean endinvoke_called
;
374 MonoObject
*async_callback
;
375 MonoObject
*execution_context
;
376 MonoObject
*original_context
;
380 TYPED_HANDLE_DECL (MonoAsyncResult
);
383 MonoMarshalByRefObject object
;
387 TYPED_HANDLE_DECL (MonoWaitHandle
);
389 /* This is a copy of System.Runtime.Remoting.Messaging.CallType */
392 CallType_BeginInvoke
= 1,
393 CallType_EndInvoke
= 2,
397 /* System.Threading.StackCrawlMark */
399 * This type is used to identify the method where execution has entered
400 * the BCL during stack walks. The outermost public method should
401 * define it like this:
402 * StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
403 * and pass the stackMark as a byref argument down the call chain
404 * until it reaches an icall.
408 STACK_CRAWL_CALLER
= 1,
409 STACK_CRAWL_CALLERS_CALLER
= 2,
410 STACK_CRAWL_THREAD
= 3
411 } MonoStackCrawlMark
;
413 /* MonoSafeHandle is in class-internals.h. */
414 /* Safely access System.Net.Sockets.SafeSocketHandle from native code */
415 TYPED_HANDLE_DECL (MonoSafeHandle
);
417 /* This corresponds to System.Type */
418 struct _MonoReflectionType
{
423 /* Safely access System.Type from native code */
424 TYPED_HANDLE_DECL (MonoReflectionType
);
426 /* This corresponds to System.RuntimeType */
428 MonoReflectionType type
;
429 MonoObject
*type_info
;
430 } MonoReflectionMonoType
;
432 TYPED_HANDLE_DECL (MonoReflectionMonoType
);
436 MonoReflectionType
*class_to_proxy
;
438 MonoObject
*unwrapped_server
;
439 gint32 target_domain_id
;
440 MonoString
*target_uri
;
441 MonoObject
*object_identity
;
443 MonoObject
*stub_data
;
446 /* Safely access System.Runtime.Remoting.Proxies.RealProxy from native code */
447 TYPED_HANDLE_DECL (MonoRealProxy
);
449 typedef struct _MonoIUnknown MonoIUnknown
;
450 typedef struct _MonoIUnknownVTable MonoIUnknownVTable
;
452 /* STDCALL on windows, CDECL everywhere else to work with XPCOM and MainWin COM */
454 #define STDCALL __stdcall
459 struct _MonoIUnknownVTable
461 int (STDCALL
*QueryInterface
)(MonoIUnknown
*pUnk
, gconstpointer riid
, gpointer
* ppv
);
462 int (STDCALL
*AddRef
)(MonoIUnknown
*pUnk
);
463 int (STDCALL
*Release
)(MonoIUnknown
*pUnk
);
468 const MonoIUnknownVTable
*vtable
;
472 MonoMarshalByRefObject object
;
473 MonoIUnknown
*iunknown
;
474 GHashTable
* itf_hash
;
475 MonoObject
*synchronization_context
;
478 TYPED_HANDLE_DECL (MonoComObject
);
481 MonoRealProxy real_proxy
;
482 MonoComObject
*com_object
;
484 } MonoComInteropProxy
;
486 TYPED_HANDLE_DECL (MonoComInteropProxy
);
491 MonoRemoteClass
*remote_class
;
492 MonoBoolean custom_type_info
;
493 } MonoTransparentProxy
;
495 /* Safely access System.Runtime.Remoting.Proxies.TransparentProxy from native code */
496 TYPED_HANDLE_DECL (MonoTransparentProxy
);
500 MonoReflectionMethod
*method
;
503 MonoArray
*arg_types
;
507 MonoAsyncResult
*async_result
;
511 TYPED_HANDLE_DECL (MonoMethodMessage
);
513 /* Keep in sync with the System.MonoAsyncCall */
516 MonoMethodMessage
*msg
;
517 MonoMethod
*cb_method
;
518 MonoDelegate
*cb_target
;
524 TYPED_HANDLE_DECL (MonoAsyncCall
);
529 MonoArray
*captured_traces
;
530 MonoBoolean debug_info
;
533 TYPED_HANDLE_DECL (MonoStackTrace
);
538 gint32 native_offset
;
539 gint64 method_address
;
541 MonoReflectionMethod
*method
;
542 MonoString
*filename
;
545 MonoString
*internal_method_name
;
548 TYPED_HANDLE_DECL (MonoStackFrame
);
551 MONO_THREAD_FLAG_DONT_MANAGE
= 1, // Don't wait for or abort this thread
552 MONO_THREAD_FLAG_NAME_SET
= 2, // Thread name set from managed code
553 MONO_THREAD_FLAG_APPDOMAIN_ABORT
= 4, // Current requested abort originates from appdomain unload
556 struct _MonoThreadInfo
;
558 typedef struct MonoThreadName
{
559 char* volatile chars
; // null check outside of lock
560 gsize
volatile generation
; // read outside of lock
566 mono_gstring_append_thread_name (GString
*, MonoInternalThread
*);
569 #ifdef ENABLE_NETCORE
571 * There is only one thread object, MonoInternalThread is aliased to MonoThread,
572 * thread->internal_thread points to itself.
576 struct _MonoInternalThread
{
578 // FIXME: Mechanize keeping this in sync with managed.
580 volatile int lock_thread_id
; /* to be used as the pre-shifted thread id in thin locks. Used for appdomain_ref push/pop */
581 MonoThreadHandle
*handle
;
582 gpointer native_handle
;
584 guint32 state
; /* must be accessed while longlived->synch_cs is locked */
585 MonoException
*abort_exc
;
586 int abort_state_handle
;
587 guint64 tid
; /* This is accessed as a gsize in the code (so it can hold a 64bit pointer on systems that need it), but needs to reserve 64 bits of space on all machines as it corresponds to a field in managed code */
588 gsize debugger_thread
; // FIXME switch to bool as soon as CI testing with corlib version bump works
589 gpointer
*static_data
;
590 struct _MonoThreadInfo
*thread_info
;
591 MonoAppContext
*current_appcontext
;
592 MonoThread
*root_domain_thread
;
593 MonoObject
*_serialized_principal
;
594 int _serialized_principal_version
;
595 gpointer appdomain_refs
;
596 /* This is modified using atomic ops, so keep it a gint32 */
597 gint32 __interruption_requested
;
598 /* data that must live as long as this managed object is not finalized
599 * or as long as the underlying thread is attached, whichever is
601 MonoLongLivedThreadData
*longlived
;
602 MonoBoolean threadpool_thread
;
603 MonoBoolean thread_interrupt_requested
;
605 guint8 apartment_state
;
606 gint32 critical_region_level
;
609 MonoThreadManageCallback manage_callback
;
611 gpointer thread_pinning_ref
;
612 gsize __abort_protected_block_count
;
614 GPtrArray
*owned_mutexes
;
615 MonoOSEvent
*suspended
;
616 gint32 self_suspended
; // TRUE | FALSE
619 #ifdef ENABLE_NETCORE
620 struct _MonoThread
*internal_thread
;
621 MonoObject
*start_obj
;
622 MonoException
*pending_exception
;
624 void* unused
[3]; // same size as netcore
626 /* This is used only to check that we are in sync between the representation
627 * of MonoInternalThread in native and InternalThread in managed
629 * DO NOT RENAME! DO NOT ADD FIELDS AFTER! */
633 #ifdef ENABLE_NETCORE
634 #define _MonoInternalThread _MonoThread
638 MonoInternalThread
*internal_thread
;
639 MonoObject
*start_obj
;
640 MonoException
*pending_exception
;
646 MonoObject
*additional
;
647 } MonoStreamingContext
;
652 MonoBoolean readOnly
;
653 MonoString
*AMDesignator
;
654 MonoString
*PMDesignator
;
655 MonoString
*DateSeparator
;
656 MonoString
*TimeSeparator
;
657 MonoString
*ShortDatePattern
;
658 MonoString
*LongDatePattern
;
659 MonoString
*ShortTimePattern
;
660 MonoString
*LongTimePattern
;
661 MonoString
*MonthDayPattern
;
662 MonoString
*YearMonthPattern
;
663 guint32 FirstDayOfWeek
;
664 guint32 CalendarWeekRule
;
665 MonoArray
*AbbreviatedDayNames
;
667 MonoArray
*MonthNames
;
668 MonoArray
*GenitiveMonthNames
;
669 MonoArray
*AbbreviatedMonthNames
;
670 MonoArray
*GenitiveAbbreviatedMonthNames
;
671 MonoArray
*ShortDatePatterns
;
672 MonoArray
*LongDatePatterns
;
673 MonoArray
*ShortTimePatterns
;
674 MonoArray
*LongTimePatterns
;
675 MonoArray
*MonthDayPatterns
;
676 MonoArray
*YearMonthPatterns
;
677 MonoArray
*ShortestDayNames
;
678 } MonoDateTimeFormatInfo
;
683 MonoArray
*numberGroupSizes
;
684 MonoArray
*currencyGroupSizes
;
685 MonoArray
*percentGroupSizes
;
686 MonoString
*positiveSign
;
687 MonoString
*negativeSign
;
688 MonoString
*numberDecimalSeparator
;
689 MonoString
*numberGroupSeparator
;
690 MonoString
*currencyGroupSeparator
;
691 MonoString
*currencyDecimalSeparator
;
692 MonoString
*currencySymbol
;
693 MonoString
*ansiCurrencySymbol
; /* unused */
694 MonoString
*naNSymbol
;
695 MonoString
*positiveInfinitySymbol
;
696 MonoString
*negativeInfinitySymbol
;
697 MonoString
*percentDecimalSeparator
;
698 MonoString
*percentGroupSeparator
;
699 MonoString
*percentSymbol
;
700 MonoString
*perMilleSymbol
;
701 MonoString
*nativeDigits
; /* unused */
702 gint32 dataItem
; /* unused */
703 guint32 numberDecimalDigits
;
704 gint32 currencyDecimalDigits
;
705 gint32 currencyPositivePattern
;
706 gint32 currencyNegativePattern
;
707 gint32 numberNegativePattern
;
708 gint32 percentPositivePattern
;
709 gint32 percentNegativePattern
;
710 gint32 percentDecimalDigits
;
711 } MonoNumberFormatInfo
;
716 MonoString
*icu_name
;
717 gpointer ICU_collator
;
722 MonoString
*NativeName
;
723 MonoArray
*ShortDatePatterns
;
724 MonoArray
*YearMonthPatterns
;
725 MonoArray
*LongDatePatterns
;
726 MonoString
*MonthDayPattern
;
729 MonoArray
*AbbreviatedEraNames
;
730 MonoArray
*AbbreviatedEnglishEraNames
;
732 MonoArray
*AbbreviatedDayNames
;
733 MonoArray
*SuperShortDayNames
;
734 MonoArray
*MonthNames
;
735 MonoArray
*AbbreviatedMonthNames
;
736 MonoArray
*GenitiveMonthNames
;
737 MonoArray
*GenitiveAbbreviatedMonthNames
;
740 TYPED_HANDLE_DECL (MonoCalendarData
);
744 MonoString
*AMDesignator
;
745 MonoString
*PMDesignator
;
746 MonoString
*TimeSeparator
;
747 MonoArray
*LongTimePatterns
;
748 MonoArray
*ShortTimePatterns
;
749 guint32 FirstDayOfWeek
;
750 guint32 CalendarWeekRule
;
753 TYPED_HANDLE_DECL (MonoCultureData
);
757 MonoBoolean is_read_only
;
760 gint32 datetime_index
;
762 gint32 calendar_type
;
763 MonoBoolean use_user_override
;
764 MonoNumberFormatInfo
*number_format
;
765 MonoDateTimeFormatInfo
*datetime_format
;
766 MonoObject
*textinfo
;
768 MonoString
*englishname
;
769 MonoString
*nativename
;
770 MonoString
*iso3lang
;
771 MonoString
*iso2lang
;
772 MonoString
*win3lang
;
773 MonoString
*territory
;
774 MonoArray
*native_calendar_names
;
775 MonoCompareInfo
*compareinfo
;
776 const void* text_info_data
;
779 TYPED_HANDLE_DECL (MonoCultureInfo
);
784 MonoString
*iso2name
;
785 MonoString
*iso3name
;
786 MonoString
*win3name
;
787 MonoString
*english_name
;
788 MonoString
*native_name
;
789 MonoString
*currency_symbol
;
790 MonoString
*iso_currency_symbol
;
791 MonoString
*currency_english_name
;
792 MonoString
*currency_native_name
;
795 TYPED_HANDLE_DECL (MonoRegionInfo
);
797 #endif /* !ENABLE_NETCORE */
802 } MonoInterfaceTypeAttribute
;
804 /* Safely access System.Delegate from native code */
805 TYPED_HANDLE_DECL (MonoDelegate
);
808 * Callbacks supplied by the runtime and called by the modules in metadata/
809 * This interface is easier to extend than adding a new function type +
810 * a new 'install' function for every callback.
813 gpointer (*create_ftnptr
) (MonoDomain
*domain
, gpointer addr
);
814 gpointer (*get_addr_from_ftnptr
) (gpointer descr
);
815 char* (*get_runtime_build_info
) (void);
816 const char* (*get_runtime_build_version
) (void);
817 gpointer (*get_vtable_trampoline
) (MonoVTable
*vtable
, int slot_index
);
818 gpointer (*get_imt_trampoline
) (MonoVTable
*vtable
, int imt_slot_index
);
819 gboolean (*imt_entry_inited
) (MonoVTable
*vtable
, int imt_slot_index
);
820 void (*set_cast_details
) (MonoClass
*from
, MonoClass
*to
);
821 void (*debug_log
) (int level
, MonoStringHandle category
, MonoStringHandle message
);
822 gboolean (*debug_log_is_enabled
) (void);
823 void (*init_delegate
) (MonoDelegateHandle delegate
, MonoError
*error
);
824 MonoObject
* (*runtime_invoke
) (MonoMethod
*method
, void *obj
, void **params
, MonoObject
**exc
, MonoError
*error
);
825 void* (*compile_method
) (MonoMethod
*method
, MonoError
*error
);
826 gpointer (*create_jump_trampoline
) (MonoDomain
*domain
, MonoMethod
*method
, gboolean add_sync_wrapper
, MonoError
*error
);
827 gpointer (*create_jit_trampoline
) (MonoDomain
*domain
, MonoMethod
*method
, MonoError
*error
);
828 /* used to free a dynamic method */
829 void (*free_method
) (MonoDomain
*domain
, MonoMethod
*method
);
830 gpointer (*create_remoting_trampoline
) (MonoDomain
*domain
, MonoMethod
*method
, MonoRemotingTarget target
, MonoError
*error
);
831 gpointer (*create_delegate_trampoline
) (MonoDomain
*domain
, MonoClass
*klass
);
832 gpointer (*interp_get_remoting_invoke
) (MonoMethod
*method
, gpointer imethod
, MonoError
*error
);
833 GHashTable
*(*get_weak_field_indexes
) (MonoImage
*image
);
834 void (*install_state_summarizer
) (void);
835 gboolean (*is_interpreter_enabled
) (void);
836 } MonoRuntimeCallbacks
;
838 typedef gboolean (*MonoInternalStackWalk
) (MonoStackFrameInfo
*frame
, MonoContext
*ctx
, gpointer data
);
839 typedef gboolean (*MonoInternalExceptionFrameWalk
) (MonoMethod
*method
, gpointer ip
, size_t native_offset
, gboolean managed
, gpointer user_data
);
842 void (*mono_walk_stack_with_ctx
) (MonoInternalStackWalk func
, MonoContext
*ctx
, MonoUnwindOptions options
, void *user_data
);
843 void (*mono_walk_stack_with_state
) (MonoInternalStackWalk func
, MonoThreadUnwindState
*state
, MonoUnwindOptions options
, void *user_data
);
844 void (*mono_raise_exception
) (MonoException
*ex
);
845 void (*mono_raise_exception_with_ctx
) (MonoException
*ex
, MonoContext
*ctx
);
846 gboolean (*mono_exception_walk_trace
) (MonoException
*ex
, MonoInternalExceptionFrameWalk func
, gpointer user_data
);
847 gboolean (*mono_install_handler_block_guard
) (MonoThreadUnwindState
*unwind_state
);
848 void (*mono_uninstall_current_handler_block_guard
) (void);
849 gboolean (*mono_current_thread_has_handle_block_guard
) (void);
850 gboolean (*mono_above_abort_threshold
) (void);
851 void (*mono_clear_abort_threshold
) (void);
852 void (*mono_reraise_exception
) (MonoException
*ex
);
853 void (*mono_summarize_managed_stack
) (MonoThreadSummary
*out
);
854 void (*mono_summarize_unmanaged_stack
) (MonoThreadSummary
*out
);
855 void (*mono_summarize_exception
) (MonoException
*exc
, MonoThreadSummary
*out
);
856 void (*mono_register_native_library
) (const char *module_path
, const char *module_name
);
857 void (*mono_allow_all_native_libraries
) (void);
858 } MonoRuntimeExceptionHandlingCallbacks
;
860 MONO_COLD
void mono_set_pending_exception (MonoException
*exc
);
862 /* remoting and async support */
865 mono_async_result_new (MonoDomain
*domain
, gpointer handle
,
866 MonoObject
*state
, gpointer data
, MonoObject
*object_data
, MonoError
*error
);
868 mono_wait_handle_new (MonoDomain
*domain
, gpointer handle
, MonoError
*error
);
871 mono_wait_handle_get_handle (MonoWaitHandle
*handle
);
874 mono_message_init (MonoDomain
*domain
, MonoMethodMessage
*this_obj
,
875 MonoReflectionMethod
*method
, MonoArray
*out_args
, MonoError
*error
);
878 mono_method_call_message_new (MonoMethod
*method
, gpointer
*params
, MonoMethod
*invoke
,
879 MonoDelegate
**cb
, MonoObject
**state
, MonoError
*error
);
882 mono_method_return_message_restore (MonoMethod
*method
, gpointer
*params
, MonoArray
*out_args
, MonoError
*error
);
885 mono_delegate_ctor_with_method (MonoObjectHandle this_obj
, MonoObjectHandle target
, gpointer addr
, MonoMethod
*method
, MonoError
*error
);
888 mono_delegate_ctor (MonoObjectHandle this_obj
, MonoObjectHandle target
, gpointer addr
, MonoError
*error
);
891 mono_get_delegate_invoke_checked (MonoClass
*klass
, MonoError
*error
);
894 mono_get_delegate_begin_invoke_checked (MonoClass
*klass
, MonoError
*error
);
897 mono_get_delegate_end_invoke_checked (MonoClass
*klass
, MonoError
*error
);
900 mono_runtime_free_method (MonoDomain
*domain
, MonoMethod
*method
);
903 mono_install_callbacks (MonoRuntimeCallbacks
*cbs
);
905 MonoRuntimeCallbacks
*
906 mono_get_runtime_callbacks (void);
909 mono_install_eh_callbacks (MonoRuntimeExceptionHandlingCallbacks
*cbs
);
911 MonoRuntimeExceptionHandlingCallbacks
*
912 mono_get_eh_callbacks (void);
915 mono_raise_exception_deprecated (MonoException
*ex
);
918 mono_reraise_exception_deprecated (MonoException
*ex
);
921 mono_raise_exception_with_context (MonoException
*ex
, MonoContext
*ctx
);
924 mono_type_initialization_init (void);
927 mono_type_initialization_cleanup (void);
930 mono_thread_kill (MonoInternalThread
*thread
, int signal
);
933 mono_thread_get_tls_key (void);
936 mono_thread_get_tls_offset (void);
939 mono_domain_get_tls_key (void);
942 mono_domain_get_tls_offset (void);
944 /* Reflection and Reflection.Emit support */
947 * Handling System.Type objects:
949 * Fields defined as System.Type in managed code should be defined as MonoObject*
950 * in unmanaged structures, and the monotype_cast () function should be used for
951 * casting them to MonoReflectionType* to avoid crashes/security issues when
952 * encountering instances of user defined subclasses of System.Type.
955 #define IS_MONOTYPE(obj) (!(obj) || (m_class_get_image (mono_object_class ((obj))) == mono_defaults.corlib && ((MonoReflectionType*)(obj))->type != NULL))
957 #define IS_MONOTYPE_HANDLE(obj) IS_MONOTYPE (MONO_HANDLE_RAW (obj))
959 /* This should be used for accessing members of Type[] arrays */
960 #define mono_type_array_get(arr,index) monotype_cast (mono_array_get_internal ((arr), gpointer, (index)))
963 * Cast an object to MonoReflectionType, making sure it is a System.MonoType or
966 static inline MonoReflectionType
*
967 monotype_cast (MonoObject
*obj
)
969 g_assert (IS_MONOTYPE (obj
));
971 return (MonoReflectionType
*)obj
;
975 * The following structure must match the C# implementation in our corlib.
978 struct _MonoReflectionMethod
{
982 MonoReflectionType
*reftype
;
985 /* Safely access System.Reflection.MonoMethod from native code */
986 TYPED_HANDLE_DECL (MonoReflectionMethod
);
988 struct _MonoDelegate
{
990 /* The compiled code of the target method */
992 /* The invoke code */
993 gpointer invoke_impl
;
996 gpointer delegate_trampoline
;
997 /* Extra argument passed to the target method in llvmonly mode */
1000 * If non-NULL, this points to a memory location which stores the address of
1001 * the compiled code of the method, or NULL if it is not yet compiled.
1003 guint8
**method_code
;
1004 gpointer interp_method
;
1005 /* Interp method that is executed when invoking the delegate */
1006 gpointer interp_invoke_impl
;
1007 MonoReflectionMethod
*method_info
;
1008 MonoReflectionMethod
*original_method_info
;
1010 MonoBoolean method_is_virtual
;
1013 typedef struct _MonoMulticastDelegate MonoMulticastDelegate
;
1014 struct _MonoMulticastDelegate
{
1015 MonoDelegate delegate
;
1016 MonoArray
*delegates
;
1019 /* Safely access System.MulticastDelegate from native code */
1020 TYPED_HANDLE_DECL (MonoMulticastDelegate
);
1022 struct _MonoReflectionField
{
1025 MonoClassField
*field
;
1027 MonoReflectionType
*type
;
1031 /* Safely access System.Reflection.MonoField from native code */
1032 TYPED_HANDLE_DECL (MonoReflectionField
);
1034 struct _MonoReflectionProperty
{
1037 MonoProperty
*property
;
1040 /* Safely access System.Reflection.MonoProperty from native code */
1041 TYPED_HANDLE_DECL (MonoReflectionProperty
);
1043 /*This is System.EventInfo*/
1044 struct _MonoReflectionEvent
{
1046 #ifndef ENABLE_NETCORE
1047 MonoObject
*cached_add_event
;
1051 /* Safely access System.Reflection.EventInfo from native code */
1052 TYPED_HANDLE_DECL (MonoReflectionEvent
);
1055 MonoReflectionEvent object
;
1058 } MonoReflectionMonoEvent
;
1060 /* Safely access Systme.Reflection.MonoEvent from native code */
1061 TYPED_HANDLE_DECL (MonoReflectionMonoEvent
);
1065 } MonoReflectionParameter
;
1067 /* Safely access System.Reflection.ParameterInfo from native code */
1068 TYPED_HANDLE_DECL (MonoReflectionParameter
);
1070 struct _MonoReflectionMethodBody
{
1074 /* Safely access System.Reflection.MethodBody from native code */
1075 TYPED_HANDLE_DECL (MonoReflectionMethodBody
);
1077 /* System.RuntimeAssembly */
1078 struct _MonoReflectionAssembly
{
1080 MonoAssembly
*assembly
;
1082 MonoObject
*evidence
; /* Evidence */
1086 MonoReflectionType
*utype
;
1092 MonoReflectionType
*parent
;
1093 MonoReflectionType
*ret
;
1100 MonoReflectionType
*parent
;
1101 MonoReflectionType
*declaring_type
;
1103 MonoReflectionMethod
*get
;
1104 MonoReflectionMethod
*set
;
1109 MonoReflectionType
*declaring_type
;
1110 MonoReflectionType
*reflected_type
;
1112 MonoReflectionMethod
*add_method
;
1113 MonoReflectionMethod
*remove_method
;
1114 MonoReflectionMethod
*raise_method
;
1116 MonoArray
*other_methods
;
1121 MonoString
*name_space
;
1122 MonoReflectionType
*etype
;
1123 MonoReflectionType
*nested_in
;
1124 MonoReflectionAssembly
*assembly
;
1126 MonoBoolean isprimitive
;
1132 } MonoReflectionILTokenInfo
;
1141 MonoArray
*ex_handlers
;
1142 gint32 num_token_fixups
;
1143 MonoArray
*token_fixups
;
1144 } MonoReflectionILGen
;
1147 MonoArray
*handlers
;
1151 } MonoILExceptionInfo
;
1158 gint32 filter_offset
;
1159 } MonoILExceptionBlock
;
1163 MonoObject
*catch_type
;
1164 gint32 filter_offset
;
1168 gint32 handler_offset
;
1169 gint32 handler_length
;
1170 } MonoReflectionExceptionHandlingClause
;
1173 /* Safely access System.Reflection.ExceptionHandlingClause from native code */
1174 TYPED_HANDLE_DECL (MonoReflectionExceptionHandlingClause
);
1178 MonoReflectionType
*local_type
;
1179 MonoBoolean is_pinned
;
1180 guint16 local_index
;
1181 } MonoReflectionLocalVariableInfo
;
1183 /* Safely access System.Reflection.LocalVariableInfo from native code */
1184 TYPED_HANDLE_DECL (MonoReflectionLocalVariableInfo
);
1188 * Must have the same layout as MonoReflectionLocalVariableInfo, since
1189 * LocalBuilder inherits from it under net 2.0.
1193 MonoBoolean is_pinned
;
1194 guint16 local_index
;
1196 } MonoReflectionLocalBuilder
;
1204 MonoString
*mcookie
;
1205 MonoString
*marshaltype
;
1206 MonoObject
*marshaltyperef
;
1208 MonoBoolean has_size
;
1209 } MonoReflectionMarshal
;
1213 MonoObject
* methodb
;
1216 MonoReflectionMarshal
*marshal_info
;
1220 MonoObject
*def_value
;
1221 } MonoReflectionParamBuilder
;
1225 MonoMethod
*mhandle
;
1226 MonoReflectionILGen
*ilgen
;
1227 MonoArray
*parameters
;
1235 MonoBoolean init_locals
;
1236 MonoArray
*param_modreq
;
1237 MonoArray
*param_modopt
;
1238 MonoArray
*permissions
;
1239 } MonoReflectionCtorBuilder
;
1241 /* Safely access System.Reflection.Emit.ConstructorBuilder from native code */
1242 TYPED_HANDLE_DECL (MonoReflectionCtorBuilder
);
1246 MonoMethod
*mhandle
;
1248 MonoArray
*parameters
;
1254 MonoReflectionILGen
*ilgen
;
1258 MonoArray
*override_methods
;
1260 MonoString
*dllentry
;
1262 guint32 extra_flags
;
1265 MonoBoolean init_locals
;
1266 MonoGenericContainer
*generic_container
;
1267 MonoArray
*generic_params
;
1268 MonoArray
*return_modreq
;
1269 MonoArray
*return_modopt
;
1270 MonoArray
*param_modreq
;
1271 MonoArray
*param_modopt
;
1272 MonoArray
*permissions
;
1273 } MonoReflectionMethodBuilder
;
1275 /* Safely access System.Reflection.Emit.MethodBuilder from native code */
1276 TYPED_HANDLE_DECL (MonoReflectionMethodBuilder
);
1280 MonoMethod
*mhandle
;
1281 MonoReflectionType
*parent
;
1282 MonoReflectionType
*ret
;
1283 MonoArray
*parameters
;
1287 } MonoReflectionArrayMethod
;
1289 /* Safely access System.Reflection.Emit.MonoArrayMethod from native code */
1290 TYPED_HANDLE_DECL (MonoReflectionArrayMethod
);
1295 MonoString
*filename
;
1299 } MonoReflectionResource
;
1305 MonoArray
*res_data
;
1306 } MonoReflectionWin32Resource
;
1311 } MonoReflectionPermissionSet
;
1314 MonoReflectionAssembly assembly
;
1315 MonoDynamicAssembly
*dynamic_assembly
;
1316 MonoReflectionMethod
*entry_point
;
1321 MonoArray
*resources
;
1322 MonoArray
*public_key
;
1323 MonoString
*version
;
1324 MonoString
*culture
;
1328 MonoBoolean delay_sign
;
1330 MonoArray
*loaded_modules
;
1331 MonoArray
*win32_resources
;
1333 MonoArray
*permissions_minimum
;
1334 MonoArray
*permissions_optional
;
1335 MonoArray
*permissions_refused
;
1338 MonoBoolean corlib_internal
;
1339 MonoArray
*type_forwarders
;
1340 MonoArray
*pktoken
; /* as hexadecimal byte[] */
1341 } MonoReflectionAssemblyBuilder
;
1343 /* Safely access System.Reflection.Emit.AssemblyBuilder from native code */
1344 TYPED_HANDLE_DECL (MonoReflectionAssemblyBuilder
);
1351 MonoObject
*def_value
;
1353 MonoReflectionType
*typeb
;
1354 MonoArray
*rva_data
;
1356 MonoReflectionMarshal
*marshal_info
;
1357 MonoClassField
*handle
;
1360 } MonoReflectionFieldBuilder
;
1362 /* Safely access System.Reflection.Emit.FieldBuilder from native code */
1363 TYPED_HANDLE_DECL (MonoReflectionFieldBuilder
);
1370 MonoArray
*parameters
;
1372 MonoObject
*def_value
;
1373 MonoReflectionMethodBuilder
*set_method
;
1374 MonoReflectionMethodBuilder
*get_method
;
1376 MonoObject
*type_builder
;
1377 MonoArray
*returnModReq
;
1378 MonoArray
*returnModOpt
;
1379 MonoArray
*paramModReq
;
1380 MonoArray
*paramModOpt
;
1382 } MonoReflectionPropertyBuilder
;
1384 /* System.RuntimeModule */
1385 struct _MonoReflectionModule
{
1388 MonoReflectionAssembly
*assembly
;
1391 MonoString
*scopename
;
1392 MonoBoolean is_resource
;
1396 /* Safely access System.Reflection.Module from native code */
1397 TYPED_HANDLE_DECL (MonoReflectionModule
);
1400 MonoReflectionModule module
;
1401 MonoDynamicImage
*dynamic_image
;
1407 MonoReflectionAssemblyBuilder
*assemblyb
;
1408 MonoArray
*global_methods
;
1409 MonoArray
*global_fields
;
1411 MonoArray
*resources
;
1412 GHashTable
*unparented_classes
;
1413 MonoArray
*table_indexes
;
1414 } MonoReflectionModuleBuilder
;
1416 /* Safely acess System.Reflection.Emit.ModuleBuidler from native code */
1417 TYPED_HANDLE_DECL (MonoReflectionModuleBuilder
);
1420 MonoTypeBuilderNew
= 0,
1421 MonoTypeBuilderEntered
= 1,
1422 MonoTypeBuilderFinished
= 2
1423 } MonoTypeBuilderState
;
1425 struct _MonoReflectionTypeBuilder
{
1426 MonoReflectionType type
;
1430 MonoReflectionType
*nesting_type
;
1431 MonoArray
*interfaces
;
1435 MonoArray
*properties
;
1440 MonoArray
*subtypes
;
1443 MonoReflectionModuleBuilder
*module
;
1445 gint32 packing_size
;
1446 MonoGenericContainer
*generic_container
;
1447 MonoArray
*generic_params
;
1448 MonoArray
*permissions
;
1449 MonoReflectionType
*created
;
1454 MonoReflectionType type
;
1455 MonoReflectionType
*element_type
;
1457 } MonoReflectionArrayType
;
1459 /* Safely access System.Reflection.Emit.ArrayType (in DerivedTypes.cs) from native code */
1460 TYPED_HANDLE_DECL (MonoReflectionArrayType
);
1463 MonoReflectionType type
;
1464 MonoReflectionType
*element_type
;
1465 } MonoReflectionDerivedType
;
1467 /* Safely access System.Reflection.Emit.SymbolType and subclasses (in DerivedTypes.cs) from native code */
1468 TYPED_HANDLE_DECL (MonoReflectionDerivedType
);
1471 MonoReflectionType type
;
1472 MonoReflectionTypeBuilder
*tbuilder
;
1473 MonoReflectionMethodBuilder
*mbuilder
;
1476 MonoReflectionType
*base_type
;
1477 MonoArray
*iface_constraints
;
1480 } MonoReflectionGenericParam
;
1482 /* Safely access System.Reflection.Emit.GenericTypeParameterBuilder from native code */
1483 TYPED_HANDLE_DECL (MonoReflectionGenericParam
);
1486 MonoReflectionType type
;
1487 MonoReflectionTypeBuilder
*tb
;
1488 } MonoReflectionEnumBuilder
;
1490 /* Safely access System.Reflection.Emit.EnumBuilder from native code */
1491 TYPED_HANDLE_DECL (MonoReflectionEnumBuilder
);
1493 typedef struct _MonoReflectionGenericClass MonoReflectionGenericClass
;
1494 struct _MonoReflectionGenericClass
{
1495 MonoReflectionType type
;
1496 MonoReflectionType
*generic_type
; /*Can be either a MonoType or a TypeBuilder*/
1497 MonoArray
*type_arguments
;
1500 /* Safely access System.Reflection.Emit.TypeBuilderInstantiation from native code */
1501 TYPED_HANDLE_DECL (MonoReflectionGenericClass
);
1506 MonoString
*codebase
;
1507 gint32 major
, minor
, build
, revision
;
1508 MonoObject
*cultureInfo
;
1511 MonoObject
*keypair
;
1512 MonoArray
*publicKey
;
1513 MonoArray
*keyToken
;
1514 guint32 versioncompat
;
1515 MonoObject
*version
;
1516 guint32 processor_architecture
;
1517 } MonoReflectionAssemblyName
;
1519 /* Safely access System.Reflection.AssemblyName from native code */
1520 TYPED_HANDLE_DECL (MonoReflectionAssemblyName
);
1525 MonoReflectionType
*type
;
1526 MonoReflectionTypeBuilder
*typeb
;
1528 MonoReflectionMethodBuilder
*add_method
;
1529 MonoReflectionMethodBuilder
*remove_method
;
1530 MonoReflectionMethodBuilder
*raise_method
;
1531 MonoArray
*other_methods
;
1534 } MonoReflectionEventBuilder
;
1538 MonoReflectionMethod
*ctor
;
1540 } MonoReflectionCustomAttr
;
1542 TYPED_HANDLE_DECL (MonoReflectionCustomAttr
);
1548 gint32 safe_array_subtype
;
1549 MonoReflectionType
*marshal_safe_array_user_defined_subtype
;
1550 gint32 IidParameterIndex
;
1551 guint32 array_subtype
;
1552 gint16 size_param_index
;
1554 MonoString
*marshal_type
;
1555 MonoReflectionType
*marshal_type_ref
;
1556 MonoString
*marshal_cookie
;
1557 } MonoReflectionMarshalAsAttribute
;
1561 MonoString
*marshal_cookie
;
1562 MonoString
*marshal_type
;
1563 MonoReflectionType
*marshal_type_ref
;
1564 MonoReflectionType
*marshal_safe_array_user_defined_subtype
;
1566 guint32 array_subtype
;
1567 gint32 safe_array_subtype
;
1569 gint32 IidParameterIndex
;
1570 gint16 size_param_index
;
1571 } MonoReflectionMarshalAsAttribute
;
1574 /* Safely access System.Runtime.InteropServices.MarshalAsAttribute */
1575 TYPED_HANDLE_DECL (MonoReflectionMarshalAsAttribute
);
1581 MonoBoolean best_fit_mapping
;
1582 MonoBoolean throw_on_unmappable
;
1583 MonoBoolean set_last_error
;
1584 } MonoReflectionUnmanagedFunctionPointerAttribute
;
1589 } MonoReflectionGuidAttribute
;
1593 MonoMethod
*mhandle
;
1595 MonoReflectionType
*rtype
;
1596 MonoArray
*parameters
;
1599 MonoReflectionModule
*module
;
1600 MonoBoolean skip_visibility
;
1601 MonoBoolean init_locals
;
1602 MonoReflectionILGen
*ilgen
;
1605 GSList
*referenced_by
;
1606 MonoReflectionType
*owner
;
1607 } MonoReflectionDynamicMethod
;
1609 /* Safely access System.Reflection.Emit.DynamicMethod from native code */
1610 TYPED_HANDLE_DECL (MonoReflectionDynamicMethod
);
1614 MonoReflectionModuleBuilder
*module
;
1615 MonoArray
*arguments
;
1617 MonoReflectionType
*return_type
;
1619 guint32 unmanaged_call_conv
;
1622 } MonoReflectionSigHelper
;
1624 /* Safely access System.Reflection.Emit.SignatureHelper from native code */
1625 TYPED_HANDLE_DECL (MonoReflectionSigHelper
);
1629 MonoBoolean visible
;
1630 } MonoReflectionComVisibleAttribute
;
1634 MonoReflectionType
*type
;
1635 } MonoReflectionComDefaultInterfaceAttribute
;
1638 RESOURCE_LOCATION_EMBEDDED
= 1,
1639 RESOURCE_LOCATION_ANOTHER_ASSEMBLY
= 2,
1640 RESOURCE_LOCATION_IN_MANIFEST
= 4
1645 MonoReflectionAssembly
*assembly
;
1646 MonoString
*filename
;
1648 } MonoManifestResourceInfo
;
1650 /* Safely access System.Reflection.ManifestResourceInfo from native code */
1651 TYPED_HANDLE_DECL (MonoManifestResourceInfo
);
1653 /* A boxed IntPtr */
1659 /* Keep in sync with System.GenericParameterAttributes */
1661 GENERIC_PARAMETER_ATTRIBUTE_NON_VARIANT
= 0,
1662 GENERIC_PARAMETER_ATTRIBUTE_COVARIANT
= 1,
1663 GENERIC_PARAMETER_ATTRIBUTE_CONTRAVARIANT
= 2,
1664 GENERIC_PARAMETER_ATTRIBUTE_VARIANCE_MASK
= 3,
1666 GENERIC_PARAMETER_ATTRIBUTE_NO_SPECIAL_CONSTRAINT
= 0,
1667 GENERIC_PARAMETER_ATTRIBUTE_REFERENCE_TYPE_CONSTRAINT
= 4,
1668 GENERIC_PARAMETER_ATTRIBUTE_VALUE_TYPE_CONSTRAINT
= 8,
1669 GENERIC_PARAMETER_ATTRIBUTE_CONSTRUCTOR_CONSTRAINT
= 16,
1670 GENERIC_PARAMETER_ATTRIBUTE_SPECIAL_CONSTRAINTS_MASK
= 28
1671 } GenericParameterAttributes
;
1675 MonoClassField
*field
;
1679 /* All MonoInternalThread instances should be pinned, so it's safe to use the raw ptr. However
1680 * for uniformity, icall wrapping will make handles anyway. So this is the method for getting the payload.
1682 static inline MonoInternalThread
*
1683 mono_internal_thread_handle_ptr (MonoInternalThreadHandle h
)
1685 /* The SUPPRESS here prevents a Centrinel warning due to merely seeing this
1686 * function definition. Callees will still get a warning unless we
1687 * attach a suppress attribute to the declaration.
1689 return MONO_HANDLE_SUPPRESS (MONO_HANDLE_RAW (h
));
1692 gboolean
mono_image_create_pefile (MonoReflectionModuleBuilder
*module
, gpointer file
, MonoError
*error
);
1693 guint32
mono_image_insert_string (MonoReflectionModuleBuilderHandle module
, MonoStringHandle str
, MonoError
*error
);
1694 guint32
mono_image_create_token (MonoDynamicImage
*assembly
, MonoObjectHandle obj
, gboolean create_methodspec
, gboolean register_token
, MonoError
*error
);
1695 void mono_dynamic_image_free (MonoDynamicImage
*image
);
1696 void mono_dynamic_image_free_image (MonoDynamicImage
*image
);
1697 void mono_dynamic_image_release_gc_roots (MonoDynamicImage
*image
);
1699 void mono_reflection_setup_internal_class (MonoReflectionTypeBuilder
*tb
);
1701 void mono_reflection_get_dynamic_overrides (MonoClass
*klass
, MonoMethod
***overrides
, int *num_overrides
, MonoError
*error
);
1703 void mono_reflection_destroy_dynamic_method (MonoReflectionDynamicMethod
*mb
);
1707 ves_icall_SymbolType_create_unmanaged_type (MonoReflectionType
*type
);
1709 void mono_reflection_register_with_runtime (MonoReflectionType
*type
);
1711 MonoMethodSignature
* mono_reflection_lookup_signature (MonoImage
*image
, MonoMethod
*method
, guint32 token
, MonoError
*error
);
1713 MonoArrayHandle
mono_param_get_objects_internal (MonoDomain
*domain
, MonoMethod
*method
, MonoClass
*refclass
, MonoError
*error
);
1716 mono_class_bind_generic_parameters (MonoClass
*klass
, int type_argc
, MonoType
**types
, gboolean is_dynamic
);
1718 mono_reflection_bind_generic_parameters (MonoReflectionTypeHandle type
, int type_argc
, MonoType
**types
, MonoError
*error
);
1720 mono_reflection_generic_class_initialize (MonoReflectionGenericClass
*type
, MonoArray
*fields
);
1723 MonoReflectionEvent
*
1724 ves_icall_TypeBuilder_get_event_info (MonoReflectionTypeBuilder
*tb
, MonoReflectionEventBuilder
*eb
);
1726 MonoReflectionMarshalAsAttributeHandle
1727 mono_reflection_marshal_as_attribute_from_marshal_spec (MonoDomain
*domain
, MonoClass
*klass
, MonoMarshalSpec
*spec
, MonoError
*error
);
1730 mono_reflection_lookup_dynamic_token (MonoImage
*image
, guint32 token
, gboolean valid_token
, MonoClass
**handle_class
, MonoGenericContext
*context
, MonoError
*error
);
1733 mono_reflection_call_is_assignable_to (MonoClass
*klass
, MonoClass
*oklass
, MonoError
*error
);
1736 mono_image_build_metadata (MonoReflectionModuleBuilder
*module
, MonoError
*error
);
1739 mono_get_constant_value_from_blob (MonoDomain
* domain
, MonoTypeEnum type
, const char *blob
, void *value
, MonoError
*error
);
1742 mono_metadata_read_constant_value (const char *blob
, MonoTypeEnum type
, void *value
, MonoError
*error
);
1745 mono_string_from_blob (const char *str
, MonoError
*error
);
1748 mono_release_type_locks (MonoInternalThread
*thread
);
1751 * mono_string_handle_length:
1752 * \param s \c MonoString
1753 * \returns the length in characters of the string
1755 #ifdef ENABLE_CHECKED_BUILD_GC
1758 mono_string_handle_length (MonoStringHandle s
);
1762 #define mono_string_handle_length(s) (MONO_HANDLE_GETVAL ((s), length))
1767 mono_string_handle_to_utf8 (MonoStringHandle s
, MonoError
*error
);
1770 mono_string_to_utf8_image (MonoImage
*image
, MonoStringHandle s
, MonoError
*error
);
1773 mono_array_clone_in_domain (MonoDomain
*domain
, MonoArrayHandle array
, MonoError
*error
);
1776 mono_array_clone_checked (MonoArray
*array
, MonoError
*error
);
1779 mono_array_full_copy (MonoArray
*src
, MonoArray
*dest
);
1782 mono_array_calc_byte_len (MonoClass
*klass
, uintptr_t len
, uintptr_t *res
);
1785 mono_array_new_checked (MonoDomain
*domain
, MonoClass
*eclass
, uintptr_t n
, MonoError
*error
);
1788 mono_array_new_full_checked (MonoDomain
*domain
, MonoClass
*array_class
, uintptr_t *lengths
, intptr_t *lower_bounds
, MonoError
*error
);
1791 mono_array_new_specific_checked (MonoVTable
*vtable
, uintptr_t n
, MonoError
*error
);
1794 mono_array_new_specific_handle (MonoVTable
*vtable
, uintptr_t n
, MonoError
*error
);
1798 ves_icall_array_new (MonoDomain
*domain
, MonoClass
*eclass
, uintptr_t n
);
1802 ves_icall_array_new_specific (MonoVTable
*vtable
, uintptr_t n
);
1804 #ifndef DISABLE_REMOTING
1806 mono_remote_class (MonoDomain
*domain
, MonoStringHandle class_name
, MonoClass
*proxy_class
, MonoError
*error
);
1809 mono_remote_class_is_interface_proxy (MonoRemoteClass
*remote_class
);
1812 mono_remoting_invoke (MonoObject
*real_proxy
, MonoMethodMessage
*msg
, MonoObject
**exc
, MonoArray
**out_args
, MonoError
*error
);
1815 mono_remote_class_vtable (MonoDomain
*domain
, MonoRemoteClass
*remote_class
, MonoRealProxyHandle real_proxy
, MonoError
*error
);
1818 mono_upgrade_remote_class (MonoDomain
*domain
, MonoObjectHandle tproxy
, MonoClass
*klass
, MonoError
*error
);
1821 mono_load_remote_field_checked (MonoObject
*this_obj
, MonoClass
*klass
, MonoClassField
*field
, void **res
, MonoError
*error
);
1824 mono_load_remote_field_new_checked (MonoObject
*this_obj
, MonoClass
*klass
, MonoClassField
*field
, MonoError
*error
);
1827 mono_store_remote_field_checked (MonoObject
*this_obj
, MonoClass
*klass
, MonoClassField
*field
, void* val
, MonoError
*error
);
1830 mono_store_remote_field_new_checked (MonoObject
*this_obj
, MonoClass
*klass
, MonoClassField
*field
, MonoObject
*arg
, MonoError
*error
);
1836 mono_create_ftnptr (MonoDomain
*domain
, gpointer addr
);
1839 mono_get_addr_from_ftnptr (gpointer descr
);
1842 mono_nullable_init (guint8
*buf
, MonoObject
*value
, MonoClass
*klass
);
1845 mono_nullable_init_from_handle (guint8
*buf
, MonoObjectHandle value
, MonoClass
*klass
);
1848 mono_nullable_init_unboxed (guint8
*buf
, gpointer value
, MonoClass
*klass
);
1851 mono_value_box_checked (MonoDomain
*domain
, MonoClass
*klass
, void* val
, MonoError
*error
);
1854 mono_value_box_handle (MonoDomain
*domain
, MonoClass
*klass
, gpointer val
, MonoError
*error
);
1857 mono_nullable_box (gpointer buf
, MonoClass
*klass
, MonoError
*error
);
1860 mono_nullable_box_handle (gpointer buf
, MonoClass
*klass
, MonoError
*error
);
1862 // A code size optimization (source and object) equivalent to MONO_HANDLE_NEW (MonoObject, NULL);
1864 mono_new_null (void);
1866 #ifdef MONO_SMALL_CONFIG
1867 #define MONO_IMT_SIZE 9
1869 #define MONO_IMT_SIZE 19
1874 gpointer target_code
;
1877 typedef struct _MonoImtBuilderEntry
{
1879 struct _MonoImtBuilderEntry
*next
;
1880 MonoImtItemValue value
;
1882 guint8 has_target_code
: 1;
1883 } MonoImtBuilderEntry
;
1885 typedef struct _MonoIMTCheckItem MonoIMTCheckItem
;
1887 struct _MonoIMTCheckItem
{
1889 int check_target_idx
;
1890 MonoImtItemValue value
;
1892 guint8
*code_target
;
1894 guint8 compare_done
;
1896 guint8 short_branch
;
1897 guint8 has_target_code
;
1900 typedef gpointer (*MonoImtTrampolineBuilder
) (MonoVTable
*vtable
, MonoDomain
*domain
,
1901 MonoIMTCheckItem
**imt_entries
, int count
, gpointer fail_trunk
);
1904 mono_install_imt_trampoline_builder (MonoImtTrampolineBuilder func
);
1907 mono_set_always_build_imt_trampolines (gboolean value
);
1910 mono_vtable_build_imt_slot (MonoVTable
* vtable
, int imt_slot
);
1913 mono_method_get_imt_slot (MonoMethod
*method
);
1916 mono_method_add_generic_virtual_invocation (MonoDomain
*domain
, MonoVTable
*vtable
,
1917 gpointer
*vtable_slot
,
1918 MonoMethod
*method
, gpointer code
);
1921 mono_method_alloc_generic_virtual_trampoline (MonoDomain
*domain
, int size
);
1923 #define mono_method_alloc_generic_virtual_trampoline(domain, size) (g_cast (mono_method_alloc_generic_virtual_trampoline ((domain), (size))))
1926 MONO_UNHANDLED_POLICY_LEGACY
,
1927 MONO_UNHANDLED_POLICY_CURRENT
1928 } MonoRuntimeUnhandledExceptionPolicy
;
1930 MonoRuntimeUnhandledExceptionPolicy
1931 mono_runtime_unhandled_exception_policy_get (void);
1933 mono_runtime_unhandled_exception_policy_set (MonoRuntimeUnhandledExceptionPolicy policy
);
1936 mono_unhandled_exception_checked (MonoObjectHandle exc
, MonoError
*error
);
1939 mono_class_try_get_vtable (MonoDomain
*domain
, MonoClass
*klass
);
1942 mono_runtime_run_module_cctor (MonoImage
*image
, MonoDomain
*domain
, MonoError
*error
);
1945 mono_runtime_class_init_full (MonoVTable
*vtable
, MonoError
*error
);
1948 mono_method_clear_object (MonoDomain
*domain
, MonoMethod
*method
);
1951 mono_class_compute_bitmap (MonoClass
*klass
, gsize
*bitmap
, int size
, int offset
, int *max_set
, gboolean static_fields
);
1954 mono_object_xdomain_representation (MonoObjectHandle obj
, MonoDomain
*target_domain
, MonoError
*error
);
1957 mono_class_is_reflection_method_or_constructor (MonoClass
*klass
);
1960 mono_get_object_from_blob (MonoDomain
*domain
, MonoType
*type
, const char *blob
, MonoError
*error
);
1963 mono_class_has_ref_info (MonoClass
*klass
);
1965 MonoReflectionTypeBuilder
*
1966 mono_class_get_ref_info_raw (MonoClass
*klass
);
1969 mono_class_set_ref_info (MonoClass
*klass
, MonoObjectHandle obj
);
1972 mono_class_free_ref_info (MonoClass
*klass
);
1975 mono_object_new_pinned (MonoDomain
*domain
, MonoClass
*klass
, MonoError
*error
);
1978 mono_object_new_pinned_handle (MonoDomain
*domain
, MonoClass
*klass
, MonoError
*error
);
1981 mono_object_new_specific_checked (MonoVTable
*vtable
, MonoError
*error
);
1985 ves_icall_object_new (MonoDomain
*domain
, MonoClass
*klass
);
1989 ves_icall_object_new_specific (MonoVTable
*vtable
);
1992 mono_object_new_alloc_specific_checked (MonoVTable
*vtable
, MonoError
*error
);
1995 mono_field_get_value_internal (MonoObject
*obj
, MonoClassField
*field
, void *value
);
1998 mono_field_static_get_value_checked (MonoVTable
*vt
, MonoClassField
*field
, void *value
, MonoError
*error
);
2001 mono_field_static_get_value_for_thread (MonoInternalThread
*thread
, MonoVTable
*vt
, MonoClassField
*field
, void *value
, MonoError
*error
);
2004 mono_object_handle_get_virtual_method (MonoObjectHandle obj
, MonoMethod
*method
, MonoError
*error
);
2006 /* exported, used by the debugger */
2008 mono_vtable_get_static_field_data (MonoVTable
*vt
);
2011 mono_field_get_value_object_checked (MonoDomain
*domain
, MonoClassField
*field
, MonoObject
*obj
, MonoError
*error
);
2014 mono_static_field_get_value_handle (MonoDomain
*domain
, MonoClassField
*field
, MonoError
*error
);
2017 mono_property_set_value_handle (MonoProperty
*prop
, MonoObjectHandle obj
, void **params
, MonoError
*error
);
2020 mono_property_get_value_checked (MonoProperty
*prop
, void *obj
, void **params
, MonoError
*error
);
2023 mono_object_try_to_string (MonoObject
*obj
, MonoObject
**exc
, MonoError
*error
);
2026 mono_string_to_utf8_ignore (MonoString
*s
);
2029 mono_monitor_is_il_fastpath_wrapper (MonoMethod
*method
);
2032 mono_string_is_interned_lookup (MonoStringHandle str
, gboolean insert
, MonoError
*error
);
2035 * mono_string_intern_checked:
2036 * \param str String to intern
2037 * \param error set on error.
2038 * Interns the string passed.
2039 * \returns The interned string. On failure returns NULL and sets \p error
2041 #define mono_string_intern_checked(str, error) (mono_string_is_interned_lookup ((str), TRUE, (error)))
2044 * mono_string_is_interned_internal:
2045 * \param o String to probe
2046 * \returns Whether the string has been interned.
2048 #define mono_string_is_interned_internal(str, error) (mono_string_is_interned_lookup ((str), FALSE, (error)))
2051 mono_exception_handle_get_native_backtrace (MonoExceptionHandle exc
);
2054 mono_exception_get_managed_backtrace (MonoException
*exc
);
2057 mono_copy_value (MonoType
*type
, void *dest
, void *value
, int deref_pointer
);
2060 mono_error_raise_exception_deprecated (MonoError
*target_error
);
2063 mono_error_set_pending_exception_slow (MonoError
*error
);
2065 static inline gboolean
2066 mono_error_set_pending_exception (MonoError
*error
)
2068 return is_ok (error
) ? FALSE
: mono_error_set_pending_exception_slow (error
);
2072 mono_glist_to_array (GList
*list
, MonoClass
*eclass
, MonoError
*error
);
2075 mono_object_new_checked (MonoDomain
*domain
, MonoClass
*klass
, MonoError
*error
);
2078 mono_object_new_handle (MonoDomain
*domain
, MonoClass
*klass
, MonoError
*error
);
2080 // This function skips handling of remoting and COM.
2081 // "alloc" means "less".
2083 mono_object_new_alloc_by_vtable (MonoVTable
*vtable
, MonoError
*error
);
2086 mono_object_new_mature (MonoVTable
*vtable
, MonoError
*error
);
2089 mono_object_new_handle_mature (MonoVTable
*vtable
, MonoError
*error
);
2092 mono_object_clone_checked (MonoObject
*obj
, MonoError
*error
);
2095 mono_object_clone_handle (MonoObjectHandle obj
, MonoError
*error
);
2098 mono_object_isinst_checked (MonoObject
*obj
, MonoClass
*klass
, MonoError
*error
);
2101 mono_object_handle_isinst (MonoObjectHandle obj
, MonoClass
*klass
, MonoError
*error
);
2104 mono_object_handle_isinst_mbyref (MonoObjectHandle obj
, MonoClass
*klass
, MonoError
*error
);
2107 mono_object_handle_isinst_mbyref_raw (MonoObjectHandle obj
, MonoClass
*klass
, MonoError
*error
);
2110 mono_string_new_size_handle (MonoDomain
*domain
, gint32 len
, MonoError
*error
);
2113 mono_string_new_len_checked (MonoDomain
*domain
, const char *text
, guint length
, MonoError
*error
);
2116 mono_string_new_size_checked (MonoDomain
*domain
, gint32 len
, MonoError
*error
);
2119 mono_ldstr_checked (MonoDomain
*domain
, MonoImage
*image
, uint32_t str_index
, MonoError
*error
);
2122 mono_ldstr_handle (MonoDomain
*domain
, MonoImage
*image
, uint32_t str_index
, MonoError
*error
);
2124 MONO_PROFILER_API MonoString
*
2125 mono_string_new_checked (MonoDomain
*domain
, const char *text
, MonoError
*merror
);
2128 mono_string_new_wtf8_len_checked (MonoDomain
*domain
, const char *text
, guint length
, MonoError
*error
);
2131 mono_string_new_utf16_checked (MonoDomain
*domain
, const gunichar2
*text
, gint32 len
, MonoError
*error
);
2134 mono_string_new_utf16_handle (MonoDomain
*domain
, const gunichar2
*text
, gint32 len
, MonoError
*error
);
2137 mono_string_new_utf8_len (MonoDomain
*domain
, const char *text
, guint length
, MonoError
*error
);
2140 mono_string_from_utf16_checked (const mono_unichar2
*data
, MonoError
*error
);
2143 mono_string_from_utf32_checked (const mono_unichar4
*data
, MonoError
*error
);
2146 mono_ldstr_utf8 (MonoImage
*image
, guint32 idx
, MonoError
*error
);
2149 mono_utf16_to_utf8 (const mono_unichar2
*s
, gsize slength
, MonoError
*error
);
2152 mono_utf16_to_utf8len (const mono_unichar2
*s
, gsize slength
, gsize
*utf8_length
, MonoError
*error
);
2155 mono_runtime_object_init_checked (MonoObject
*this_obj
, MonoError
*error
);
2157 MONO_PROFILER_API MonoObject
*
2158 mono_runtime_try_invoke (MonoMethod
*method
, void *obj
, void **params
, MonoObject
**exc
, MonoError
*error
);
2160 // The exc parameter is deliberately missing and so far this has proven to reduce code duplication.
2161 // In particular, if an exception is returned from underlying otherwise succeeded call,
2162 // is set into the MonoError with mono_error_set_exception_instance.
2163 // The result is that caller need only check MonoError.
2165 mono_runtime_try_invoke_handle (MonoMethod
*method
, MonoObjectHandle obj
, void **params
, MonoError
* error
);
2168 mono_runtime_invoke_checked (MonoMethod
*method
, void *obj
, void **params
, MonoError
*error
);
2171 mono_runtime_invoke_handle (MonoMethod
*method
, MonoObjectHandle obj
, void **params
, MonoError
* error
);
2174 mono_runtime_invoke_handle_void (MonoMethod
*method
, MonoObjectHandle obj
, void **params
, MonoError
* error
);
2177 mono_runtime_try_invoke_array (MonoMethod
*method
, void *obj
, MonoArray
*params
,
2178 MonoObject
**exc
, MonoError
*error
);
2181 mono_runtime_invoke_array_checked (MonoMethod
*method
, void *obj
, MonoArray
*params
,
2185 mono_compile_method_checked (MonoMethod
*method
, MonoError
*error
);
2188 mono_runtime_delegate_try_invoke (MonoObject
*delegate
, void **params
,
2189 MonoObject
**exc
, MonoError
*error
);
2192 mono_runtime_delegate_invoke_checked (MonoObject
*delegate
, void **params
,
2196 mono_runtime_get_main_args_handle (MonoError
*error
);
2199 mono_runtime_run_main_checked (MonoMethod
*method
, int argc
, char* argv
[],
2203 mono_runtime_try_run_main (MonoMethod
*method
, int argc
, char* argv
[],
2207 mono_runtime_exec_main_checked (MonoMethod
*method
, MonoArray
*args
, MonoError
*error
);
2210 mono_runtime_try_exec_main (MonoMethod
*method
, MonoArray
*args
, MonoObject
**exc
);
2213 mono_try_assembly_resolve_handle (MonoAssemblyLoadContext
*alc
, MonoStringHandle fname
, MonoAssembly
*requesting
, gboolean refonly
, MonoError
*error
);
2216 mono_runtime_object_init_handle (MonoObjectHandle this_obj
, MonoError
*error
);
2218 /* GC write barriers support */
2220 mono_gc_wbarrier_object_copy_handle (MonoObjectHandle obj
, MonoObjectHandle src
);
2223 mono_class_get_virtual_method (MonoClass
*klass
, MonoMethod
*method
, gboolean is_proxy
, MonoError
*error
);
2226 mono_string_empty_handle (MonoDomain
*domain
);
2229 mono_object_get_data (MonoObject
*o
);
2231 #define mono_handle_get_data_unsafe(handle) ((gpointer)((guint8*)MONO_HANDLE_RAW (handle) + MONO_ABI_SIZEOF (MonoObject)))
2234 mono_vtype_get_field_addr (gpointer vtype
, MonoClassField
*field
);
2236 #define MONO_OBJECT_SETREF_INTERNAL(obj,fieldname,value) do { \
2237 mono_gc_wbarrier_set_field_internal ((MonoObject*)(obj), &((obj)->fieldname), (MonoObject*)value); \
2238 /*(obj)->fieldname = (value);*/ \
2241 /* This should be used if 's' can reside on the heap */
2242 #define MONO_STRUCT_SETREF_INTERNAL(s,field,value) do { \
2243 mono_gc_wbarrier_generic_store_internal (&((s)->field), (MonoObject*)(value)); \
2246 static inline gunichar2
*
2247 mono_string_chars_internal (MonoString
*s
)
2249 MONO_REQ_GC_UNSAFE_MODE
;
2254 mono_string_length_internal (MonoString
*s
)
2256 MONO_REQ_GC_UNSAFE_MODE
;
2261 mono_string_empty_internal (MonoDomain
*domain
);
2264 mono_string_to_utf8len (MonoStringHandle s
, gsize
*utf8len
, MonoError
*error
);
2267 mono_string_to_utf8_checked_internal (MonoString
*string_obj
, MonoError
*error
);
2270 mono_string_equal_internal (MonoString
*s1
, MonoString
*s2
);
2273 mono_string_hash_internal (MonoString
*s
);
2276 mono_object_hash_internal (MonoObject
* obj
);
2279 mono_value_copy_internal (void* dest
, const void* src
, MonoClass
*klass
);
2282 mono_value_copy_array_internal (MonoArray
*dest
, int dest_idx
, const void* src
, int count
);
2284 MONO_PROFILER_API MonoVTable
* mono_object_get_vtable_internal (MonoObject
*obj
);
2287 mono_object_get_domain_internal (MonoObject
*obj
);
2290 mono_object_unbox_internal (MonoObject
*obj
);
2294 mono_monitor_exit_internal (MonoObject
*obj
);
2296 MONO_PROFILER_API
unsigned mono_object_get_size_internal (MonoObject
*o
);
2298 MONO_PROFILER_API MonoDomain
* mono_vtable_domain_internal (MonoVTable
*vtable
);
2300 MONO_PROFILER_API MonoClass
* mono_vtable_class_internal (MonoVTable
*vtable
);
2303 mono_object_get_virtual_method_internal (MonoObject
*obj
, MonoMethod
*method
);
2306 mono_get_delegate_invoke_internal (MonoClass
*klass
);
2309 mono_get_delegate_begin_invoke_internal (MonoClass
*klass
);
2312 mono_get_delegate_end_invoke_internal (MonoClass
*klass
);
2315 mono_unhandled_exception_internal (MonoObject
*exc
);
2318 mono_print_unhandled_exception_internal (MonoObject
*exc
);
2321 mono_raise_exception_internal (MonoException
*ex
);
2324 mono_field_set_value_internal (MonoObject
*obj
, MonoClassField
*field
, void *value
);
2327 mono_field_static_set_value_internal (MonoVTable
*vt
, MonoClassField
*field
, void *value
);
2330 mono_field_get_value_internal (MonoObject
*obj
, MonoClassField
*field
, void *value
);
2332 MonoMethod
* mono_get_context_capture_method (void);
2335 mono_runtime_get_aotid_arr (void);
2337 /* GC handles support
2339 * A handle can be created to refer to a managed object and either prevent it
2340 * from being garbage collected or moved or to be able to know if it has been
2341 * collected or not (weak references).
2342 * mono_gchandle_new () is used to prevent an object from being garbage collected
2343 * until mono_gchandle_free() is called. Use a TRUE value for the pinned argument to
2344 * prevent the object from being moved (this should be avoided as much as possible
2345 * and this should be used only for shorts periods of time or performance will suffer).
2346 * To create a weakref use mono_gchandle_new_weakref (): track_resurrection should
2347 * usually be false (see the GC docs for more details).
2348 * mono_gchandle_get_target () can be used to get the object referenced by both kinds
2349 * of handle: for a weakref handle, if an object has been collected, it will return NULL.
2352 mono_gchandle_new_internal (MonoObject
*obj
, mono_bool pinned
);
2355 mono_gchandle_new_weakref_internal (MonoObject
*obj
, mono_bool track_resurrection
);
2358 mono_gchandle_get_target_internal (uint32_t gchandle
);
2360 void mono_gchandle_free_internal (uint32_t gchandle
);
2362 /* Reference queue support
2364 * A reference queue is used to get notifications of when objects are collected.
2365 * Call mono_gc_reference_queue_new to create a new queue and pass the callback that
2366 * will be invoked when registered objects are collected.
2367 * Call mono_gc_reference_queue_add to register a pair of objects and data within a queue.
2368 * The callback will be triggered once an object is both unreachable and finalized.
2371 mono_gc_reference_queue_new_internal (mono_reference_queue_callback callback
);
2374 mono_gc_reference_queue_free_internal (MonoReferenceQueue
*queue
);
2377 mono_gc_reference_queue_add_internal (MonoReferenceQueue
*queue
, MonoObject
*obj
, void *user_data
);
2379 #define mono_gc_reference_queue_add_handle(queue, obj, user_data) \
2380 (mono_gc_reference_queue_add_internal ((queue), MONO_HANDLE_RAW (MONO_HANDLE_CAST (MonoObject, obj)), (user_data)))
2382 /* GC write barriers support */
2384 mono_gc_wbarrier_set_field_internal (MonoObject
*obj
, void* field_ptr
, MonoObject
* value
);
2387 mono_gc_wbarrier_set_arrayref_internal (MonoArray
*arr
, void* slot_ptr
, MonoObject
* value
);
2390 mono_gc_wbarrier_arrayref_copy_internal (void* dest_ptr
, const void* src_ptr
, int count
);
2393 mono_gc_wbarrier_generic_store_internal (void volatile* ptr
, MonoObject
* value
);
2396 mono_gc_wbarrier_generic_store_atomic_internal (void *ptr
, MonoObject
*value
);
2399 mono_gc_wbarrier_generic_nostore_internal (void* ptr
);
2402 mono_gc_wbarrier_value_copy_internal (void* dest
, const void* src
, int count
, MonoClass
*klass
);
2405 mono_gc_wbarrier_object_copy_internal (MonoObject
* obj
, MonoObject
*src
);
2407 #endif /* __MONO_OBJECT_INTERNALS_H__ */