X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fhandle.h;h=5de55eebc824540879dedab9bb5e555c99fc3276;hb=94bb3cadd263987736a9d3ec23856caa88a6fcbc;hp=dba7c26c90bafeafd4871281307ce910249718a3;hpb=3b3017dbe482ef7fef5e56f19aeae9c9ccea35d7;p=mono.git diff --git a/mono/metadata/handle.h b/mono/metadata/handle.h index dba7c26c90b..5de55eebc82 100644 --- a/mono/metadata/handle.h +++ b/mono/metadata/handle.h @@ -118,6 +118,7 @@ HandleStack* mono_handle_stack_alloc (void); void mono_handle_stack_free (HandleStack *handlestack); MonoRawHandle mono_stack_mark_pop_value (MonoThreadInfo *info, HandleStackMark *stackmark, MonoRawHandle value); void mono_stack_mark_record_size (MonoThreadInfo *info, HandleStackMark *stackmark, const char *func_name); +void mono_handle_stack_free_domain (HandleStack *stack, MonoDomain *domain); #ifdef MONO_HANDLE_TRACK_SP void mono_handle_chunk_leak_check (HandleStack *handles); @@ -408,6 +409,26 @@ This is why we evaluate index and value before any call to MONO_HANDLE_RAW or ot #define MONO_HANDLE_DOMAIN(HANDLE) (mono_object_domain (MONO_HANDLE_RAW (MONO_HANDLE_CAST (MonoObject, HANDLE)))) +/* Given an object and a MonoClassField, return the value (must be non-object) + * of the field. It's the caller's responsibility to check that the object is + * of the correct class. */ +#define MONO_HANDLE_GET_FIELD_VAL(HANDLE,TYPE,FIELD) *(TYPE *)(mono_handle_unsafe_field_addr (MONO_HANDLE_CAST (MonoObject, (HANDLE)), (FIELD))) + +#define MONO_HANDLE_NEW_GET_FIELD(HANDLE,TYPE,FIELD) MONO_HANDLE_NEW (TYPE, *(TYPE**)(mono_handle_unsafe_field_addr (MONO_HANDLE_CAST (MonoObject, (HANDLE)), (FIELD)))) + +#define MONO_HANDLE_SET_FIELD_VAL(HANDLE,TYPE,FIELD,VAL) do { \ + MonoObjectHandle __obj = (HANDLE); \ + MonoClassField *__field = (FIELD); \ + TYPE __value = (VAL); \ + *(TYPE*)(mono_handle_unsafe_field_addr (__obj, __field)) = __value; \ + } while (0) + +#define MONO_HANDLE_SET_FIELD_REF(HANDLE,FIELD,VALH) do { \ + MonoObjectHandle __obj = MONO_HANDLE_CAST (MonoObject, (HANDLE)); \ + MonoClassField *__field = (FIELD); \ + MonoObjectHandle __value = MONO_HANDLE_CAST (MonoObject, (VALH)); \ + mono_gc_wbarrier_generic_store (mono_handle_unsafe_field_addr (__obj, __field), MONO_HANDLE_RAW (__value)); \ + } while (0) /* Baked typed handles we all want */ TYPED_HANDLE_DECL (MonoString); @@ -416,6 +437,12 @@ TYPED_HANDLE_DECL (MonoObject); TYPED_HANDLE_DECL (MonoException); TYPED_HANDLE_DECL (MonoAppContext); +/* Unfortunately MonoThreadHandle is already a typedef used for something unrelated. So + * the coop handle for MonoThread* is MonoThreadObjectHandle. + */ +typedef MonoThread MonoThreadObject; +TYPED_HANDLE_DECL (MonoThreadObject); + #define NULL_HANDLE_STRING MONO_HANDLE_CAST(MonoString, NULL_HANDLE) /* @@ -430,6 +457,13 @@ mono_handle_assign (MonoObjectHandleOut dest, MonoObjectHandle src) mono_gc_wbarrier_generic_store (&dest->__raw, src ? MONO_HANDLE_RAW(src) : NULL); } +/* It is unsafe to call this function directly - it does not pin the handle! Use MONO_HANDLE_GET_FIELD_VAL(). */ +static inline gchar* +mono_handle_unsafe_field_addr (MonoObjectHandle h, MonoClassField *field) +{ + return ((gchar *)MONO_HANDLE_RAW (h)) + field->offset; +} + //FIXME this should go somewhere else MonoStringHandle mono_string_new_handle (MonoDomain *domain, const char *data, MonoError *error); MonoArrayHandle mono_array_new_handle (MonoDomain *domain, MonoClass *eclass, uintptr_t n, MonoError *error); @@ -467,6 +501,12 @@ mono_array_handle_pin_with_size (MonoArrayHandle handle, int size, uintptr_t ind #define MONO_ARRAY_HANDLE_PIN(handle,type,index,gchandle_out) mono_array_handle_pin_with_size (MONO_HANDLE_CAST(MonoArray,(handle)), sizeof (type), (index), (gchandle_out)) +gunichar2 * +mono_string_handle_pin_chars (MonoStringHandle s, uint32_t *gchandle_out); + +gpointer +mono_object_handle_pin_unbox (MonoObjectHandle boxed_valuetype_obj, uint32_t *gchandle_out); + void mono_error_set_exception_handle (MonoError *error, MonoExceptionHandle exc); @@ -476,7 +516,6 @@ mono_context_get_handle (void); void mono_context_set_handle (MonoAppContextHandle new_context); - G_END_DECLS #endif /* __MONO_HANDLE_H__ */