[interp] implement MONO_JIT_{AT,DE}TACH, so native2managed wrappers can be handled...
authorBernhard Urban <bernhard.urban@xamarin.com>
Wed, 26 Apr 2017 15:21:30 +0000 (17:21 +0200)
committerBernhard Urban <bernhard.urban@xamarin.com>
Fri, 28 Apr 2017 18:52:06 +0000 (20:52 +0200)
mono/mini/interp/interp-internals.h
mono/mini/interp/interp.c
mono/mini/interp/mintops.def
mono/mini/interp/transform.c

index bda0b457e8520bfd76f4702efef447fe904a9fb0..9769855efac02efd040d90d6e8e1a3ac1125080c 100644 (file)
@@ -108,6 +108,7 @@ struct _MonoInvocation {
 
 typedef struct {
        MonoDomain *domain;
+       MonoDomain *original_domain;
        MonoInvocation *base_frame;
        MonoInvocation *current_frame;
        MonoInvocation *env_frame;
index 30412ffb4c9d94056c31b1babec2b77498d974ae..0c0b651f563c3665e203acbd56013d220fdc17ab 100644 (file)
@@ -1914,9 +1914,6 @@ mono_interp_create_method_pointer (MonoMethod *method, MonoError *error)
        MonoMethod *wrapper;
        RuntimeMethod *rmethod;
 
-       if (method->wrapper_type && method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED)
-               return NULL;
-
        /* HACK: method_ptr of delegate should point to a runtime method*/
        if (method->wrapper_type && method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD)
                return mono_interp_get_runtime_method (mono_domain_get (), method, error);
@@ -4353,6 +4350,21 @@ array_constructed:
                        ip += 3;
                        MINT_IN_BREAK;
                }
+               MINT_IN_CASE(MINT_MONO_JIT_ATTACH) {
+                       ++ip;
+
+                       context->original_domain = NULL;
+                       MonoDomain *tls_domain = (MonoDomain *) ((gpointer (*)()) mono_tls_get_tls_getter (TLS_KEY_DOMAIN, FALSE)) ();
+                       gpointer tls_jit = ((gpointer (*)()) mono_tls_get_tls_getter (TLS_KEY_DOMAIN, FALSE)) ();
+
+                       if (tls_domain != context->domain || !tls_jit)
+                               context->original_domain = mono_jit_thread_attach (context->domain);
+                       MINT_IN_BREAK;
+               }
+               MINT_IN_CASE(MINT_MONO_JIT_DETACH)
+                       ++ip;
+                       mono_jit_set_domain (context->original_domain);
+                       MINT_IN_BREAK;
 
 #define RELOP(datamem, op) \
        --sp; \
index ec0fda2f8ca0c08c94050aee916e56e4593d470b..6e3e4dbd9e17adfddc57cc1da259a2d607a77933 100644 (file)
@@ -512,8 +512,9 @@ OPDEF(MINT_MONO_TLS, "mono_tls", 2, MintOpInt)
 OPDEF(MINT_MONO_NEWOBJ, "mono_newobj", 2, MintOpClassToken)
 OPDEF(MINT_MONO_RETOBJ, "mono_retobj", 1, MintOpNoArgs)
 OPDEF(MINT_MONO_FREE, "mono_free", 1, MintOpNoArgs)
-
 OPDEF(MINT_MONO_ATOMIC_STORE_I4, "mono_atomic.store.i4", 1, MintOpNoArgs)
+OPDEF(MINT_MONO_JIT_ATTACH, "mono_jit_attach", 1, MintOpNoArgs)
+OPDEF(MINT_MONO_JIT_DETACH, "mono_jit_detach", 1, MintOpNoArgs)
 
 // FIXME: MintOp
 OPDEF(MINT_JIT_CALL, "mono_jit_call", 2, MintOpNoArgs)
index 8b692e51f82f17b2ae409f7f2067381731d336cf..d76c9af55a7106f54ad06fd220174e5a14bdf4fd 100644 (file)
@@ -3011,6 +3011,14 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                                PUSH_TYPE (&td, STACK_TYPE_MP, NULL);
                                ++td.ip;
                                break;
+                       case CEE_MONO_JIT_ATTACH:
+                               ADD_CODE (&td, MINT_MONO_JIT_ATTACH);
+                               ++td.ip;
+                               break;
+                       case CEE_MONO_JIT_DETACH:
+                               ADD_CODE (&td, MINT_MONO_JIT_DETACH);
+                               ++td.ip;
+                               break;
                        default:
                                g_error ("transform.c: Unimplemented opcode: 0xF0 %02x at 0x%x\n", *td.ip, td.ip-header->code);
                        }