-/*
- * jit-icalls.c: internal calls used by the JIT
+/**
+ * \file
+ * internal calls used by the JIT
*
* Author:
* Dietmar Maurer (dietmar@ximian.com)
#include <mono/metadata/exception-internals.h>
#include <mono/metadata/threads-types.h>
#include <mono/metadata/reflection-internals.h>
+#include <mono/utils/unlocked.h>
#ifdef ENABLE_LLVM
#include "mini-llvm-cpp.h"
//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;
}
}
#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)
{
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 ());
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;
}
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;
}
{
MonoMethod *m;
int vt_slot, iface_offset;
+ gboolean is_iface = FALSE;
- mono_error_init (error);
+ error_init (error);
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);
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;
}
}
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
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;
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 */
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*
}
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);