Update monitor enter/exit exception handling in interpreter.
This CL prevents from checking if an exception is pending when we just
threw a NPE. Move the conditional check after calling monitor enter/exit
routine.
Change-Id: Icfebf3914f6439b47038d7a00932251f8000c1c2
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc
index 5992c67..e1773f0 100644
--- a/src/interpreter/interpreter.cc
+++ b/src/interpreter/interpreter.cc
@@ -970,10 +970,11 @@
Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x());
if (UNLIKELY(obj == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow());
+ HANDLE_PENDING_EXCEPTION();
} else {
DoMonitorEnter(self, obj);
+ POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx);
}
- POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx);
break;
}
case Instruction::MONITOR_EXIT: {
@@ -981,10 +982,11 @@
Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x());
if (UNLIKELY(obj == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow());
+ HANDLE_PENDING_EXCEPTION();
} else {
DoMonitorExit(self, obj);
+ POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx);
}
- POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx);
break;
}
case Instruction::CHECK_CAST: {