HANDLE_OPCODE(OP_BREAKPOINT)
#if (INTERP_TYPE == INTERP_DBG) && defined(WITH_DEBUGGER)
{
/*
* Restart this instruction with the original opcode. We do
* this by simply jumping to the handler.
*
* It's probably not necessary to update "inst", but we do it
* for the sake of anything that needs to do disambiguation in a
* common handler with INST_INST.
*
* The breakpoint itself is handled over in updateDebugger(),
* because we need to detect other events (method entry, single
* step) and report them in the same event packet, and we're not
* yet handling those through breakpoint instructions. By the
* time we get here, the breakpoint has already been handled and
* the thread resumed.
*/
u1 originalOpCode = dvmGetOriginalOpCode(pc);
LOGV("+++ break 0x%02x (0x%04x -> 0x%04x)\n", originalOpCode, inst,
INST_REPLACE_OP(inst, originalOpCode));
inst = INST_REPLACE_OP(inst, originalOpCode);
FINISH_BKPT(originalOpCode);
}
#else
LOGE("Breakpoint hit in non-debug interpreter\n");
dvmAbort();
#endif
OP_END