Issue 5177609: remove Monitor(Enter|Exit)Helper
Add necessary indirection for synchronized native methods that
lock/unlock the object/class using the regular JNI MonitorEnter/Exit
functions.
Change-Id: I00cda7284fcfa09e1218ddbfb1e24ea4aaa94ac3
diff --git a/src/jni_compiler.cc b/src/jni_compiler.cc
index dd7d5e5..f3d13c8 100644
--- a/src/jni_compiler.cc
+++ b/src/jni_compiler.cc
@@ -25,6 +25,9 @@
JniCallingConvention jni_conv(native_method);
ManagedRuntimeCallingConvention mr_conv(native_method);
const bool is_static = native_method->IsStatic();
+ static Offset functions(OFFSETOF_MEMBER(JNIEnvExt, fns));
+ static Offset monitor_enter(OFFSETOF_MEMBER(JNINativeInterface, MonitorEnter));
+ static Offset monitor_exit(OFFSETOF_MEMBER(JNINativeInterface, MonitorExit));
// 1. Build the frame
const size_t frame_size(jni_conv.FrameSize());
@@ -136,9 +139,10 @@
FrameOffset out_off = jni_conv.CurrentParamStackOffset();
jni_asm->StoreRawPtr(out_off, jni_env_register);
}
- // Call JNIEnvExt::MonitorEnterHelper(JNIEnv*, object)
- static Offset monitor_enter(OFFSETOF_MEMBER(JNIEnvExt, MonitorEnterHelper));
- jni_asm->Call(jni_env_register, monitor_enter,
+ // Call JNIEnv->MonitorEnter(object)
+ ManagedRegister jni_fns_register = jni_conv.InterproceduralScratchRegister();
+ jni_asm->LoadRawPtr(jni_fns_register, jni_env_register, functions);
+ jni_asm->Call(jni_fns_register, monitor_enter,
jni_conv.InterproceduralScratchRegister());
jni_asm->FillFromSpillArea(spill_regs, out_arg_size);
jni_asm->ExceptionPoll(jni_conv.InterproceduralScratchRegister());
@@ -238,9 +242,10 @@
FrameOffset out_off = jni_conv.CurrentParamStackOffset();
jni_asm->StoreRawPtr(out_off, jni_env_register);
}
- // Call JNIEnvExt::MonitorExitHelper(JNIEnv*, object)
- static Offset monitor_exit(OFFSETOF_MEMBER(JNIEnvExt, MonitorExitHelper));
- jni_asm->Call(jni_env_register, monitor_exit,
+ // Call JNIEnv->MonitorExit(object)
+ ManagedRegister jni_fns_register = jni_conv.InterproceduralScratchRegister();
+ jni_asm->LoadRawPtr(jni_fns_register, jni_env_register, functions);
+ jni_asm->Call(jni_fns_register, monitor_exit,
jni_conv.InterproceduralScratchRegister());
// Reload return value
jni_asm->Load(jni_conv.ReturnRegister(), return_save_location,