typedef struct {
MonoDomain *domain;
+ MonoDomain *original_domain;
MonoInvocation *base_frame;
MonoInvocation *current_frame;
MonoInvocation *env_frame;
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);
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; \
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)
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);
}