diff options
author | Bernhard Urban <bernhard.urban@xamarin.com> | 2017-02-27 19:55:53 +0300 |
---|---|---|
committer | Bernhard Urban <bernhard.urban@xamarin.com> | 2017-03-01 00:59:28 +0300 |
commit | bc59e605dd966067e1a0b5204662e30e4cef83a1 (patch) | |
tree | a354a7a8be7637566282d27b64e0a0a1b1388ba2 | |
parent | 159153b539e48a26fc8409149bfde5375dcccc5f (diff) |
[interpreter] use jit icall for delegate ctor
-rw-r--r-- | mono/mini/interpreter/interp-internals.h | 3 | ||||
-rw-r--r-- | mono/mini/interpreter/interp.c | 68 | ||||
-rw-r--r-- | mono/mini/interpreter/transform.c | 23 |
3 files changed, 21 insertions, 73 deletions
diff --git a/mono/mini/interpreter/interp-internals.h b/mono/mini/interpreter/interp-internals.h index 603e20a1918..5e8597a6a6f 100644 --- a/mono/mini/interpreter/interp-internals.h +++ b/mono/mini/interpreter/interp-internals.h @@ -116,9 +116,6 @@ extern int mono_interp_traceopt; MonoException * mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *context); -MonoDelegate* -mono_interp_ftnptr_to_delegate (MonoClass *klass, gpointer ftn); - void mono_interp_transform_init (void); diff --git a/mono/mini/interpreter/interp.c b/mono/mini/interpreter/interp.c index 183a7bcbca1..be1365495d0 100644 --- a/mono/mini/interpreter/interp.c +++ b/mono/mini/interpreter/interp.c @@ -871,47 +871,6 @@ ves_pinvoke_method (MonoInvocation *frame, MonoMethodSignature *sig, MonoFuncV a g_free (margs); } -static void -interp_delegate_ctor (MonoDomain *domain, MonoObject *this, MonoObject *target, RuntimeMethod *runtime_method) -{ - MonoDelegate *delegate = (MonoDelegate *)this; - MonoError error; - - delegate->method_info = mono_method_get_object_checked (domain, runtime_method->method, NULL, &error); - mono_error_cleanup (&error); /* FIXME: don't swallow the error */ - delegate->target = target; - - if (target && mono_object_is_transparent_proxy (target)) { - MonoMethod *method = mono_marshal_get_remoting_invoke (runtime_method->method); - delegate->method_ptr = mono_interp_get_runtime_method (domain, method, &error); - mono_error_cleanup (&error); /* FIXME: don't swallow the error */ - } else { - delegate->method_ptr = runtime_method; - } -} - -MonoDelegate* -mono_interp_ftnptr_to_delegate (MonoClass *klass, gpointer ftn) -{ - MonoDelegate *d; - MonoJitInfo *ji; - MonoDomain *domain = mono_domain_get (); - MonoError error; - - d = (MonoDelegate*)mono_object_new_checked (domain, klass, &error); - mono_error_cleanup (&error); /* FIXME: don't swallow the error */ - - ji = mono_jit_info_table_find (domain, ftn); - if (ji == NULL) - mono_raise_exception (mono_get_exception_argument ("", "Function pointer was not created by a Delegate.")); - - /* FIXME: discard the wrapper and call the original method */ - interp_delegate_ctor (domain, (MonoObject*)d, NULL, mono_interp_get_runtime_method (domain, ji->d.method, &error)); - mono_error_cleanup (&error); /* FIXME: don't swallow the error */ - - return d; -} - /* * From the spec: * runtime specifies that the implementation of the method is automatically @@ -928,15 +887,6 @@ ves_runtime_method (MonoInvocation *frame, ThreadContext *context) mono_class_init (method->klass); - isinst_obj = mono_object_isinst_checked (obj, mono_defaults.multicastdelegate_class, &error); - mono_error_cleanup (&error); /* FIXME: don't swallow the error */ - if (obj && isinst_obj) { - if (*name == '.' && (strcmp (name, ".ctor") == 0)) { - interp_delegate_ctor (context->domain, obj, frame->stack_args [1].data.p, frame->stack_args[2].data.p); - return; - } - } - isinst_obj = mono_object_isinst_checked (obj, mono_defaults.array_class, &error); mono_error_cleanup (&error); /* FIXME: don't swallow the error */ if (obj && isinst_obj) { @@ -4332,24 +4282,6 @@ interp_ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_fi return res; } -static MonoObject * -ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, MonoObject *target, MonoReflectionMethod *info) -{ - MonoClass *delegate_class = mono_class_from_mono_type (type->type); - MonoObject *delegate; - MonoError error; - - g_assert (delegate_class->parent == mono_defaults.multicastdelegate_class); - - delegate = mono_object_new_checked (mono_object_domain (type), delegate_class, &error); - mono_error_cleanup (&error); /* FIXME: don't swallow the error */ - - interp_delegate_ctor (mono_object_domain (type), delegate, target, mono_interp_get_runtime_method (mono_get_root_domain (), info->method, &error)); - mono_error_cleanup (&error); /* FIXME: don't swallow the error */ - - return delegate; -} - void mono_interp_init () { diff --git a/mono/mini/interpreter/transform.c b/mono/mini/interpreter/transform.c index 4a91c6cd1a0..8370c006eab 100644 --- a/mono/mini/interpreter/transform.c +++ b/mono/mini/interpreter/transform.c @@ -2602,6 +2602,21 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start) --td.sp; interp_transform_call (&td, method, NULL, domain, generic_context, is_bb_start, body_start_offset, NULL); break; + case CEE_MONO_JIT_ICALL_ADDR: { + guint32 token; + gpointer func; + MonoJitICallInfo *info; + + token = read32 (td.ip + 1); + td.ip += 5; + func = mono_method_get_wrapper_data (method, token); + info = mono_find_jit_icall_by_addr (func); + + ADD_CODE (&td, MINT_LDFTN); + ADD_CODE (&td, get_data_item_index (&td, func)); + PUSH_SIMPLE_TYPE (&td, STACK_TYPE_I); + break; + } case CEE_MONO_ICALL: { guint32 token; gpointer func; @@ -2653,7 +2668,6 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start) if (func == mono_ftnptr_to_delegate) { g_error ("TODO: ?"); - func = mono_interp_ftnptr_to_delegate; } ADD_CODE(&td, get_data_item_index (&td, func)); td.sp -= info->sig->param_count; @@ -3087,7 +3101,12 @@ mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *cont } else { const char *name = method->name; if (method->klass->parent == mono_defaults.multicastdelegate_class) { - if (*name == 'I' && (strcmp (name, "Invoke") == 0)) { + if (*name == '.' && (strcmp (name, ".ctor") == 0)) { + MonoJitICallInfo *mi = mono_find_jit_icall_by_name ("ves_icall_mono_delegate_ctor"); + g_assert (mi); + char *wrapper_name = g_strdup_printf ("__icall_wrapper_%s", mi->name); + nm = mono_marshal_get_icall_wrapper (mi->sig, wrapper_name, mi->func, TRUE); + } else if (*name == 'I' && (strcmp (name, "Invoke") == 0)) { nm = mono_marshal_get_delegate_invoke (method, NULL); } else if (*name == 'B' && (strcmp (name, "BeginInvoke") == 0)) { nm = mono_marshal_get_delegate_begin_invoke (method); |