Another single-stepping fix in JIT self-verification mode.
The counted single stepping check should be based on the
kSubModeCountedStep submode instead.
Also since the NPC value is cleared when exceptions are thrown, we can
single-step instructions that can throw as well.
Change-Id: Idbc1307ae0956016ef76186aebc6e3b89b119d9d
diff --git a/vm/compiler/codegen/arm/CodegenDriver.cpp b/vm/compiler/codegen/arm/CodegenDriver.cpp
index 1a8ac42..1e5f4c7 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.cpp
+++ b/vm/compiler/codegen/arm/CodegenDriver.cpp
@@ -1353,8 +1353,7 @@
static void genInterpSingleStep(CompilationUnit *cUnit, MIR *mir)
{
int flags = dexGetFlagsFromOpcode(mir->dalvikInsn.opcode);
- int flagsToCheck = kInstrCanBranch | kInstrCanSwitch | kInstrCanReturn |
- kInstrCanThrow;
+ int flagsToCheck = kInstrCanBranch | kInstrCanSwitch | kInstrCanReturn;
// Single stepping is considered loop mode breaker
if (cUnit->jitMode == kJitLoop) {
diff --git a/vm/interp/Interp.cpp b/vm/interp/Interp.cpp
index 11e9408..67566e8 100644
--- a/vm/interp/Interp.cpp
+++ b/vm/interp/Interp.cpp
@@ -1828,10 +1828,10 @@
#endif
/*
- * SingleStep processing. NOTE: must be the last here to allow
+ * CountedStep processing. NOTE: must be the last here to allow
* preceeding special case handler to manipulate single-step count.
*/
- if (self->interpBreak.ctl.breakFlags & kInterpSingleStep) {
+ if (self->interpBreak.ctl.subMode & kSubModeCountedStep) {
if (self->singleStepCount == 0) {
// We've exhausted our single step count
dvmDisableSubMode(self, kSubModeCountedStep);