Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Urban <bernhard.urban@xamarin.com>2017-02-27 19:55:53 +0300
committerBernhard Urban <bernhard.urban@xamarin.com>2017-03-01 00:59:28 +0300
commitbc59e605dd966067e1a0b5204662e30e4cef83a1 (patch)
treea354a7a8be7637566282d27b64e0a0a1b1388ba2
parent159153b539e48a26fc8409149bfde5375dcccc5f (diff)
[interpreter] use jit icall for delegate ctor
-rw-r--r--mono/mini/interpreter/interp-internals.h3
-rw-r--r--mono/mini/interpreter/interp.c68
-rw-r--r--mono/mini/interpreter/transform.c23
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);