blob: cb8f99bfcea44259d08df47dc10aa73d409ecf67 [file] [log] [blame]
HANDLE_OPCODE(OP_MONITOR_EXIT /*vAA*/)
{
Object* obj;
EXPORT_PC();
vsrc1 = INST_AA(inst);
ILOGV("|monitor-exit v%d %s(0x%08x)",
vsrc1, kSpacing+5, GET_REGISTER(vsrc1));
obj = (Object*)GET_REGISTER(vsrc1);
if (!checkForNull(obj)) {
/*
* The exception needs to be processed at the *following*
* instruction, not the current instruction (see the Dalvik
* spec). Because we're jumping to an exception handler,
* we're not actually at risk of skipping an instruction
* by doing so.
*/
ADJUST_PC(1); /* monitor-exit width is 1 */
GOTO_exceptionThrown();
}
ILOGV("+ unlocking %p %s\n", obj, obj->clazz->descriptor);
if (!dvmUnlockObject(self, obj)) {
assert(dvmCheckException(self));
ADJUST_PC(1);
GOTO_exceptionThrown();
}
}
FINISH(1);
OP_END