Skip to content

Commit

Permalink
[interp] implement MONO_JIT_{AT,DE}TACH, so native2managed wrappers c…
Browse files Browse the repository at this point in the history
…an be handled by the interpreter
  • Loading branch information
lewurm committed Apr 28, 2017
1 parent b9043ed commit 4312802
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 4 deletions.
1 change: 1 addition & 0 deletions mono/mini/interp/interp-internals.h
Expand Up @@ -108,6 +108,7 @@ struct _MonoInvocation {

typedef struct {
MonoDomain *domain;
MonoDomain *original_domain;
MonoInvocation *base_frame;
MonoInvocation *current_frame;
MonoInvocation *env_frame;
Expand Down
18 changes: 15 additions & 3 deletions mono/mini/interp/interp.c
Expand Up @@ -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);
Expand Down Expand Up @@ -4353,6 +4350,21 @@ ves_exec_method_with_context (MonoInvocation *frame, ThreadContext *context, uns
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; \
Expand Down
3 changes: 2 additions & 1 deletion mono/mini/interp/mintops.def
Expand Up @@ -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)
8 changes: 8 additions & 0 deletions mono/mini/interp/transform.c
Expand Up @@ -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);
}
Expand Down

0 comments on commit 4312802

Please sign in to comment.