X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;ds=sidebyside;f=vm%2Finterp%2FInterp.cpp;h=42e2ecad7140b63842e8914c0f64658e25dd7ad2;hb=07344a400805d3d267352bf2694e728b29aa8ea8;hp=c168c7a5f5841e231735ee8a1357072ec4b23adb;hpb=8fb8c4de25c5c95019a06b37f17bb6d82b41f4ac;p=android-x86%2Fdalvik.git diff --git a/vm/interp/Interp.cpp b/vm/interp/Interp.cpp index c168c7a5f..42e2ecad7 100644 --- a/vm/interp/Interp.cpp +++ b/vm/interp/Interp.cpp @@ -999,9 +999,6 @@ void dvmDumpRegs(const Method* method, const u4* framePtr, bool inOnly) s4 dvmInterpHandlePackedSwitch(const u2* switchData, s4 testVal) { const int kInstrLen = 3; - u2 size; - s4 firstKey; - const s4* entries; /* * Packed switch data format: @@ -1018,13 +1015,14 @@ s4 dvmInterpHandlePackedSwitch(const u2* switchData, s4 testVal) return kInstrLen; } - size = *switchData++; + u2 size = *switchData++; assert(size > 0); - firstKey = *switchData++; + s4 firstKey = *switchData++; firstKey |= (*switchData++) << 16; - if (testVal < firstKey || testVal >= firstKey + size) { + int index = testVal - firstKey; + if (index < 0 || index >= size) { LOGVV("Value %d not found in switch (%d-%d)", testVal, firstKey, firstKey+size-1); return kInstrLen; @@ -1033,14 +1031,14 @@ s4 dvmInterpHandlePackedSwitch(const u2* switchData, s4 testVal) /* The entries are guaranteed to be aligned on a 32-bit boundary; * we can treat them as a native int array. */ - entries = (const s4*) switchData; + const s4* entries = (const s4*) switchData; assert(((u4)entries & 0x3) == 0); - assert(testVal - firstKey >= 0 && testVal - firstKey < size); + assert(index >= 0 && index < size); LOGVV("Value %d found in slot %d (goto 0x%02x)", - testVal, testVal - firstKey, - s4FromSwitchData(&entries[testVal - firstKey])); - return s4FromSwitchData(&entries[testVal - firstKey]); + testVal, index, + s4FromSwitchData(&entries[index])); + return s4FromSwitchData(&entries[index]); } /* @@ -1662,8 +1660,13 @@ void dvmInitializeInterpBreak(Thread* thread) if (gDvm.instructionCountEnableCount > 0) { dvmEnableSubMode(thread, kSubModeInstCounting); } - if (dvmIsMethodTraceActive()) { - dvmEnableSubMode(thread, kSubModeMethodTrace); + TracingMode mode = dvmGetMethodTracingMode(); + if (mode != TRACING_INACTIVE) { + if (mode == SAMPLE_PROFILING_ACTIVE) { + dvmEnableSubMode(thread, kSubModeSampleTrace); + } else { + dvmEnableSubMode(thread, kSubModeMethodTrace); + } } if (gDvm.emulatorTraceEnableCount > 0) { dvmEnableSubMode(thread, kSubModeEmulatorTrace); @@ -1671,6 +1674,9 @@ void dvmInitializeInterpBreak(Thread* thread) if (gDvm.debuggerActive) { dvmEnableSubMode(thread, kSubModeDebuggerActive); } +#if defined(WITH_JIT) + dvmJitUpdateThreadStateSingle(thread); +#endif #if 0 // Debugging stress mode - force checkBefore dvmEnableSubMode(thread, kSubModeCheckAlways); @@ -1910,7 +1916,6 @@ void dvmInterpret(Thread* self, const Method* method, JValue* pResult) #endif self->debugIsMethodEntry = true; #if defined(WITH_JIT) - dvmJitCalleeSave(calleeSave); /* Initialize the state to kJitNot */ self->jitState = kJitNot; #endif