X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fjit-icalls.c;h=6d87c74e92d01e1fb087a6f8c19e57dc65084c08;hb=ef0ddf45c3081e799edcb4e95770186514b80cf1;hp=4727a958d7897f1735436c8f8dfea5690497651e;hpb=2e1116d02a2f59f779761188292bf462e7822257;p=mono.git diff --git a/mono/mini/jit-icalls.c b/mono/mini/jit-icalls.c index 4727a958d78..6d87c74e92d 100644 --- a/mono/mini/jit-icalls.c +++ b/mono/mini/jit-icalls.c @@ -8,6 +8,7 @@ * (C) 2002 Ximian, Inc. * Copyright 2003-2011 Novell Inc (http://www.novell.com) * Copyright 2011 Xamarin Inc (http://www.xamarin.com) + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include #include @@ -19,6 +20,7 @@ #include "jit-icalls.h" #include #include +#include #ifdef ENABLE_LLVM #include "mini-llvm-cpp.h" @@ -28,6 +30,7 @@ void* mono_ldftn (MonoMethod *method) { gpointer addr; + MonoError error; if (mono_llvm_only) { // FIXME: No error handling @@ -43,8 +46,11 @@ mono_ldftn (MonoMethod *method) return addr; } - addr = mono_create_jump_trampoline (mono_domain_get (), method, FALSE); - + addr = mono_create_jump_trampoline (mono_domain_get (), method, FALSE, &error); + if (!mono_error_ok (&error)) { + mono_error_set_pending_exception (&error); + return NULL; + } return mono_create_ftnptr (mono_domain_get (), addr); } @@ -97,11 +103,14 @@ mono_ldvirtfn_gshared (MonoObject *obj, MonoMethod *method) void mono_helper_stelem_ref_check (MonoArray *array, MonoObject *val) { + MonoError error; if (!array) { mono_set_pending_exception (mono_get_exception_null_reference ()); return; } - if (val && !mono_object_isinst (val, array->obj.vtable->klass->element_class)) { + if (val && !mono_object_isinst_checked (val, array->obj.vtable->klass->element_class, &error)) { + if (mono_error_set_pending_exception (&error)) + return; mono_set_pending_exception (mono_get_exception_array_type_mismatch ()); return; } @@ -854,6 +863,7 @@ mono_array_new_4 (MonoMethod *cm, guint32 length1, guint32 length2, guint32 leng gpointer mono_class_static_field_address (MonoDomain *domain, MonoClassField *field) { + MonoError error; MonoVTable *vtable; gpointer addr; @@ -861,9 +871,17 @@ mono_class_static_field_address (MonoDomain *domain, MonoClassField *field) mono_class_init (field->parent); - vtable = mono_class_vtable_full (domain, field->parent, TRUE); - if (!vtable->initialized) - mono_runtime_class_init (vtable); + vtable = mono_class_vtable_full (domain, field->parent, &error); + if (!is_ok (&error)) { + mono_error_set_pending_exception (&error); + return NULL; + } + if (!vtable->initialized) { + if (!mono_runtime_class_init_full (vtable, &error)) { + mono_error_set_pending_exception (&error); + return NULL; + } + } //printf ("SFLDA1 %p\n", (char*)vtable->data + field->offset); @@ -1127,7 +1145,10 @@ mono_helper_newobj_mscorlib (guint32 idx) return NULL; } - return mono_object_new (mono_domain_get (), klass); + MonoObject *obj = mono_object_new_checked (mono_domain_get (), klass, &error); + if (!mono_error_ok (&error)) + mono_error_set_pending_exception (&error); + return obj; } /* @@ -1161,6 +1182,7 @@ mono_create_corlib_exception_2 (guint32 token, MonoString *arg1, MonoString *arg MonoObject* mono_object_castclass_unbox (MonoObject *obj, MonoClass *klass) { + MonoError error; MonoJitTlsData *jit_tls = NULL; MonoClass *oklass; @@ -1175,8 +1197,10 @@ mono_object_castclass_unbox (MonoObject *obj, MonoClass *klass) oklass = obj->vtable->klass; if ((klass->enumtype && oklass == klass->element_class) || (oklass->enumtype && klass == oklass->element_class)) return obj; - if (mono_object_isinst (obj, klass)) + if (mono_object_isinst_checked (obj, klass, &error)) return obj; + if (mono_error_set_pending_exception (&error)) + return NULL; if (mini_get_debug_options ()->better_cast_details) { jit_tls->class_cast_from = oklass; @@ -1192,6 +1216,7 @@ mono_object_castclass_unbox (MonoObject *obj, MonoClass *klass) MonoObject* mono_object_castclass_with_cache (MonoObject *obj, MonoClass *klass, gpointer *cache) { + MonoError error; MonoJitTlsData *jit_tls = NULL; gpointer cached_vtable, obj_vtable; @@ -1209,10 +1234,12 @@ mono_object_castclass_with_cache (MonoObject *obj, MonoClass *klass, gpointer *c if (cached_vtable == obj_vtable) return obj; - if (mono_object_isinst (obj, klass)) { + if (mono_object_isinst_checked (obj, klass, &error)) { *cache = obj_vtable; return obj; } + if (mono_error_set_pending_exception (&error)) + return NULL; if (mini_get_debug_options ()->better_cast_details) { jit_tls->class_cast_from = obj->vtable->klass; @@ -1228,6 +1255,7 @@ mono_object_castclass_with_cache (MonoObject *obj, MonoClass *klass, gpointer *c MonoObject* mono_object_isinst_with_cache (MonoObject *obj, MonoClass *klass, gpointer *cache) { + MonoError error; size_t cached_vtable, obj_vtable; if (!obj) @@ -1240,10 +1268,12 @@ mono_object_isinst_with_cache (MonoObject *obj, MonoClass *klass, gpointer *cach return (cached_vtable & 0x1) ? NULL : obj; } - if (mono_object_isinst (obj, klass)) { + if (mono_object_isinst_checked (obj, klass, &error)) { *cache = (gpointer)obj_vtable; return obj; } else { + if (mono_error_set_pending_exception (&error)) + return NULL; /*negative cache*/ *cache = (gpointer)(obj_vtable | 0x1); return NULL; @@ -1305,7 +1335,7 @@ constrained_gsharedvt_call_setup (gpointer mp, MonoMethod *cmethod, MonoClass *k /* * Calling a non-vtype method with a vtype receiver, has to box. */ - *this_arg = mono_value_box (mono_domain_get (), klass, mp); + *this_arg = mono_value_box_checked (mono_domain_get (), klass, mp, error); else if (klass->valuetype) /* * Calling a vtype method with a vtype receiver @@ -1323,12 +1353,13 @@ constrained_gsharedvt_call_setup (gpointer mp, MonoMethod *cmethod, MonoClass *k * mono_gsharedvt_constrained_call: * * Make a call to CMETHOD using the receiver MP, which is assumed to be of type KLASS. ARGS contains - * the arguments to the method in the format used by mono_runtime_invoke (). + * the arguments to the method in the format used by mono_runtime_invoke_checked (). */ MonoObject* mono_gsharedvt_constrained_call (gpointer mp, MonoMethod *cmethod, MonoClass *klass, gboolean deref_arg, gpointer *args) { MonoError error; + MonoObject *o; MonoMethod *m; gpointer this_arg; gpointer new_args [16]; @@ -1351,7 +1382,14 @@ mono_gsharedvt_constrained_call (gpointer mp, MonoMethod *cmethod, MonoClass *kl args [0] = this_arg; this_arg = NULL; } - return mono_runtime_invoke (m, this_arg, args, NULL); + + o = mono_runtime_invoke_checked (m, this_arg, args, &error); + if (!mono_error_ok (&error)) { + mono_error_set_pending_exception (&error); + return NULL; + } + + return o; } void @@ -1363,10 +1401,23 @@ mono_gsharedvt_value_copy (gpointer dest, gpointer src, MonoClass *klass) mono_gc_wbarrier_generic_store (dest, *(MonoObject**)src); } +void +ves_icall_runtime_class_init (MonoVTable *vtable) +{ + MONO_REQ_GC_UNSAFE_MODE; + MonoError error; + + mono_runtime_class_init_full (vtable, &error); + mono_error_set_pending_exception (&error); +} + + void mono_generic_class_init (MonoVTable *vtable) { - mono_runtime_class_init (vtable); + MonoError error; + mono_runtime_class_init_full (vtable, &error); + mono_error_set_pending_exception (&error); } gpointer @@ -1699,6 +1750,10 @@ mono_llvmonly_init_delegate (MonoDelegate *del) */ if (G_UNLIKELY (!ftndesc)) { gpointer addr = mono_compile_method (del->method); + + if (del->method->klass->valuetype && mono_method_signature (del->method)->hasthis) + addr = mono_aot_get_unbox_trampoline (del->method); + gpointer arg = mini_get_delegate_arg (del->method, addr); ftndesc = mini_create_llvmonly_ftndesc (mono_domain_get (), addr, arg); @@ -1718,19 +1773,30 @@ mono_llvmonly_init_delegate_virtual (MonoDelegate *del, MonoObject *target, Mono del->method = method; del->method_ptr = mono_compile_method (method); + if (method->klass->valuetype) + del->method_ptr = mono_aot_get_unbox_trampoline (method); del->extra_arg = mini_get_delegate_arg (del->method, del->method_ptr); } MonoObject* mono_get_assembly_object (MonoImage *image) { - return (MonoObject*)mono_assembly_get_object (mono_domain_get (), image->assembly); + MonoError error; + MonoObject *result; + result = (MonoObject*)mono_assembly_get_object_checked (mono_domain_get (), image->assembly, &error); + if (!result) + mono_error_set_pending_exception (&error); + return result; } MonoObject* mono_get_method_object (MonoMethod *method) { - return (MonoObject*)mono_method_get_object (mono_domain_get (), method, method->klass); + MonoError error; + MonoObject * result; + result = (MonoObject*)mono_method_get_object_checked (mono_domain_get (), method, method->klass, &error); + mono_error_set_pending_exception (&error); + return result; } double @@ -1741,30 +1807,6 @@ mono_ckfinite (double d) return d; } -void -mono_llvmonly_set_calling_assembly (MonoImage *image) -{ - MonoJitTlsData *jit_tls = NULL; - - jit_tls = (MonoJitTlsData *)mono_native_tls_get_value (mono_jit_tls_id); - g_assert (jit_tls); - jit_tls->calling_image = image; -} - -MonoObject* -mono_llvmonly_get_calling_assembly (void) -{ - MonoJitTlsData *jit_tls = NULL; - - jit_tls = (MonoJitTlsData *)mono_native_tls_get_value (mono_jit_tls_id); - g_assert (jit_tls); - if (!jit_tls->calling_image) { - mono_set_pending_exception (mono_get_exception_not_supported ("Stack walks are not supported on this platform.")); - return NULL; - } - return (MonoObject*)mono_assembly_get_object (mono_domain_get (), jit_tls->calling_image->assembly); -} - /* * mono_interruption_checkpoint_from_trampoline: *