X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fobject.c;h=39c126f8c9feb9496dca7597c798ff2b8b9430b9;hb=797c536463feb7ebf7b3aafdee518404389b726e;hp=81ef40655523987b1425818f61b7d6ee2773dbe4;hpb=d17b89609524441faf6f437eb04526f1e8af4a47;p=mono.git diff --git a/mono/metadata/object.c b/mono/metadata/object.c index 81ef4065552..39c126f8c9f 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -539,8 +539,6 @@ default_delegate_trampoline (MonoDomain *domain, MonoClass *klass) return NULL; } -static MonoTrampoline arch_create_jit_trampoline = default_trampoline; -static MonoJumpTrampoline arch_create_jump_trampoline = default_jump_trampoline; static MonoDelegateTrampoline arch_create_delegate_trampoline = default_delegate_trampoline; static MonoImtThunkBuilder imt_thunk_builder; static gboolean always_build_imt_thunks; @@ -561,18 +559,6 @@ mono_get_runtime_callbacks (void) return &callbacks; } -void -mono_install_trampoline (MonoTrampoline func) -{ - arch_create_jit_trampoline = func? func: default_trampoline; -} - -void -mono_install_jump_trampoline (MonoJumpTrampoline func) -{ - arch_create_jump_trampoline = func? func: default_jump_trampoline; -} - #ifndef DISABLE_REMOTING void mono_install_remoting_trampoline (MonoRemotingTrampoline func) @@ -626,9 +612,15 @@ mono_compile_method (MonoMethod *method) gpointer mono_runtime_create_jump_trampoline (MonoDomain *domain, MonoMethod *method, gboolean add_sync_wrapper) { - MONO_REQ_GC_NEUTRAL_MODE + MonoError error; + gpointer res; - return arch_create_jump_trampoline (domain, method, add_sync_wrapper); + MONO_REQ_GC_NEUTRAL_MODE; + + res = callbacks.create_jump_trampoline (domain, method, add_sync_wrapper, &error); + if (!mono_error_ok (&error)) + mono_error_raise_exception (&error); /* FIXME: Don't raise here */ + return res; } gpointer @@ -1053,9 +1045,11 @@ field_is_special_static (MonoClass *fklass, MonoClassField *field) { MONO_REQ_GC_NEUTRAL_MODE; + MonoError error; MonoCustomAttrInfo *ainfo; int i; - ainfo = mono_custom_attrs_from_field (fklass, field); + ainfo = mono_custom_attrs_from_field_checked (fklass, field, &error); + mono_error_cleanup (&error); /* FIXME don't swallow the error? */ if (!ainfo) return FALSE; for (i = 0; i < ainfo->num_attrs; ++i) { @@ -2166,8 +2160,11 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *klass, MonoErro for (i = 0; i < klass->vtable_size; ++i) { MonoMethod *cm; - if ((cm = klass->vtable [i])) - vt->vtable [i] = arch_create_jit_trampoline (cm); + cm = klass->vtable [i]; + if (cm) { + vt->vtable [i] = callbacks.create_jit_trampoline (domain, cm, error); + mono_error_raise_exception (error); /* FIXME: Don't raise here */ + } } } @@ -4398,7 +4395,8 @@ mono_runtime_exec_main (MonoMethod *method, MonoArray *args, MonoObject **exc) } } - cinfo = mono_custom_attrs_from_method (method); + cinfo = mono_custom_attrs_from_method_checked (method, &error); + mono_error_cleanup (&error); /* FIXME warn here? */ if (cinfo) { has_stathread_attribute = mono_custom_attrs_has_attr (cinfo, mono_class_get_sta_thread_attribute_class ()); if (!cinfo->cached) @@ -4791,7 +4789,7 @@ mono_object_new_pinned (MonoDomain *domain, MonoClass *klass, MonoError *error) if (G_UNLIKELY (!o)) mono_error_set_out_of_memory (error, "Could not allocate %i bytes", mono_class_instance_size (klass)); else if (G_UNLIKELY (vtable->klass->has_finalize)) - mono_object_register_finalizer (o); + mono_object_register_finalizer (o, error); return o; } @@ -4921,7 +4919,7 @@ mono_object_new_alloc_specific_checked (MonoVTable *vtable, MonoError *error) if (G_UNLIKELY (!o)) mono_error_set_out_of_memory (error, "Could not allocate %i bytes", vtable->klass->instance_size); else if (G_UNLIKELY (vtable->klass->has_finalize)) - mono_object_register_finalizer (o); + mono_object_register_finalizer (o, error); return o; } @@ -5009,7 +5007,7 @@ mono_object_new_mature (MonoVTable *vtable, MonoError *error) if (G_UNLIKELY (!o)) mono_error_set_out_of_memory (error, "Could not allocate %i bytes", vtable->klass->instance_size); else if (G_UNLIKELY (vtable->klass->has_finalize)) - mono_object_register_finalizer (o); + mono_object_register_finalizer (o, error); return o; } @@ -5124,7 +5122,7 @@ mono_object_clone_checked (MonoObject *obj, MonoError *error) mono_gc_wbarrier_object_copy (o, obj); if (obj->vtable->klass->has_finalize) - mono_object_register_finalizer (o); + mono_object_register_finalizer (o, error); return o; } @@ -5798,8 +5796,10 @@ mono_value_box (MonoDomain *domain, MonoClass *klass, gpointer value) } #endif #endif - if (klass->has_finalize) - mono_object_register_finalizer (res); + if (klass->has_finalize) { + mono_object_register_finalizer (res, &error); + mono_error_raise_exception (&error); /* FIXME don't raise here */ + } return res; } @@ -6067,15 +6067,16 @@ mono_string_get_pinned (MonoString *str, MonoError *error) } static MonoString* -mono_string_is_interned_lookup (MonoString *str, int insert) +mono_string_is_interned_lookup (MonoString *str, int insert, MonoError *error) { MONO_REQ_GC_UNSAFE_MODE; - MonoError error; MonoGHashTable *ldstr_table; MonoString *s, *res; MonoDomain *domain; + mono_error_init (error); + domain = ((MonoObject *)str)->vtable->domain; ldstr_table = domain->ldstr_table; ldstr_lock (); @@ -6087,8 +6088,8 @@ mono_string_is_interned_lookup (MonoString *str, int insert) if (insert) { /* Allocate outside the lock */ ldstr_unlock (); - s = mono_string_get_pinned (str, &error); - mono_error_raise_exception (&error); /* FIXME don't raise here */ + s = mono_string_get_pinned (str, error); + return_val_if_nok (error, NULL); if (s) { ldstr_lock (); res = (MonoString *)mono_g_hash_table_lookup (ldstr_table, str); @@ -6130,9 +6131,11 @@ mono_string_is_interned_lookup (MonoString *str, int insert) MonoString* mono_string_is_interned (MonoString *o) { - MONO_REQ_GC_UNSAFE_MODE; - - return mono_string_is_interned_lookup (o, FALSE); + MonoError error; + MonoString *result = mono_string_is_interned_lookup (o, FALSE, &error); + /* This function does not fail. */ + mono_error_assert_ok (&error); + return result; } /** @@ -6144,10 +6147,29 @@ mono_string_is_interned (MonoString *o) */ MonoString* mono_string_intern (MonoString *str) +{ + MonoError error; + MonoString *result = mono_string_intern_checked (str, &error); + mono_error_assert_ok (&error); + return result; +} + +/** + * mono_string_intern_checked: + * @o: String to intern + * @error: set on error. + * + * Interns the string passed. + * Returns: The interned string. On failure returns NULL and sets @error + */ +MonoString* +mono_string_intern_checked (MonoString *str, MonoError *error) { MONO_REQ_GC_UNSAFE_MODE; - return mono_string_is_interned_lookup (str, TRUE); + mono_error_init (error); + + return mono_string_is_interned_lookup (str, TRUE, error); } /**