X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fjit-icalls.c;h=fa3d7a4681971e74fafa19d297ab476de42c470d;hb=4db06151bebcc81ad062d68d361ea03d50f455fb;hp=bb9c73c0400956edce182fcea82cc2887e726cd9;hpb=f1b81b256d2e316c84f90d5191a1bd85aa2280ab;p=mono.git diff --git a/mono/mini/jit-icalls.c b/mono/mini/jit-icalls.c index bb9c73c0400..fa3d7a46819 100644 --- a/mono/mini/jit-icalls.c +++ b/mono/mini/jit-icalls.c @@ -1,5 +1,6 @@ -/* - * jit-icalls.c: internal calls used by the JIT +/** + * \file + * internal calls used by the JIT * * Author: * Dietmar Maurer (dietmar@ximian.com) @@ -22,6 +23,7 @@ #include #include #include +#include #ifdef ENABLE_LLVM #include "mini-llvm-cpp.h" @@ -72,10 +74,10 @@ ldvirtfn_internal (MonoObject *obj, MonoMethod *method, gboolean gshared) if (gshared && method->is_inflated && mono_method_get_context (method)->method_inst) { MonoGenericContext context = { NULL, NULL }; - if (res->klass->generic_class) - context.class_inst = res->klass->generic_class->context.class_inst; - else if (res->klass->generic_container) - context.class_inst = res->klass->generic_container->context.class_inst; + if (mono_class_is_ginst (res->klass)) + context.class_inst = mono_class_get_generic_class (res->klass)->context.class_inst; + else if (mono_class_is_gtd (res->klass)) + context.class_inst = mono_class_get_generic_container (res->klass)->context.class_inst; context.method_inst = mono_method_get_context (method)->method_inst; res = mono_class_inflate_generic_method_checked (res, &context, &error); @@ -887,11 +889,16 @@ mono_class_static_field_address (MonoDomain *domain, MonoClassField *field) //printf ("SFLDA1 %p\n", (char*)vtable->data + field->offset); - if (domain->special_static_fields && (addr = g_hash_table_lookup (domain->special_static_fields, field))) + if (field->offset == -1) { + /* Special static */ + g_assert (domain->special_static_fields); + mono_domain_lock (domain); + addr = g_hash_table_lookup (domain->special_static_fields, field); + mono_domain_unlock (domain); addr = mono_get_special_static_data (GPOINTER_TO_UINT (addr)); - else + } else { addr = (char*)mono_vtable_get_static_field_data (vtable) + field->offset; - + } return addr; } @@ -1083,16 +1090,6 @@ mono_lconv_to_r8_un (guint64 a) } #endif -#if defined(__native_client_codegen__) || defined(__native_client__) -/* When we cross-compile to Native Client we can't directly embed calls */ -/* to the math library on the host. This will use the fmod on the target*/ -double -mono_fmod(double a, double b) -{ - return fmod(a, b); -} -#endif - gpointer mono_helper_compile_generic_method (MonoObject *obj, MonoMethod *method, gpointer *this_arg) { @@ -1101,15 +1098,15 @@ mono_helper_compile_generic_method (MonoObject *obj, MonoMethod *method, gpointe gpointer addr; MonoGenericContext *context = mono_method_get_context (method); - mono_jit_stats.generic_virtual_invocations++; + UnlockedIncrement (&mono_jit_stats.generic_virtual_invocations); if (obj == NULL) { mono_set_pending_exception (mono_get_exception_null_reference ()); return NULL; } vmethod = mono_object_get_virtual_method (obj, method); - g_assert (!vmethod->klass->generic_container); - g_assert (!vmethod->klass->generic_class || !vmethod->klass->generic_class->context.class_inst->is_open); + g_assert (!mono_class_is_gtd (vmethod->klass)); + g_assert (!mono_class_is_ginst (vmethod->klass) || !mono_class_get_generic_class (vmethod->klass)->context.class_inst->is_open); g_assert (!context->method_inst || !context->method_inst->is_open); addr = mono_compile_method_checked (vmethod, &error); @@ -1215,7 +1212,7 @@ mono_object_castclass_unbox (MonoObject *obj, MonoClass *klass) MonoClass *oklass; if (mini_get_debug_options ()->better_cast_details) { - jit_tls = (MonoJitTlsData *)mono_native_tls_get_value (mono_jit_tls_id); + jit_tls = (MonoJitTlsData *)mono_tls_get_jit_tls (); jit_tls->class_cast_from = NULL; } @@ -1249,7 +1246,7 @@ mono_object_castclass_with_cache (MonoObject *obj, MonoClass *klass, gpointer *c gpointer cached_vtable, obj_vtable; if (mini_get_debug_options ()->better_cast_details) { - jit_tls = (MonoJitTlsData *)mono_native_tls_get_value (mono_jit_tls_id); + jit_tls = (MonoJitTlsData *)mono_tls_get_jit_tls (); jit_tls->class_cast_from = NULL; } @@ -1331,12 +1328,15 @@ constrained_gsharedvt_call_setup (gpointer mp, MonoMethod *cmethod, MonoClass *k { MonoMethod *m; int vt_slot, iface_offset; + gboolean is_iface = FALSE; - mono_error_init (error); + error_init (error); - if (klass->flags & TYPE_ATTRIBUTE_INTERFACE) { + if (mono_class_is_interface (klass)) { MonoObject *this_obj; + is_iface = TRUE; + /* Have to use the receiver's type instead of klass, the receiver is a ref type */ this_obj = *(MonoObject**)mp; g_assert (this_obj); @@ -1352,7 +1352,7 @@ constrained_gsharedvt_call_setup (gpointer mp, MonoMethod *cmethod, MonoClass *k mono_class_setup_vtable (klass); g_assert (klass->vtable); vt_slot = mono_method_get_vtable_slot (cmethod); - if (cmethod->klass->flags & TYPE_ATTRIBUTE_INTERFACE) { + if (mono_class_is_interface (cmethod->klass)) { iface_offset = mono_class_interface_offset (klass, cmethod->klass); g_assert (iface_offset != -1); vt_slot += iface_offset; @@ -1362,21 +1362,33 @@ constrained_gsharedvt_call_setup (gpointer mp, MonoMethod *cmethod, MonoClass *k m = mono_class_inflate_generic_method (m, mono_method_get_context (cmethod)); } - if (klass->valuetype && (m->klass == mono_defaults.object_class || m->klass == mono_defaults.enum_class->parent || m->klass == mono_defaults.enum_class)) + if (klass->valuetype && (m->klass == mono_defaults.object_class || m->klass == mono_defaults.enum_class->parent || m->klass == mono_defaults.enum_class)) { /* * Calling a non-vtype method with a vtype receiver, has to box. */ *this_arg = mono_value_box_checked (mono_domain_get (), klass, mp, error); - else if (klass->valuetype) - /* - * Calling a vtype method with a vtype receiver - */ - *this_arg = mp; - else + } else if (klass->valuetype) { + if (is_iface) { + /* + * The original type is an interface, so the receiver is a ref, + the called method is a vtype method, need to unbox. + */ + MonoObject *this_obj = *(MonoObject**)mp; + + *this_arg = mono_object_unbox (this_obj); + } else { + /* + * Calling a vtype method with a vtype receiver + */ + *this_arg = mp; + } + } else { /* * Calling a non-vtype method */ *this_arg = *(gpointer*)mp; + } + return m; } @@ -1452,11 +1464,15 @@ mono_generic_class_init (MonoVTable *vtable) } void -ves_icall_mono_delegate_ctor (MonoObject *this_obj, MonoObject *target, gpointer addr) +ves_icall_mono_delegate_ctor (MonoObject *this_obj_raw, MonoObject *target_raw, gpointer addr) { + HANDLE_FUNCTION_ENTER (); MonoError error; + MONO_HANDLE_DCL (MonoObject, this_obj); + MONO_HANDLE_DCL (MonoObject, target); mono_delegate_ctor (this_obj, target, addr, &error); mono_error_set_pending_exception (&error); + HANDLE_FUNCTION_RETURN (); } gpointer @@ -1504,7 +1520,7 @@ resolve_iface_call (MonoObject *this_obj, int imt_slot, MonoMethod *imt_method, gpointer addr, compiled_method, aot_addr; gboolean need_rgctx_tramp = FALSE, need_unbox_tramp = FALSE; - mono_error_init (error); + error_init (error); if (!this_obj) /* The caller will handle it */ return NULL; @@ -1588,7 +1604,7 @@ resolve_vcall (MonoVTable *vt, int slot, MonoMethod *imt_method, gpointer *out_a gpointer addr, compiled_method; gboolean need_unbox_tramp = FALSE; - mono_error_init (error); + error_init (error); /* Same as in common_call_trampoline () */ /* Avoid loading metadata or creating a generic vtable if possible */ @@ -1608,10 +1624,10 @@ resolve_vcall (MonoVTable *vt, int slot, MonoMethod *imt_method, gpointer *out_a else declaring = m; - if (m->klass->generic_class) - context.class_inst = m->klass->generic_class->context.class_inst; + if (mono_class_is_ginst (m->klass)) + context.class_inst = mono_class_get_generic_class (m->klass)->context.class_inst; else - g_assert (!m->klass->generic_container); + g_assert (!mono_class_is_gtd (m->klass)); generic_virtual = imt_method; g_assert (generic_virtual); @@ -1692,10 +1708,10 @@ mono_resolve_generic_virtual_call (MonoVTable *vt, int slot, MonoMethod *generic else declaring = m; - if (m->klass->generic_class) - context.class_inst = m->klass->generic_class->context.class_inst; + if (mono_class_is_ginst (m->klass)) + context.class_inst = mono_class_get_generic_class (m->klass)->context.class_inst; else - g_assert (!m->klass->generic_container); + g_assert (!mono_class_is_gtd (m->klass)); g_assert (generic_virtual->is_inflated); context.method_inst = ((MonoMethodInflated*)generic_virtual)->context.method_inst; @@ -1866,12 +1882,9 @@ mono_llvmonly_init_delegate_virtual (MonoDelegate *del, MonoObject *target, Mono MonoObject* mono_get_assembly_object (MonoImage *image) { - 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; + ICALL_ENTRY(); + MonoObjectHandle result = MONO_HANDLE_CAST (MonoObject, mono_assembly_get_object_handle (mono_domain_get (), image->assembly, &error)); + ICALL_RETURN_OBJ (result); } MonoObject* @@ -1912,14 +1925,14 @@ mono_interruption_checkpoint_from_trampoline (void) } void -mono_throw_method_access (MonoMethod *callee, MonoMethod *caller) +mono_throw_method_access (MonoMethod *caller, MonoMethod *callee) { - char *callee_name = mono_method_full_name (callee, 1); - char *caller_name = mono_method_full_name (caller, 1); + char *caller_name = mono_method_get_reflection_name (caller); + char *callee_name = mono_method_get_reflection_name (callee); MonoError error; - mono_error_init (&error); - mono_error_set_generic_error (&error, "System", "MethodAccessException", "Method `%s' is inaccessible from method `%s'\n", callee_name, caller_name); + error_init (&error); + mono_error_set_generic_error (&error, "System", "MethodAccessException", "Method `%s' is inaccessible from method `%s'", callee_name, caller_name); mono_error_set_pending_exception (&error); g_free (callee_name); g_free (caller_name);