Consolidate curFrame fields in thread storage

We ended up with two locations in the Thread structure for saved
Dalvik frame pointer.  This change consolidates them.

Change-Id: I78f288e4e57e232f29663be930101e775bfe370f
diff --git a/vm/AllocTracker.cpp b/vm/AllocTracker.cpp
index 156fb86..34e0b3f 100644
--- a/vm/AllocTracker.cpp
+++ b/vm/AllocTracker.cpp
@@ -149,7 +149,7 @@
     int stackDepth = 0;
     void* fp;
 
-    fp = self->curFrame;
+    fp = self->interpSave.curFrame;
 
     while ((fp != NULL) && (stackDepth < kMaxAllocRecordStackDepth)) {
         const StackSaveArea* saveArea = SAVEAREA_FROM_FP(fp);
diff --git a/vm/Debugger.cpp b/vm/Debugger.cpp
index 478644b..781b96b 100644
--- a/vm/Debugger.cpp
+++ b/vm/Debugger.cpp
@@ -2073,7 +2073,7 @@
     dvmLockThreadList(NULL);
     thread = threadObjToThread(threadObj);
     if (thread != NULL) {
-        count = dvmComputeExactFrameDepth(thread->curFrame);
+        count = dvmComputeExactFrameDepth(thread->interpSave.curFrame);
     }
     dvmUnlockThreadList();
 
@@ -2099,7 +2099,7 @@
     if (thread == NULL)
         goto bail;
 
-    framePtr = thread->curFrame;
+    framePtr = thread->interpSave.curFrame;
     count = 0;
     while (framePtr != NULL) {
         const StackSaveArea* saveArea = SAVEAREA_FROM_FP(framePtr);
diff --git a/vm/Exception.cpp b/vm/Exception.cpp
index 7bf824f..30796c2 100644
--- a/vm/Exception.cpp
+++ b/vm/Exception.cpp
@@ -609,7 +609,7 @@
 
     LOGVV("findCatchInMethod %s.%s excep=%s depth=%d\n",
         method->clazz->descriptor, method->name, excepClass->descriptor,
-        dvmComputeExactFrameDepth(self->curFrame));
+        dvmComputeExactFrameDepth(self->interpSave.curFrame));
 
     DvmDex* pDvmDex = method->clazz->pDvmDex;
     const DexCode* pCode = dvmGetMethodCode(method);
@@ -710,12 +710,12 @@
  * before calling here and restore it after.
  *
  * Sets *newFrame to the frame pointer of the frame with the catch block.
- * If "scanOnly" is false, self->curFrame is also set to this value.
+ * If "scanOnly" is false, self->interpSave.curFrame is also set to this value.
  */
 int dvmFindCatchBlock(Thread* self, int relPc, Object* exception,
     bool scanOnly, void** newFrame)
 {
-    void* fp = self->curFrame;
+    u4* fp = self->interpSave.curFrame;
     int catchAddr = -1;
 
     assert(!dvmCheckException(self));
@@ -789,7 +789,7 @@
     }
 
     if (!scanOnly)
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
 
     /*
      * The class resolution in findCatchInMethod() could cause an exception.
@@ -831,7 +831,7 @@
 
     if (pCount != NULL)
         *pCount = 0;
-    fp = thread->curFrame;
+    fp = thread->interpSave.curFrame;
 
     assert(thread == dvmThreadSelf() || dvmIsSuspended(thread));
 
diff --git a/vm/Exception.h b/vm/Exception.h
index 40f3482..24c0eb4 100644
--- a/vm/Exception.h
+++ b/vm/Exception.h
@@ -172,7 +172,7 @@
  * "*newFrame" gets a copy of the new frame pointer.
  *
  * If "doUnroll" is set, we unroll "thread"s stack as we go (and update
- * self->curFrame with the same value as in *newFrame).
+ * self->interpSave.curFrame with the same value as in *newFrame).
  *
  * Returns the offset to the catch code on success, or -1 if we couldn't
  * find a catcher.
diff --git a/vm/Jni.cpp b/vm/Jni.cpp
index 8b95e7a..13274c4 100644
--- a/vm/Jni.cpp
+++ b/vm/Jni.cpp
@@ -144,7 +144,7 @@
  * the Thread that can be altered by other threads (e.g. prev/next pointers).
  */
 static void computeStackSum(Thread* self) {
-    const u1* low = (const u1*)SAVEAREA_FROM_FP(self->curFrame);
+    const u1* low = (const u1*)SAVEAREA_FROM_FP(self->interpSave.curFrame);
     u4 crc = dvmInitCrc32();
     self->stackCrc = 0;
     crc = dvmComputeCrc32(crc, low, self->interpStackStart - low);
@@ -162,14 +162,14 @@
  * less accurate but reduces the amount of code we have to touch with #ifdefs.
  */
 static void checkStackSum(Thread* self) {
-    const u1* low = (const u1*)SAVEAREA_FROM_FP(self->curFrame);
+    const u1* low = (const u1*)SAVEAREA_FROM_FP(self->interpSave.curFrame);
     u4 stackCrc = self->stackCrc;
     self->stackCrc = 0;
     u4 crc = dvmInitCrc32();
     crc = dvmComputeCrc32(crc, low, self->interpStackStart - low);
     if (crc != stackCrc) {
         const Method* meth = dvmGetCurrentJNIMethod();
-        if (dvmComputeExactFrameDepth(self->curFrame) == 1) {
+        if (dvmComputeExactFrameDepth(self->interpSave.curFrame) == 1) {
             LOGD("JNI: bad stack CRC (0x%08x) -- okay during init", stackCrc);
         } else if (strcmp(meth->name, "nativeLoad") == 0 &&
                 (strcmp(meth->clazz->descriptor, "Ljava/lang/Runtime;") == 0)) {
@@ -378,7 +378,7 @@
     }
 
     IndirectRefTable* pRefTable = getLocalRefTable(env);
-    void* curFrame = ((JNIEnvExt*)env)->self->curFrame;
+    void* curFrame = ((JNIEnvExt*)env)->self->interpSave.curFrame;
     u4 cookie = SAVEAREA_FROM_FP(curFrame)->xtra.localRefCookie;
     jobject jobj = (jobject) dvmAddToIndirectRefTable(pRefTable, cookie, obj);
     if (jobj == NULL) {
@@ -417,7 +417,8 @@
 
     IndirectRefTable* pRefTable = getLocalRefTable(env);
     Thread* self = ((JNIEnvExt*)env)->self;
-    u4 cookie = SAVEAREA_FROM_FP(self->curFrame)->xtra.localRefCookie;
+    u4 cookie =
+        SAVEAREA_FROM_FP(self->interpSave.curFrame)->xtra.localRefCookie;
 
     if (!dvmRemoveFromIndirectRefTable(pRefTable, cookie, jobj)) {
         /*
@@ -844,7 +845,7 @@
 const Method* dvmGetCurrentJNIMethod() {
     assert(dvmThreadSelf() != NULL);
 
-    void* fp = dvmThreadSelf()->curFrame;
+    void* fp = dvmThreadSelf()->interpSave.curFrame;
     const Method* meth = SAVEAREA_FROM_FP(fp)->method;
 
     assert(meth != NULL);
diff --git a/vm/Sync.cpp b/vm/Sync.cpp
index ef3524a..f3781b3 100644
--- a/vm/Sync.cpp
+++ b/vm/Sync.cpp
@@ -276,7 +276,7 @@
     size_t len;
     int fd;
 
-    saveArea = SAVEAREA_FROM_FP(self->curFrame);
+    saveArea = SAVEAREA_FROM_FP(self->interpSave.curFrame);
     meth = saveArea->method;
     cp = eventBuffer;
 
@@ -386,9 +386,10 @@
         const StackSaveArea *saveArea;
         const Method *meth;
         mon->ownerLineNumber = 0;
-        if (self->curFrame == NULL) {
+        if (self->interpSave.curFrame == NULL) {
             mon->ownerFileName = "no_frame";
-        } else if ((saveArea = SAVEAREA_FROM_FP(self->curFrame)) == NULL) {
+        } else if ((saveArea =
+                   SAVEAREA_FROM_FP(self->interpSave.curFrame)) == NULL) {
             mon->ownerFileName = "no_save_area";
         } else if ((meth = saveArea->method) == NULL) {
             mon->ownerFileName = "no_method";
diff --git a/vm/Thread.cpp b/vm/Thread.cpp
index 9f8896b..4d18e14 100644
--- a/vm/Thread.cpp
+++ b/vm/Thread.cpp
@@ -1157,7 +1157,7 @@
      * Null out the "String[] args" argument.
      */
     assert(gDvm.methDalvikSystemNativeStart_main->registersSize == 1);
-    u4* framePtr = (u4*) thread->curFrame;
+    u4* framePtr = (u4*) thread->interpSave.curFrame;
     framePtr[0] = 0;
 
     return true;
@@ -2007,14 +2007,14 @@
      * zero, while a JNI-attached thread will have the synthetic "stack
      * starter" native method at the top.
      */
-    int curDepth = dvmComputeExactFrameDepth(self->curFrame);
+    int curDepth = dvmComputeExactFrameDepth(self->interpSave.curFrame);
     if (curDepth != 0) {
         bool topIsNative = false;
 
         if (curDepth == 1) {
             /* not expecting a lingering break frame; just look at curFrame */
-            assert(!dvmIsBreakFrame((u4*)self->curFrame));
-            StackSaveArea* ssa = SAVEAREA_FROM_FP(self->curFrame);
+            assert(!dvmIsBreakFrame((u4*)self->interpSave.curFrame));
+            StackSaveArea* ssa = SAVEAREA_FROM_FP(self->interpSave.curFrame);
             if (dvmIsNativeMethod(ssa->method))
                 topIsNative = true;
         }
diff --git a/vm/Thread.h b/vm/Thread.h
index c42a9e8..d655732 100644
--- a/vm/Thread.h
+++ b/vm/Thread.h
@@ -125,24 +125,6 @@
      */
     JValue      retval;
 
-    u1*         cardTable;
-
-    /* current limit of stack; flexes for StackOverflowError */
-    const u1*   interpStackEnd;
-
-    /* FP of bottom-most (currently executing) stack frame on interp stack */
-    void*       curFrame;
-    /* current exception, or NULL if nothing pending */
-    Object*     exception;
-
-    bool        debugIsMethodEntry;
-    /* interpreter stack size; our stacks are fixed-length */
-    int         interpStackSize;
-    bool        stackOverflowed;
-
-    /* thread handle, as reported by pthread_self() */
-    pthread_t   handle;
-
     /*
      * interpBreak contains info about the interpreter mode, as well as
      * a count of the number of times the thread has been suspended.  When
@@ -162,6 +144,25 @@
      */
     InterpBreak interpBreak;
 
+    u1*         cardTable;
+
+    /* current limit of stack; flexes for StackOverflowError */
+    const u1*   interpStackEnd;
+
+    /* FP of bottom-most (currently executing) stack frame on interp stack */
+    void*       XcurFrame;
+    /* current exception, or NULL if nothing pending */
+    Object*     exception;
+
+    bool        debugIsMethodEntry;
+    /* interpreter stack size; our stacks are fixed-length */
+    int         interpStackSize;
+    bool        stackOverflowed;
+
+    /* thread handle, as reported by pthread_self() */
+    pthread_t   handle;
+
+
 
     /* Assembly interpreter handler tables */
 #ifndef DVM_NO_ASM_INTERP
diff --git a/vm/alloc/Copying.cpp b/vm/alloc/Copying.cpp
index fca8ae7..f36fc89 100644
--- a/vm/alloc/Copying.cpp
+++ b/vm/alloc/Copying.cpp
@@ -1526,7 +1526,7 @@
     bool first = true;
 #endif
 
-    framePtr = (const u4 *)thread->curFrame;
+    framePtr = (const u4 *)thread->interpSave.curFrame;
     while (framePtr != NULL) {
         const StackSaveArea *saveArea;
         const Method *method;
@@ -1752,7 +1752,7 @@
     Object *obj;
 
     saveArea = NULL;
-    framePtr = (const u4 *)thread->curFrame;
+    framePtr = (const u4 *)thread->interpSave.curFrame;
     for (; framePtr != NULL; framePtr = saveArea->prevFrame) {
         saveArea = SAVEAREA_FROM_FP(framePtr);
         method = (Method *)saveArea->method;
diff --git a/vm/alloc/Visit.cpp b/vm/alloc/Visit.cpp
index b329595..7f949f6 100644
--- a/vm/alloc/Visit.cpp
+++ b/vm/alloc/Visit.cpp
@@ -87,7 +87,7 @@
     assert(thread != NULL);
     u4 threadId = thread->threadId;
     const StackSaveArea *saveArea;
-    for (u4 *fp = (u4 *)thread->curFrame;
+    for (u4 *fp = (u4 *)thread->interpSave.curFrame;
          fp != NULL;
          fp = (u4 *)saveArea->prevFrame) {
         Method *method;
diff --git a/vm/compiler/Compiler.cpp b/vm/compiler/Compiler.cpp
index b0c2e60..d730066 100644
--- a/vm/compiler/Compiler.cpp
+++ b/vm/compiler/Compiler.cpp
@@ -222,7 +222,7 @@
 
 static void crawlDalvikStack(Thread *thread, bool print)
 {
-    void *fp = thread->curFrame;
+    void *fp = thread->interpSave.curFrame;
     StackSaveArea* saveArea = NULL;
     int stackLevel = 0;
 
diff --git a/vm/compiler/Frontend.cpp b/vm/compiler/Frontend.cpp
index 473f3d0..75be703 100644
--- a/vm/compiler/Frontend.cpp
+++ b/vm/compiler/Frontend.cpp
@@ -392,7 +392,7 @@
 static bool filterMethodByCallGraph(Thread *thread, const char *curMethodName)
 {
     /* Crawl the Dalvik stack frames and compare the method name*/
-    StackSaveArea *ssaPtr = ((StackSaveArea *) thread->curFrame) - 1;
+    StackSaveArea *ssaPtr = ((StackSaveArea *) thread->interpSave.curFrame) - 1;
     while (ssaPtr != ((StackSaveArea *) NULL) - 1) {
         const Method *method = ssaPtr->method;
         if (method) {
diff --git a/vm/compiler/codegen/arm/armv7-a-neon/MethodCodegenDriver.cpp b/vm/compiler/codegen/arm/armv7-a-neon/MethodCodegenDriver.cpp
index 98d97d8..32065ae 100644
--- a/vm/compiler/codegen/arm/armv7-a-neon/MethodCodegenDriver.cpp
+++ b/vm/compiler/codegen/arm/armv7-a-neon/MethodCodegenDriver.cpp
@@ -86,8 +86,8 @@
     storeWordDisp(cUnit, newStackSave, offsetof(StackSaveArea, method), method);
     /* thread->method = method */
     storeWordDisp(cUnit, r6SELF, offsetof(InterpSaveState, method), method);
-    /* thread->curFrame = current FP */
-    storeWordDisp(cUnit, r6SELF, offsetof(Thread, curFrame), r5FP);
+    /* thread->interpSave.curFrame = current FP */
+    storeWordDisp(cUnit, r6SELF, offsetof(Thread, interpSave.curFrame), r5FP);
     /* thread->methodClassDex = pDvmDex */
     storeWordDisp(cUnit, r6SELF, offsetof(InterpSaveState, methodClassDex),
                   pDvmDex);
diff --git a/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S b/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S
index e76b766..03b97a4 100644
--- a/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S
+++ b/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S
@@ -36,7 +36,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
     mov     r1, r6
diff --git a/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S b/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S
index 38ade41..2a73c22 100644
--- a/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S
+++ b/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S
@@ -27,7 +27,7 @@
     @ go ahead and transfer control to the native code
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     mov     r2, #0
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
@@ -62,7 +62,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
diff --git a/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S b/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S
index c88e1f2..a7a0961 100644
--- a/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S
+++ b/vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S
@@ -43,7 +43,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r3}                    @ preserve r0-r3
     mov     r1, r6
diff --git a/vm/compiler/template/armv5te/TEMPLATE_RETURN.S b/vm/compiler/template/armv5te/TEMPLATE_RETURN.S
index 52eea8d..d074c9e 100644
--- a/vm/compiler/template/armv5te/TEMPLATE_RETURN.S
+++ b/vm/compiler/template/armv5te/TEMPLATE_RETURN.S
@@ -36,7 +36,7 @@
 
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame] @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
     add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
     str     r0, [rSELF, #offThread_methodClassDex]
     cmp     r8, #0                      @ check the break flags
diff --git a/vm/compiler/template/armv5te/footer.S b/vm/compiler/template/armv5te/footer.S
index 5195d0b..4015ec9 100644
--- a/vm/compiler/template/armv5te/footer.S
+++ b/vm/compiler/template/armv5te/footer.S
@@ -12,7 +12,7 @@
     mov     r2, #0
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in jit code cache
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
     ldrb    lr, [rSELF, #offThread_subMode]
@@ -50,7 +50,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
diff --git a/vm/compiler/template/out/CompilerTemplateAsm-armv5te-vfp.S b/vm/compiler/template/out/CompilerTemplateAsm-armv5te-vfp.S
index c8c2393..c7be29a 100644
--- a/vm/compiler/template/out/CompilerTemplateAsm-armv5te-vfp.S
+++ b/vm/compiler/template/out/CompilerTemplateAsm-armv5te-vfp.S
@@ -197,7 +197,7 @@
 
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame] @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
     add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
     str     r0, [rSELF, #offThread_methodClassDex]
     cmp     r8, #0                      @ check the break flags
@@ -267,7 +267,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r3}                    @ preserve r0-r3
     mov     r1, r6
@@ -325,7 +325,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
     mov     r1, r6
@@ -436,7 +436,7 @@
     @ go ahead and transfer control to the native code
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     mov     r2, #0
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
@@ -471,7 +471,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
@@ -1535,7 +1535,7 @@
 
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame] @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
     add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
     str     r0, [rSELF, #offThread_methodClassDex]
     cmp     r8, #0                      @ check the break flags
@@ -1609,7 +1609,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r3}                    @ preserve r0-r3
     mov     r1, r6
@@ -1671,7 +1671,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
     mov     r1, r6
@@ -1790,7 +1790,7 @@
     @ go ahead and transfer control to the native code
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     mov     r2, #0
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
@@ -1825,7 +1825,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
@@ -1863,7 +1863,7 @@
     mov     r2, #0
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in jit code cache
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
     ldrb    lr, [rSELF, #offThread_subMode]
@@ -1901,7 +1901,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
diff --git a/vm/compiler/template/out/CompilerTemplateAsm-armv5te.S b/vm/compiler/template/out/CompilerTemplateAsm-armv5te.S
index 06218d0..6b57c00 100644
--- a/vm/compiler/template/out/CompilerTemplateAsm-armv5te.S
+++ b/vm/compiler/template/out/CompilerTemplateAsm-armv5te.S
@@ -197,7 +197,7 @@
 
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame] @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
     add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
     str     r0, [rSELF, #offThread_methodClassDex]
     cmp     r8, #0                      @ check the break flags
@@ -267,7 +267,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r3}                    @ preserve r0-r3
     mov     r1, r6
@@ -325,7 +325,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
     mov     r1, r6
@@ -436,7 +436,7 @@
     @ go ahead and transfer control to the native code
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     mov     r2, #0
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
@@ -471,7 +471,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
@@ -1266,7 +1266,7 @@
 
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame] @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
     add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
     str     r0, [rSELF, #offThread_methodClassDex]
     cmp     r8, #0                      @ check the break flags
@@ -1340,7 +1340,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r3}                    @ preserve r0-r3
     mov     r1, r6
@@ -1402,7 +1402,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
     mov     r1, r6
@@ -1521,7 +1521,7 @@
     @ go ahead and transfer control to the native code
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     mov     r2, #0
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
@@ -1556,7 +1556,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
@@ -1594,7 +1594,7 @@
     mov     r2, #0
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in jit code cache
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
     ldrb    lr, [rSELF, #offThread_subMode]
@@ -1632,7 +1632,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
diff --git a/vm/compiler/template/out/CompilerTemplateAsm-armv7-a-neon.S b/vm/compiler/template/out/CompilerTemplateAsm-armv7-a-neon.S
index 2b39d04..4c73919 100644
--- a/vm/compiler/template/out/CompilerTemplateAsm-armv7-a-neon.S
+++ b/vm/compiler/template/out/CompilerTemplateAsm-armv7-a-neon.S
@@ -197,7 +197,7 @@
 
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame] @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
     add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
     str     r0, [rSELF, #offThread_methodClassDex]
     cmp     r8, #0                      @ check the break flags
@@ -267,7 +267,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r3}                    @ preserve r0-r3
     mov     r1, r6
@@ -325,7 +325,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
     mov     r1, r6
@@ -436,7 +436,7 @@
     @ go ahead and transfer control to the native code
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     mov     r2, #0
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
@@ -471,7 +471,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
@@ -1535,7 +1535,7 @@
 
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame] @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
     add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
     str     r0, [rSELF, #offThread_methodClassDex]
     cmp     r8, #0                      @ check the break flags
@@ -1609,7 +1609,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r3}                    @ preserve r0-r3
     mov     r1, r6
@@ -1671,7 +1671,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
     mov     r1, r6
@@ -1790,7 +1790,7 @@
     @ go ahead and transfer control to the native code
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     mov     r2, #0
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
@@ -1825,7 +1825,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
@@ -1863,7 +1863,7 @@
     mov     r2, #0
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in jit code cache
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
     ldrb    lr, [rSELF, #offThread_subMode]
@@ -1901,7 +1901,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
diff --git a/vm/compiler/template/out/CompilerTemplateAsm-armv7-a.S b/vm/compiler/template/out/CompilerTemplateAsm-armv7-a.S
index d8d3b4c..a5e7a31 100644
--- a/vm/compiler/template/out/CompilerTemplateAsm-armv7-a.S
+++ b/vm/compiler/template/out/CompilerTemplateAsm-armv7-a.S
@@ -197,7 +197,7 @@
 
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame] @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
     add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
     str     r0, [rSELF, #offThread_methodClassDex]
     cmp     r8, #0                      @ check the break flags
@@ -267,7 +267,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r3}                    @ preserve r0-r3
     mov     r1, r6
@@ -325,7 +325,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
     mov     r1, r6
@@ -436,7 +436,7 @@
     @ go ahead and transfer control to the native code
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     mov     r2, #0
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
@@ -471,7 +471,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
@@ -1535,7 +1535,7 @@
 
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame] @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
     add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
     str     r0, [rSELF, #offThread_methodClassDex]
     cmp     r8, #0                      @ check the break flags
@@ -1609,7 +1609,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r3}                    @ preserve r0-r3
     mov     r1, r6
@@ -1671,7 +1671,7 @@
     str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
     str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
     mov     rFP, r1                         @ fp = newFp
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = newFp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
     stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
     mov     r1, r6
@@ -1790,7 +1790,7 @@
     @ go ahead and transfer control to the native code
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     mov     r2, #0
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
@@ -1825,7 +1825,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
@@ -1863,7 +1863,7 @@
     mov     r2, #0
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
     str     r2, [rSELF, #offThread_inJitCodeCache] @ not in jit code cache
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
                                         @ newFp->localRefCookie=top
     ldrb    lr, [rSELF, #offThread_subMode]
@@ -1901,7 +1901,7 @@
     ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
diff --git a/vm/interp/Interp.cpp b/vm/interp/Interp.cpp
index 6684c4a..bc2b4ec 100644
--- a/vm/interp/Interp.cpp
+++ b/vm/interp/Interp.cpp
@@ -537,10 +537,11 @@
      * on by PushLocalFrame, we want to use the topmost native method.
      */
     const StackSaveArea* saveArea;
-    void* fp;
-    void* prevFp = NULL;
+    u4* fp;
+    u4* prevFp = NULL;
 
-    for (fp = thread->curFrame; fp != NULL; fp = saveArea->prevFrame) {
+    for (fp = thread->interpSave.curFrame; fp != NULL;
+         fp = saveArea->prevFrame) {
         const Method* method;
 
         saveArea = SAVEAREA_FROM_FP(fp);
@@ -587,7 +588,8 @@
         pCtrl->pAddressSet
                 = dvmAddressSetForLine(saveArea->method, pCtrl->line);
     }
-    pCtrl->frameDepth = dvmComputeVagueFrameDepth(thread, thread->curFrame);
+    pCtrl->frameDepth =
+        dvmComputeVagueFrameDepth(thread, thread->interpSave.curFrame);
     pCtrl->active = true;
 
     LOGV("##### step init: thread=%p meth=%p '%s' line=%d frameDepth=%d depth=%s size=%s\n",
@@ -630,7 +632,7 @@
         int offset = self->interpSave.pc - curMethod->insns;
         int catchRelPc = dvmFindCatchBlock(self, offset, exception,
                                            true, &catchFrame);
-        dvmDbgPostException(self->interpSave.fp, offset, catchFrame,
+        dvmDbgPostException(self->interpSave.curFrame, offset, catchFrame,
                             catchRelPc, exception);
     }
 }
@@ -649,10 +651,10 @@
  * The interpreter is preparing to do a native invoke. Handle any
  * special subMode requirements.  NOTE: for a native invoke,
  * dvmReportInvoke() and dvmReportPreNativeInvoke() will both
- * be called prior to the invoke.  All interpSave state must
- * be valid on entry.
+ * be called prior to the invoke.  fp is the Dalvik FP of the calling
+ * method.
  */
-void dvmReportPreNativeInvoke(const Method* methodToCall, Thread* self)
+void dvmReportPreNativeInvoke(const Method* methodToCall, Thread* self, u4* fp)
 {
 #if defined(WITH_JIT)
     /*
@@ -664,8 +666,7 @@
     }
 #endif
     if (self->interpBreak.ctl.subMode & kSubModeDebuggerActive) {
-        Object* thisPtr = dvmGetThisPtr(self->interpSave.method,
-                                        self->interpSave.fp);
+        Object* thisPtr = dvmGetThisPtr(self->interpSave.method, fp);
         assert(thisPtr == NULL || dvmIsValidObject(thisPtr));
         dvmDbgPostLocationEvent(methodToCall, -1, thisPtr, DBG_METHOD_ENTRY);
     }
@@ -673,14 +674,13 @@
 
 /*
  * The interpreter has returned from a native invoke. Handle any
- * special subMode requirements.  All interpSave state must be
- * valid on entry.
+ * special subMode requirements.  fp is the Dalvik FP of the calling
+ * method.
  */
-void dvmReportPostNativeInvoke(const Method* methodToCall, Thread* self)
+void dvmReportPostNativeInvoke(const Method* methodToCall, Thread* self, u4* fp)
 {
     if (self->interpBreak.ctl.subMode & kSubModeDebuggerActive) {
-        Object* thisPtr = dvmGetThisPtr(self->interpSave.method,
-                                        self->interpSave.fp);
+        Object* thisPtr = dvmGetThisPtr(self->interpSave.method, fp);
         assert(thisPtr == NULL || dvmIsValidObject(thisPtr));
         dvmDbgPostLocationEvent(methodToCall, -1, thisPtr, DBG_METHOD_EXIT);
     }
@@ -697,7 +697,7 @@
 {
     TRACE_METHOD_EXIT(self, self->interpSave.method);
 #if defined(WITH_JIT)
-    if (dvmIsBreakFrame(self->interpSave.fp) &&
+    if (dvmIsBreakFrame(self->interpSave.curFrame) &&
         (self->interpBreak.ctl.subMode & kSubModeJitTraceBuild)) {
         dvmCheckJit(self->interpSave.pc, self);
     }
@@ -1766,7 +1766,7 @@
                 dvmUnlockMutex(&self->callbackMutex);
                 // Update Thread structure
                 self->interpSave.pc = pc;
-                self->interpSave.fp = fp;
+                self->interpSave.curFrame = fp;
                 if (callback != NULL) {
                     // Do the callback
                     if (!callback(self,arg)) {
@@ -1948,7 +1948,7 @@
      * No need to initialize "retval".
      */
     self->interpSave.method = method;
-    self->interpSave.fp = (u4*) self->curFrame;
+    self->interpSave.curFrame = (u4*) self->interpSave.curFrame;
     self->interpSave.pc = method->insns;
 
     assert(!dvmIsNativeMethod(method));
diff --git a/vm/interp/Interp.h b/vm/interp/Interp.h
index 5626160..6951c5a 100644
--- a/vm/interp/Interp.h
+++ b/vm/interp/Interp.h
@@ -83,8 +83,8 @@
  */
 void dvmCheckBefore(const u2 *dPC, u4 *fp, Thread* self);
 void dvmReportExceptionThrow(Thread* self, Object* exception);
-void dvmReportPreNativeInvoke(const Method* methodToCall, Thread* self);
-void dvmReportPostNativeInvoke(const Method* methodToCall, Thread* self);
+void dvmReportPreNativeInvoke(const Method* methodToCall, Thread* self, u4* fp);
+void dvmReportPostNativeInvoke(const Method* methodToCall, Thread* self, u4* fp);
 void dvmReportInvoke(Thread* self, const Method* methodToCall);
 void dvmReportReturn(Thread* self);
 
diff --git a/vm/interp/InterpState.h b/vm/interp/InterpState.h
index 77c343b..144cd2a 100644
--- a/vm/interp/InterpState.h
+++ b/vm/interp/InterpState.h
@@ -110,7 +110,7 @@
 
 typedef struct InterpSaveState {
     const u2*       pc;         // Dalvik PC
-    u4*             fp;         // Dalvik frame pointer
+    u4*             curFrame;   // Dalvik frame pointer
     const Method    *method;    // Method being executed
     DvmDex*         methodClassDex;
     void*           bailPtr;
diff --git a/vm/interp/Jit.cpp b/vm/interp/Jit.cpp
index 5ac7921..c048ed6 100644
--- a/vm/interp/Jit.cpp
+++ b/vm/interp/Jit.cpp
@@ -109,9 +109,8 @@
     shadowSpace->shadowFP = shadowSpace->registerSpace +
                             shadowSpace->registerSpaceSize - postBytes/4;
 
-    self->interpSave.fp = (u4*)shadowSpace->shadowFP;
+    self->interpSave.curFrame = (u4*)shadowSpace->shadowFP;
     self->interpStackEnd = (u1*)shadowSpace->registerSpace;
-    self->curFrame = self->interpSave.fp;
 
     // Create a copy of the stack
     memcpy(((char*)shadowSpace->shadowFP)-preBytes, ((char*)fp)-preBytes,
@@ -163,8 +162,7 @@
 
     /* Restore state before returning */
     self->interpSave.pc = shadowSpace->startPC;
-    self->interpSave.fp = shadowSpace->fp;
-    self->curFrame = self->interpSave.fp;
+    self->interpSave.curFrame = shadowSpace->fp;
     self->interpSave.method = shadowSpace->method;
     self->interpSave.methodClassDex = shadowSpace->methodClassDex;
     self->retval = shadowSpace->retval;
@@ -187,16 +185,17 @@
 static void selfVerificationDumpState(const u2* pc, Thread* self)
 {
     ShadowSpace* shadowSpace = self->shadowSpace;
-    StackSaveArea* stackSave = SAVEAREA_FROM_FP(self->curFrame);
+    StackSaveArea* stackSave = SAVEAREA_FROM_FP(self->interpSave.curFrame);
     int frameBytes = (int) shadowSpace->registerSpace +
                      shadowSpace->registerSpaceSize*4 -
                      (int) shadowSpace->shadowFP;
     int localRegs = 0;
     int frameBytes2 = 0;
-    if ((uintptr_t)self->curFrame < (uintptr_t)shadowSpace->fp) {
+    if ((uintptr_t)self->interpSave.curFrame < (uintptr_t)shadowSpace->fp) {
         localRegs = (stackSave->method->registersSize -
                      stackSave->method->insSize)*4;
-        frameBytes2 = (int) shadowSpace->fp - (int) self->curFrame - localRegs;
+        frameBytes2 = (int) shadowSpace->fp -
+                      (int)self->interpSave.curFrame - localRegs;
     }
     LOGD("********** SHADOW STATE DUMP **********");
     LOGD("CurrentPC: 0x%x, Offset: 0x%04x", (int)pc,
@@ -206,7 +205,7 @@
     LOGD("Dalvik PC: 0x%x endPC: 0x%x", (int)shadowSpace->startPC,
         (int)shadowSpace->endPC);
     LOGD("Interp FP: 0x%x endFP: 0x%x", (int)shadowSpace->fp,
-        (int)self->curFrame);
+        (int)self->interpSave.curFrame);
     LOGD("Shadow FP: 0x%x endFP: 0x%x", (int)shadowSpace->shadowFP,
         (int)shadowSpace->endShadowFP);
     LOGD("Frame1 Bytes: %d Frame2 Local: %d Bytes: %d", frameBytes,
@@ -219,7 +218,7 @@
 static void selfVerificationDumpTrace(const u2* pc, Thread* self)
 {
     ShadowSpace* shadowSpace = self->shadowSpace;
-    StackSaveArea* stackSave = SAVEAREA_FROM_FP(self->curFrame);
+    StackSaveArea* stackSave = SAVEAREA_FROM_FP(self->interpSave.curFrame);
     int i, addr, offset;
     DecodedInstruction *decInsn;
 
@@ -326,13 +325,14 @@
             selfVerificationSpinLoop(shadowSpace);
         }
         /* Check new frame if it exists (invokes only) */
-        if ((uintptr_t)self->curFrame < (uintptr_t)shadowSpace->fp) {
-            StackSaveArea* stackSave = SAVEAREA_FROM_FP(self->curFrame);
+        if ((uintptr_t)self->interpSave.curFrame < (uintptr_t)shadowSpace->fp) {
+            StackSaveArea* stackSave =
+                SAVEAREA_FROM_FP(self->interpSave.curFrame);
             int localRegs = (stackSave->method->registersSize -
                              stackSave->method->insSize)*4;
             int frameBytes2 = (int) shadowSpace->fp -
-                              (int) self->curFrame - localRegs;
-            if (memcmp(((char*)self->curFrame)+localRegs,
+                              (int) self->interpSave.curFrame - localRegs;
+            if (memcmp(((char*)self->interpSave.curFrame)+localRegs,
                 ((char*)shadowSpace->endShadowFP)+localRegs, frameBytes2)) {
                 if (state == kSVSBackwardBranch) {
                     /*
@@ -347,14 +347,14 @@
                 selfVerificationDumpState(pc, self);
                 selfVerificationDumpTrace(pc, self);
                 LOGD("*** Interp Registers: addr: 0x%x l: %d bytes: %d",
-                    (int)self->curFrame, localRegs, frameBytes2);
-                selfVerificationPrintRegisters((int*)self->curFrame,
+                    (int)self->interpSave.curFrame, localRegs, frameBytes2);
+                selfVerificationPrintRegisters((int*)self->interpSave.curFrame,
                                                (int*)shadowSpace->endShadowFP,
                                                (frameBytes2+localRegs)/4);
                 LOGD("*** Shadow Registers: addr: 0x%x l: %d bytes: %d",
                     (int)shadowSpace->endShadowFP, localRegs, frameBytes2);
                 selfVerificationPrintRegisters((int*)shadowSpace->endShadowFP,
-                                               (int*)self->curFrame,
+                                               (int*)self->interpSave.curFrame,
                                                (frameBytes2+localRegs)/4);
                 selfVerificationSpinLoop(shadowSpace);
             }
diff --git a/vm/interp/Stack.cpp b/vm/interp/Stack.cpp
index e938990..120726e 100644
--- a/vm/interp/Stack.cpp
+++ b/vm/interp/Stack.cpp
@@ -35,7 +35,7 @@
 {
     assert(thread->interpStackStart != NULL);
 
-    assert(thread->curFrame == NULL);
+    assert(thread->interpSave.curFrame == NULL);
 
     return true;
 }
@@ -70,8 +70,8 @@
                 + sizeof(StackSaveArea) * 2     // break frame + regular frame
                 + method->outsSize * 4;         // args to other methods
 
-    if (self->curFrame != NULL)
-        stackPtr = (u1*) SAVEAREA_FROM_FP(self->curFrame);
+    if (self->interpSave.curFrame != NULL)
+        stackPtr = (u1*) SAVEAREA_FROM_FP(self->interpSave.curFrame);
     else
         stackPtr = self->interpStackStart;
 
@@ -79,7 +79,7 @@
         /* not enough space */
         LOGW("Stack overflow on call to interp "
              "(req=%d top=%p cur=%p size=%d %s.%s)\n",
-            stackReq, self->interpStackStart, self->curFrame,
+            stackReq, self->interpStackStart, self->interpSave.curFrame,
             self->interpStackSize, method->clazz->descriptor, method->name);
         dvmHandleStackOverflow(self, method);
         assert(dvmCheckException(self));
@@ -100,11 +100,12 @@
     memset(stackPtr - (method->outsSize*4), 0xaf, stackReq);
 #endif
 #ifdef EASY_GDB
-    breakSaveBlock->prevSave = (StackSaveArea*)FP_FROM_SAVEAREA(self->curFrame);
+    breakSaveBlock->prevSave =
+       (StackSaveArea*)FP_FROM_SAVEAREA(self->interpSave.curFrame);
     saveBlock->prevSave = breakSaveBlock;
 #endif
 
-    breakSaveBlock->prevFrame = self->curFrame;
+    breakSaveBlock->prevFrame = self->interpSave.curFrame;
     breakSaveBlock->savedPc = NULL;             // not required
     breakSaveBlock->xtra.localRefCookie = 0;    // not required
     breakSaveBlock->method = NULL;
@@ -114,10 +115,10 @@
     saveBlock->method = method;
 
     LOGVV("PUSH frame: old=%p new=%p (size=%d)\n",
-        self->curFrame, FP_FROM_SAVEAREA(saveBlock),
-        (u1*)self->curFrame - (u1*)FP_FROM_SAVEAREA(saveBlock));
+        self->interpSave.curFrame, FP_FROM_SAVEAREA(saveBlock),
+        (u1*)self->interpSave.curFrame - (u1*)FP_FROM_SAVEAREA(saveBlock));
 
-    self->curFrame = FP_FROM_SAVEAREA(saveBlock);
+    self->interpSave.curFrame = FP_FROM_SAVEAREA(saveBlock);
 
     return true;
 }
@@ -143,8 +144,8 @@
     stackReq = method->registersSize * 4        // params only
                 + sizeof(StackSaveArea) * 2;    // break frame + regular frame
 
-    if (self->curFrame != NULL)
-        stackPtr = (u1*) SAVEAREA_FROM_FP(self->curFrame);
+    if (self->interpSave.curFrame != NULL)
+        stackPtr = (u1*) SAVEAREA_FROM_FP(self->interpSave.curFrame);
     else
         stackPtr = self->interpStackStart;
 
@@ -152,7 +153,7 @@
         /* not enough space */
         LOGW("Stack overflow on call to native "
              "(req=%d top=%p cur=%p size=%d '%s')\n",
-            stackReq, self->interpStackStart, self->curFrame,
+            stackReq, self->interpStackStart, self->interpSave.curFrame,
             self->interpStackSize, method->name);
         dvmHandleStackOverflow(self, method);
         assert(dvmCheckException(self));
@@ -174,16 +175,16 @@
     memset(stackPtr, 0xaf, stackReq);
 #endif
 #ifdef EASY_GDB
-    if (self->curFrame == NULL)
+    if (self->interpSave.curFrame == NULL)
         breakSaveBlock->prevSave = NULL;
     else {
-        void* fp = FP_FROM_SAVEAREA(self->curFrame);
+        void* fp = FP_FROM_SAVEAREA(self->interpSave.curFrame);
         breakSaveBlock->prevSave = (StackSaveArea*)fp;
     }
     saveBlock->prevSave = breakSaveBlock;
 #endif
 
-    breakSaveBlock->prevFrame = self->curFrame;
+    breakSaveBlock->prevFrame = self->interpSave.curFrame;
     breakSaveBlock->savedPc = NULL;             // not required
     breakSaveBlock->xtra.localRefCookie = 0;    // not required
     breakSaveBlock->method = NULL;
@@ -193,10 +194,10 @@
     saveBlock->method = method;
 
     LOGVV("PUSH JNI frame: old=%p new=%p (size=%d)\n",
-        self->curFrame, FP_FROM_SAVEAREA(saveBlock),
-        (u1*)self->curFrame - (u1*)FP_FROM_SAVEAREA(saveBlock));
+        self->interpSave.curFrame, FP_FROM_SAVEAREA(saveBlock),
+        (u1*)self->interpSave.curFrame - (u1*)FP_FROM_SAVEAREA(saveBlock));
 
-    self->curFrame = FP_FROM_SAVEAREA(saveBlock);
+    self->interpSave.curFrame = FP_FROM_SAVEAREA(saveBlock);
 
     return true;
 }
@@ -217,14 +218,14 @@
 
     stackReq = sizeof(StackSaveArea);       // regular frame
 
-    assert(self->curFrame != NULL);
-    stackPtr = (u1*) SAVEAREA_FROM_FP(self->curFrame);
+    assert(self->interpSave.curFrame != NULL);
+    stackPtr = (u1*) SAVEAREA_FROM_FP(self->interpSave.curFrame);
 
     if (stackPtr - stackReq < self->interpStackEnd) {
         /* not enough space; let JNI throw the exception */
         LOGW("Stack overflow on PushLocal "
              "(req=%d top=%p cur=%p size=%d '%s')\n",
-            stackReq, self->interpStackStart, self->curFrame,
+            stackReq, self->interpStackStart, self->interpSave.curFrame,
             self->interpStackSize, method->name);
         dvmHandleStackOverflow(self, method);
         assert(dvmCheckException(self));
@@ -243,19 +244,20 @@
     memset(stackPtr, 0xaf, stackReq);
 #endif
 #ifdef EASY_GDB
-    saveBlock->prevSave = (StackSaveArea*)FP_FROM_SAVEAREA(self->curFrame);
+    saveBlock->prevSave =
+        (StackSaveArea*)FP_FROM_SAVEAREA(self->interpSave.curFrame);
 #endif
 
-    saveBlock->prevFrame = self->curFrame;
+    saveBlock->prevFrame = self->interpSave.curFrame;
     saveBlock->savedPc = NULL;                  // not required
     saveBlock->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
     saveBlock->method = method;
 
     LOGVV("PUSH JNI local frame: old=%p new=%p (size=%d)\n",
-        self->curFrame, FP_FROM_SAVEAREA(saveBlock),
-        (u1*)self->curFrame - (u1*)FP_FROM_SAVEAREA(saveBlock));
+        self->interpSave.curFrame, FP_FROM_SAVEAREA(saveBlock),
+        (u1*)self->interpSave.curFrame - (u1*)FP_FROM_SAVEAREA(saveBlock));
 
-    self->curFrame = FP_FROM_SAVEAREA(saveBlock);
+    self->interpSave.curFrame = FP_FROM_SAVEAREA(saveBlock);
 
     return true;
 }
@@ -268,9 +270,9 @@
  */
 bool dvmPopLocalFrame(Thread* self)
 {
-    StackSaveArea* saveBlock = SAVEAREA_FROM_FP(self->curFrame);
+    StackSaveArea* saveBlock = SAVEAREA_FROM_FP(self->interpSave.curFrame);
 
-    assert(!dvmIsBreakFrame((u4*)self->curFrame));
+    assert(!dvmIsBreakFrame((u4*)self->interpSave.curFrame));
     if (saveBlock->method != SAVEAREA_FROM_FP(saveBlock->prevFrame)->method) {
         /*
          * The previous frame doesn't have the same method pointer -- we've
@@ -286,7 +288,7 @@
         saveBlock->method->name,
         SAVEAREA_FROM_FP(saveBlock->prevFrame)->method->name);
     dvmPopJniLocals(self, saveBlock);
-    self->curFrame = saveBlock->prevFrame;
+    self->interpSave.curFrame = saveBlock->prevFrame;
 
     return true;
 }
@@ -304,11 +306,11 @@
 {
     StackSaveArea* saveBlock;
 
-    if (self->curFrame == NULL)
+    if (self->interpSave.curFrame == NULL)
         return false;
 
-    saveBlock = SAVEAREA_FROM_FP(self->curFrame);
-    assert(!dvmIsBreakFrame((u4*)self->curFrame));
+    saveBlock = SAVEAREA_FROM_FP(self->interpSave.curFrame);
+    assert(!dvmIsBreakFrame((u4*)self->interpSave.curFrame));
 
     /*
      * Remove everything up to the break frame.  If this was a call into
@@ -335,16 +337,16 @@
     }
 
     LOGVV("POP frame: cur=%p new=%p\n",
-        self->curFrame, saveBlock->prevFrame);
+        self->interpSave.curFrame, saveBlock->prevFrame);
 
-    self->curFrame = saveBlock->prevFrame;
+    self->interpSave.curFrame = saveBlock->prevFrame;
     return true;
 }
 
 /*
  * Common code for dvmCallMethodV/A and dvmInvokeMethod.
  *
- * Pushes a call frame on, advancing self->curFrame.
+ * Pushes a call frame on, advancing self->interpSave.curFrame.
  */
 static ClassObject* callPrep(Thread* self, const Method* method, Object* obj,
     bool checkAccess)
@@ -376,7 +378,7 @@
 
     if (checkAccess) {
         /* needed for java.lang.reflect.Method.invoke */
-        if (!dvmCheckMethodAccess(dvmGetCaller2Class(self->curFrame),
+        if (!dvmCheckMethodAccess(dvmGetCaller2Class(self->interpSave.curFrame),
                 method))
         {
             /* note this throws IAException, not IAError */
@@ -389,7 +391,7 @@
      * Push a call frame on.  If there isn't enough room for ins, locals,
      * outs, and the saved state, it will throw an exception.
      *
-     * This updates self->curFrame.
+     * This updates self->interpSave.curFrame.
      */
     if (dvmIsNativeMethod(method)) {
         /* native code calling native code the hard way */
@@ -446,9 +448,10 @@
         return;
 
     /* "ins" for new frame start at frame pointer plus locals */
-    ins = ((u4*)self->curFrame) + (method->registersSize - method->insSize);
+    ins = ((u4*)self->interpSave.curFrame) +
+           (method->registersSize - method->insSize);
 
-    //LOGD("  FP is %p, INs live at >= %p\n", self->curFrame, ins);
+    //LOGD("  FP is %p, INs live at >= %p\n", self->interpSave.curFrame, ins);
 
     /* put "this" pointer into in0 if appropriate */
     if (!dvmIsStaticMethod(method)) {
@@ -513,7 +516,8 @@
          * Because we leave no space for local variables, "curFrame" points
          * directly at the method arguments.
          */
-        (*method->nativeFunc)((u4*)self->curFrame, pResult, method, self);
+        (*method->nativeFunc)((u4*)self->interpSave.curFrame, pResult,
+                              method, self);
         TRACE_METHOD_EXIT(self, method);
     } else {
         dvmInterpret(self, method, pResult);
@@ -551,7 +555,8 @@
         return;
 
     /* "ins" for new frame start at frame pointer plus locals */
-    ins = ((u4*)self->curFrame) + (method->registersSize - method->insSize);
+    ins = ((u4*)self->interpSave.curFrame) +
+        (method->registersSize - method->insSize);
 
     /* put "this" pointer into in0 if appropriate */
     if (!dvmIsStaticMethod(method)) {
@@ -617,7 +622,8 @@
          * Because we leave no space for local variables, "curFrame" points
          * directly at the method arguments.
          */
-        (*method->nativeFunc)((u4*)self->curFrame, pResult, method, self);
+        (*method->nativeFunc)((u4*)self->interpSave.curFrame, pResult,
+                              method, self);
         TRACE_METHOD_EXIT(self, method);
     } else {
         dvmInterpret(self, method, pResult);
@@ -682,10 +688,11 @@
     needPop = true;
 
     /* "ins" for new frame start at frame pointer plus locals */
-    ins = ((s4*)self->curFrame) + (method->registersSize - method->insSize);
+    ins = ((s4*)self->interpSave.curFrame) +
+        (method->registersSize - method->insSize);
     verifyCount = 0;
 
-    //LOGD("  FP is %p, INs live at >= %p\n", self->curFrame, ins);
+    //LOGD("  FP is %p, INs live at >= %p\n", self->interpSave.curFrame, ins);
 
     /* put "this" pointer into in0 if appropriate */
     if (!dvmIsStaticMethod(method)) {
@@ -728,7 +735,8 @@
          * Because we leave no space for local variables, "curFrame" points
          * directly at the method arguments.
          */
-        (*method->nativeFunc)((u4*)self->curFrame, &retval, method, self);
+        (*method->nativeFunc)((u4*)self->interpSave.curFrame, &retval,
+                              method, self);
         TRACE_METHOD_EXIT(self, method);
     } else {
         dvmInterpret(self, method, &retval);
@@ -925,7 +933,8 @@
     void* callerCaller;
 
     /* at the top? */
-    if (dvmIsBreakFrame((u4*)caller) && SAVEAREA_FROM_FP(caller)->prevFrame == NULL)
+    if (dvmIsBreakFrame((u4*)caller) &&
+        SAVEAREA_FROM_FP(caller)->prevFrame == NULL)
         return NULL;
 
     /* go one more */
@@ -948,7 +957,8 @@
     int i;
 
     /* at the top? */
-    if (dvmIsBreakFrame((u4*)caller) && SAVEAREA_FROM_FP(caller)->prevFrame == NULL)
+    if (dvmIsBreakFrame((u4*)caller) &&
+        SAVEAREA_FROM_FP(caller)->prevFrame == NULL)
         return NULL;
 
     /* Walk up two frames if possible. */
@@ -1012,7 +1022,7 @@
     LOGI("threadid=%d: stack overflow on call to %s.%s:%s\n",
         self->threadId,
         method->clazz->descriptor, method->name, method->shorty);
-    StackSaveArea* saveArea = SAVEAREA_FROM_FP(self->curFrame);
+    StackSaveArea* saveArea = SAVEAREA_FROM_FP(self->interpSave.curFrame);
     LOGI("  method requires %d+%d+%d=%d bytes, fp is %p (%d left)\n",
         method->registersSize * 4, sizeof(StackSaveArea), method->outsSize * 4,
         (method->registersSize + method->outsSize) * 4 + sizeof(StackSaveArea),
@@ -1054,9 +1064,9 @@
 
     newStackEnd = (self->interpStackStart - self->interpStackSize)
         + STACK_OVERFLOW_RESERVE;
-    if ((u1*)self->curFrame <= newStackEnd) {
+    if ((u1*)self->interpSave.curFrame <= newStackEnd) {
         LOGE("Can't shrink stack: curFrame is in reserved area (%p %p)\n",
-            self->interpStackEnd, self->curFrame);
+            self->interpStackEnd, self->interpSave.curFrame);
         dvmDumpThread(self, false);
         dvmAbort();
     }
@@ -1065,7 +1075,7 @@
     self->stackOverflowed = false;
 
     LOGI("Shrank stack (to %p, curFrame is %p)\n", self->interpStackEnd,
-        self->curFrame);
+        self->interpSave.curFrame);
 }
 
 
@@ -1084,7 +1094,7 @@
 static bool extractMonitorEnterObject(Thread* thread, Object** pLockObj,
     Thread** pOwner)
 {
-    void* framePtr = thread->curFrame;
+    void* framePtr = thread->interpSave.curFrame;
 
     if (framePtr == NULL || dvmIsBreakFrame((u4*)framePtr))
         return false;
@@ -1201,7 +1211,8 @@
             else
                 relPc = -1;
 
-            char* className = dvmHumanReadableDescriptor(method->clazz->descriptor);
+            char* className =
+                dvmHumanReadableDescriptor(method->clazz->descriptor);
             if (dvmIsNativeMethod(method))
                 dvmPrintDebugMessage(target,
                     "  at %s.%s(Native Method)\n", className, method->name);
@@ -1228,7 +1239,8 @@
                     Object* obj = dvmGetMonitorObject(mon);
                     if (obj != NULL) {
                         Thread* joinThread = NULL;
-                        className = dvmHumanReadableDescriptor(obj->clazz->descriptor);
+                        className =
+                            dvmHumanReadableDescriptor(obj->clazz->descriptor);
                         if (strcmp(className, "java.lang.VMThread") == 0) {
                             joinThread = dvmGetThreadFromThreadObject(obj);
                         }
@@ -1246,7 +1258,8 @@
                     Object* obj;
                     Thread* owner;
                     if (extractMonitorEnterObject(thread, &obj, &owner)) {
-                        className = dvmHumanReadableDescriptor(obj->clazz->descriptor);
+                        className =
+                            dvmHumanReadableDescriptor(obj->clazz->descriptor);
                         if (owner != NULL) {
                             char* threadName = dvmGetThreadName(owner);
                             dvmPrintDebugMessage(target,
@@ -1302,7 +1315,7 @@
  */
 void dvmDumpThreadStack(const DebugOutputTarget* target, Thread* thread)
 {
-    dumpFrames(target, thread->curFrame, thread);
+    dumpFrames(target, thread->interpSave.curFrame, thread);
 }
 
 /*
@@ -1325,7 +1338,7 @@
     void* fp;
     int depthLimit = 200;
 
-    if (thread == NULL || thread->curFrame == NULL) {
+    if (thread == NULL || thread->interpSave.curFrame == NULL) {
         dvmPrintDebugMessage(target,
             "DumpRunning: Thread at %p has no curFrame (threadid=%d)\n",
             thread, (thread != NULL) ? thread->threadId : 0);
@@ -1339,13 +1352,14 @@
     origSize = thread->interpStackSize;
     origStack = (const u1*) thread->interpStackStart - origSize;
     stackCopy = (u1*) malloc(origSize);
-    fpOffset = (u1*) thread->curFrame - origStack;
+    fpOffset = (u1*) thread->interpSave.curFrame - origStack;
     memcpy(stackCopy, origStack, origSize);
 
     /*
      * Run through the stack and rewrite the "prev" pointers.
      */
-    //LOGI("DR: fpOff=%d (from %p %p)\n",fpOffset, origStack, thread->curFrame);
+    //LOGI("DR: fpOff=%d (from %p %p)\n",fpOffset, origStack,
+    //     thread->interpSave.curFrame);
     fp = stackCopy + fpOffset;
     while (true) {
         int prevOffset;
@@ -1368,7 +1382,7 @@
             break;
         }
 
-        saveArea->prevFrame = stackCopy + prevOffset;
+        saveArea->prevFrame = (u4*)(stackCopy + prevOffset);
         fp = saveArea->prevFrame;
     }
 
diff --git a/vm/interp/Stack.h b/vm/interp/Stack.h
index 99bef1a..69dd3da 100644
--- a/vm/interp/Stack.h
+++ b/vm/interp/Stack.h
@@ -133,7 +133,7 @@
 #endif
 
     /* saved frame pointer for previous frame, or NULL if this is at bottom */
-    void*       prevFrame;
+    u4*         prevFrame;
 
     /* saved program counter (from method in caller's frame) */
     const u2*   savedPc;
@@ -159,7 +159,7 @@
 
 /* move between the stack save area and the frame pointer */
 #define SAVEAREA_FROM_FP(_fp)   ((StackSaveArea*)(_fp) -1)
-#define FP_FROM_SAVEAREA(_save) ((void*) ((StackSaveArea*)(_save) +1))
+#define FP_FROM_SAVEAREA(_save) ((u4*) ((StackSaveArea*)(_save) +1))
 
 /* when calling a function, get a pointer to outs[0] */
 #define OUTS_FROM_FP(_fp, _argCount) \
diff --git a/vm/mterp/Mterp.cpp b/vm/mterp/Mterp.cpp
index 7172434..d8ba97d 100644
--- a/vm/mterp/Mterp.cpp
+++ b/vm/mterp/Mterp.cpp
@@ -86,7 +86,7 @@
         free(desc);
     }
     //LOGI("self is %p, pc=%p, fp=%p\n", self, self->interpSave.pc,
-    //      self->interpSave.fp);
+    //      self->interpSave.curFrame);
     //LOGI("first instruction is 0x%04x\n", self->interpSave.pc[0]);
 
     /*
diff --git a/vm/mterp/armv5te/footer.S b/vm/mterp/armv5te/footer.S
index b262b1e..7a8ed04 100644
--- a/vm/mterp/armv5te/footer.S
+++ b/vm/mterp/armv5te/footer.S
@@ -641,7 +641,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     cmp     r0,#0
     bne     common_updateProfile
     GOTO_OPCODE(ip)                         @ jump to next instruction
@@ -649,7 +649,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     GOTO_OPCODE(ip)                         @ jump to next instruction
 #endif
 
@@ -657,7 +657,6 @@
     @ Profiling - record method entry.  r0: methodToCall
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r1, r0
     mov     r0, rSELF
     bl      dvmReportInvoke             @ (self, method)
@@ -669,7 +668,7 @@
     @ r0=methodToCall, r1=newFp, r10=newSaveArea
     ldrb    lr, [rSELF, #offThread_subMode]
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
     mov     r2, r0                      @ r2<- methodToCall
     mov     r0, r1                      @ r0<- newFp (points to args)
@@ -697,7 +696,7 @@
     @ equivalent to dvmPopJniLocals
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     bne     common_exceptionThrown      @ no, handle exception
@@ -709,11 +708,10 @@
 11:
     @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
     stmfd   sp!, {r0-r3}                @ save all but subModes
-    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPreNativeInvoke    @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
     ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
 
     @ Call the native method
@@ -724,10 +722,10 @@
     ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
 
     @ Finish up any post-invoke subMode requirements
-    @ interpSave already up-to-date
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPostNativeInvoke   @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
     b       7b                          @ resume
 
 .LstackOverflow:    @ r0=methodToCall
@@ -800,7 +798,7 @@
     PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
 #if defined(WITH_JIT)
     ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
     mov     rPC, r9                     @ publish new rPC
@@ -822,7 +820,7 @@
     @ On entry, r0: StackSaveArea
     ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     r1, [rSELF, #offThread_fp]   @ update interpSave.fp
+    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
     mov     r0, rSELF
     bl      dvmReportReturn             @ (self)
     SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
@@ -905,7 +903,7 @@
     add     sp, sp, #8                  @ restore stack
     bmi     .LnotCaughtLocally
 
-    /* adjust locals to match self->curFrame and updated PC */
+    /* adjust locals to match self->interpSave.curFrame and updated PC */
     SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
     ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
     str     r1, [rSELF, #offThread_method]  @ self->method = new method
@@ -931,7 +929,7 @@
     @ Manage debugger bookkeeping
 7:
     str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp]     @ update interpSave.fp
+    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
     mov     r0, rSELF                       @ arg0<- self
     mov     r1, r9                          @ arg1<- exception
     bl      dvmReportExceptionThrow         @ (self, exception)
diff --git a/vm/mterp/armv5te/header.S b/vm/mterp/armv5te/header.S
index ad45eb7..b3c8f0a 100644
--- a/vm/mterp/armv5te/header.S
+++ b/vm/mterp/armv5te/header.S
@@ -75,8 +75,8 @@
 /* save/restore the PC and/or FP from the thread struct */
 #define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
 #define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
-#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_fp]
-#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
+#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
+#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
 #define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
 #define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
 
diff --git a/vm/mterp/c/gotoTargets.cpp b/vm/mterp/c/gotoTargets.cpp
index cd12229..c615cba 100644
--- a/vm/mterp/c/gotoTargets.cpp
+++ b/vm/mterp/c/gotoTargets.cpp
@@ -629,7 +629,7 @@
         }
 
         /* update thread FP, and reset local variables */
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -766,10 +766,10 @@
 #endif
 
         /*
-         * Adjust local variables to match self->curFrame and the
+         * Adjust local variables to match self->interpSave.curFrame and the
          * updated PC.
          */
-        //fp = (u4*) self->curFrame;
+        //fp = (u4*) self->interpSave.curFrame;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -948,7 +948,7 @@
              * calls.  For native calls, we'll mark EXIT on return.
              * For non-native calls, EXIT is marked in the RETURN op.
              */
-            PC_FP_TO_SELF();
+            PC_TO_SELF();
             dvmReportInvoke(self, methodToCall);
         }
 
@@ -961,7 +961,7 @@
             self->interpSave.method = curMethod;
             methodClassDex = curMethod->clazz->pDvmDex;
             pc = methodToCall->insns;
-            self->curFrame = fp = newFp;
+            self->interpSave.curFrame = fp = newFp;
 #ifdef EASY_GDB
             debugSaveArea = SAVEAREA_FROM_FP(newFp);
 #endif
@@ -974,13 +974,12 @@
             /* set this up for JNI locals, even if not a JNI native */
             newSaveArea->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
 
-            self->curFrame = newFp;
+            self->interpSave.curFrame = newFp;
 
             DUMP_REGS(methodToCall, newFp, true);   // show input args
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPreNativeInvoke(methodToCall, self);
+                dvmReportPreNativeInvoke(methodToCall, self, fp);
             }
 
             ILOGD("> native <-- %s.%s %s", methodToCall->clazz->descriptor,
@@ -994,13 +993,12 @@
             (*methodToCall->nativeFunc)(newFp, &retval, methodToCall, self);
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPostNativeInvoke(methodToCall, self);
+                dvmReportPostNativeInvoke(methodToCall, self, fp);
             }
 
             /* pop frame off */
             dvmPopJniLocals(self, newSaveArea);
-            self->curFrame = fp;
+            self->interpSave.curFrame = fp;
 
             /*
              * If the native code threw an exception, or interpreted code
diff --git a/vm/mterp/common/asm-constants.h b/vm/mterp/common/asm-constants.h
index 048dcbe..5b9b006 100644
--- a/vm/mterp/common/asm-constants.h
+++ b/vm/mterp/common/asm-constants.h
@@ -155,7 +155,7 @@
 
 /* Thread fields */
 MTERP_OFFSET(offThread_pc,                Thread, interpSave.pc, 0)
-MTERP_OFFSET(offThread_fp,                Thread, interpSave.fp, 4)
+MTERP_OFFSET(offThread_curFrame,          Thread, interpSave.curFrame, 4)
 MTERP_OFFSET(offThread_method,            Thread, interpSave.method, 8)
 MTERP_OFFSET(offThread_methodClassDex,    Thread, interpSave.methodClassDex, 12)
 MTERP_OFFSET(offThread_bailPtr,           Thread, interpSave.bailPtr, 16)
@@ -168,25 +168,23 @@
 MTERP_OFFSET(offThread_retval_j,          Thread, retval.j, 32)
 MTERP_OFFSET(offThread_retval_l,          Thread, retval.l, 32)
 //40
-MTERP_OFFSET(offThread_cardTable,         Thread, cardTable, 40)
-MTERP_OFFSET(offThread_interpStackEnd,    Thread, interpStackEnd, 44)
-MTERP_OFFSET(offThread_curFrame,          Thread, curFrame, 48)
-MTERP_OFFSET(offThread_exception,         Thread, exception, 52)
-MTERP_OFFSET(offThread_debugIsMethodEntry, Thread, debugIsMethodEntry, 56)
-MTERP_OFFSET(offThread_interpStackSize,   Thread, interpStackSize, 60)
-MTERP_OFFSET(offThread_stackOverflowed,   Thread, stackOverflowed, 64)
 MTERP_OFFSET(offThread_breakFlags, \
-                               Thread, interpBreak.ctl.breakFlags, 72)
+                               Thread, interpBreak.ctl.breakFlags, 40)
 MTERP_OFFSET(offThread_subMode, \
-                               Thread, interpBreak.ctl.subMode, 73)
+                               Thread, interpBreak.ctl.subMode, 41)
 MTERP_OFFSET(offThread_suspendCount, \
-                               Thread, interpBreak.ctl.suspendCount, 74)
+                               Thread, interpBreak.ctl.suspendCount, 42)
 MTERP_OFFSET(offThread_dbgSuspendCount, \
-                               Thread, interpBreak.ctl.dbgSuspendCount, 75)
+                               Thread, interpBreak.ctl.dbgSuspendCount, 43)
 MTERP_OFFSET(offThread_curHandlerTable, \
-                               Thread, interpBreak.ctl.curHandlerTable, 76)
+                               Thread, interpBreak.ctl.curHandlerTable, 44)
+MTERP_OFFSET(offThread_cardTable,         Thread, cardTable, 48)
+MTERP_OFFSET(offThread_interpStackEnd,    Thread, interpStackEnd, 52)
+MTERP_OFFSET(offThread_exception,         Thread, exception, 60)
+MTERP_OFFSET(offThread_debugIsMethodEntry, Thread, debugIsMethodEntry, 64)
+MTERP_OFFSET(offThread_interpStackSize,   Thread, interpStackSize, 68)
+MTERP_OFFSET(offThread_stackOverflowed,   Thread, stackOverflowed, 72)
 MTERP_OFFSET(offThread_mainHandlerTable,  Thread, mainHandlerTable, 80)
-
 MTERP_OFFSET(offThread_singleStepCount,   Thread, singleStepCount, 88)
 
 #ifdef WITH_JIT
diff --git a/vm/mterp/cstubs/stubdefs.cpp b/vm/mterp/cstubs/stubdefs.cpp
index e81acdc..ba2fe81 100644
--- a/vm/mterp/cstubs/stubdefs.cpp
+++ b/vm/mterp/cstubs/stubdefs.cpp
@@ -24,7 +24,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -44,6 +44,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
diff --git a/vm/mterp/out/InterpAsm-armv5te-vfp.S b/vm/mterp/out/InterpAsm-armv5te-vfp.S
index 77be638..115a7d2 100644
--- a/vm/mterp/out/InterpAsm-armv5te-vfp.S
+++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S
@@ -82,8 +82,8 @@
 /* save/restore the PC and/or FP from the thread struct */
 #define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
 #define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
-#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_fp]
-#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
+#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
+#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
 #define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
 #define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
 
@@ -26845,7 +26845,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     cmp     r0,#0
     bne     common_updateProfile
     GOTO_OPCODE(ip)                         @ jump to next instruction
@@ -26853,7 +26853,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     GOTO_OPCODE(ip)                         @ jump to next instruction
 #endif
 
@@ -26861,7 +26861,6 @@
     @ Profiling - record method entry.  r0: methodToCall
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r1, r0
     mov     r0, rSELF
     bl      dvmReportInvoke             @ (self, method)
@@ -26873,7 +26872,7 @@
     @ r0=methodToCall, r1=newFp, r10=newSaveArea
     ldrb    lr, [rSELF, #offThread_subMode]
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
     mov     r2, r0                      @ r2<- methodToCall
     mov     r0, r1                      @ r0<- newFp (points to args)
@@ -26901,7 +26900,7 @@
     @ equivalent to dvmPopJniLocals
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     bne     common_exceptionThrown      @ no, handle exception
@@ -26913,11 +26912,10 @@
 11:
     @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
     stmfd   sp!, {r0-r3}                @ save all but subModes
-    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPreNativeInvoke    @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
     ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
 
     @ Call the native method
@@ -26928,10 +26926,10 @@
     ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
 
     @ Finish up any post-invoke subMode requirements
-    @ interpSave already up-to-date
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPostNativeInvoke   @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
     b       7b                          @ resume
 
 .LstackOverflow:    @ r0=methodToCall
@@ -27004,7 +27002,7 @@
     PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
 #if defined(WITH_JIT)
     ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
     mov     rPC, r9                     @ publish new rPC
@@ -27026,7 +27024,7 @@
     @ On entry, r0: StackSaveArea
     ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     r1, [rSELF, #offThread_fp]   @ update interpSave.fp
+    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
     mov     r0, rSELF
     bl      dvmReportReturn             @ (self)
     SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
@@ -27109,7 +27107,7 @@
     add     sp, sp, #8                  @ restore stack
     bmi     .LnotCaughtLocally
 
-    /* adjust locals to match self->curFrame and updated PC */
+    /* adjust locals to match self->interpSave.curFrame and updated PC */
     SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
     ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
     str     r1, [rSELF, #offThread_method]  @ self->method = new method
@@ -27135,7 +27133,7 @@
     @ Manage debugger bookkeeping
 7:
     str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp]     @ update interpSave.fp
+    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
     mov     r0, rSELF                       @ arg0<- self
     mov     r1, r9                          @ arg1<- exception
     bl      dvmReportExceptionThrow         @ (self, exception)
diff --git a/vm/mterp/out/InterpAsm-armv5te.S b/vm/mterp/out/InterpAsm-armv5te.S
index b46c3ee..665178b 100644
--- a/vm/mterp/out/InterpAsm-armv5te.S
+++ b/vm/mterp/out/InterpAsm-armv5te.S
@@ -82,8 +82,8 @@
 /* save/restore the PC and/or FP from the thread struct */
 #define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
 #define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
-#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_fp]
-#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
+#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
+#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
 #define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
 #define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
 
@@ -27303,7 +27303,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     cmp     r0,#0
     bne     common_updateProfile
     GOTO_OPCODE(ip)                         @ jump to next instruction
@@ -27311,7 +27311,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     GOTO_OPCODE(ip)                         @ jump to next instruction
 #endif
 
@@ -27319,7 +27319,6 @@
     @ Profiling - record method entry.  r0: methodToCall
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r1, r0
     mov     r0, rSELF
     bl      dvmReportInvoke             @ (self, method)
@@ -27331,7 +27330,7 @@
     @ r0=methodToCall, r1=newFp, r10=newSaveArea
     ldrb    lr, [rSELF, #offThread_subMode]
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
     mov     r2, r0                      @ r2<- methodToCall
     mov     r0, r1                      @ r0<- newFp (points to args)
@@ -27359,7 +27358,7 @@
     @ equivalent to dvmPopJniLocals
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     bne     common_exceptionThrown      @ no, handle exception
@@ -27371,11 +27370,10 @@
 11:
     @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
     stmfd   sp!, {r0-r3}                @ save all but subModes
-    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPreNativeInvoke    @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
     ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
 
     @ Call the native method
@@ -27386,10 +27384,10 @@
     ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
 
     @ Finish up any post-invoke subMode requirements
-    @ interpSave already up-to-date
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPostNativeInvoke   @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
     b       7b                          @ resume
 
 .LstackOverflow:    @ r0=methodToCall
@@ -27462,7 +27460,7 @@
     PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
 #if defined(WITH_JIT)
     ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
     mov     rPC, r9                     @ publish new rPC
@@ -27484,7 +27482,7 @@
     @ On entry, r0: StackSaveArea
     ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     r1, [rSELF, #offThread_fp]   @ update interpSave.fp
+    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
     mov     r0, rSELF
     bl      dvmReportReturn             @ (self)
     SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
@@ -27567,7 +27565,7 @@
     add     sp, sp, #8                  @ restore stack
     bmi     .LnotCaughtLocally
 
-    /* adjust locals to match self->curFrame and updated PC */
+    /* adjust locals to match self->interpSave.curFrame and updated PC */
     SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
     ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
     str     r1, [rSELF, #offThread_method]  @ self->method = new method
@@ -27593,7 +27591,7 @@
     @ Manage debugger bookkeeping
 7:
     str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp]     @ update interpSave.fp
+    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
     mov     r0, rSELF                       @ arg0<- self
     mov     r1, r9                          @ arg1<- exception
     bl      dvmReportExceptionThrow         @ (self, exception)
diff --git a/vm/mterp/out/InterpAsm-armv7-a-neon.S b/vm/mterp/out/InterpAsm-armv7-a-neon.S
index 4694cf7..e1f54fb 100644
--- a/vm/mterp/out/InterpAsm-armv7-a-neon.S
+++ b/vm/mterp/out/InterpAsm-armv7-a-neon.S
@@ -82,8 +82,8 @@
 /* save/restore the PC and/or FP from the thread struct */
 #define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
 #define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
-#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_fp]
-#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
+#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
+#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
 #define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
 #define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
 
@@ -26783,7 +26783,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     cmp     r0,#0
     bne     common_updateProfile
     GOTO_OPCODE(ip)                         @ jump to next instruction
@@ -26791,7 +26791,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     GOTO_OPCODE(ip)                         @ jump to next instruction
 #endif
 
@@ -26799,7 +26799,6 @@
     @ Profiling - record method entry.  r0: methodToCall
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r1, r0
     mov     r0, rSELF
     bl      dvmReportInvoke             @ (self, method)
@@ -26811,7 +26810,7 @@
     @ r0=methodToCall, r1=newFp, r10=newSaveArea
     ldrb    lr, [rSELF, #offThread_subMode]
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
     mov     r2, r0                      @ r2<- methodToCall
     mov     r0, r1                      @ r0<- newFp (points to args)
@@ -26839,7 +26838,7 @@
     @ equivalent to dvmPopJniLocals
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     bne     common_exceptionThrown      @ no, handle exception
@@ -26851,11 +26850,10 @@
 11:
     @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
     stmfd   sp!, {r0-r3}                @ save all but subModes
-    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPreNativeInvoke    @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
     ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
 
     @ Call the native method
@@ -26866,10 +26864,10 @@
     ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
 
     @ Finish up any post-invoke subMode requirements
-    @ interpSave already up-to-date
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPostNativeInvoke   @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
     b       7b                          @ resume
 
 .LstackOverflow:    @ r0=methodToCall
@@ -26942,7 +26940,7 @@
     PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
 #if defined(WITH_JIT)
     ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
     mov     rPC, r9                     @ publish new rPC
@@ -26964,7 +26962,7 @@
     @ On entry, r0: StackSaveArea
     ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     r1, [rSELF, #offThread_fp]   @ update interpSave.fp
+    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
     mov     r0, rSELF
     bl      dvmReportReturn             @ (self)
     SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
@@ -27047,7 +27045,7 @@
     add     sp, sp, #8                  @ restore stack
     bmi     .LnotCaughtLocally
 
-    /* adjust locals to match self->curFrame and updated PC */
+    /* adjust locals to match self->interpSave.curFrame and updated PC */
     SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
     ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
     str     r1, [rSELF, #offThread_method]  @ self->method = new method
@@ -27073,7 +27071,7 @@
     @ Manage debugger bookkeeping
 7:
     str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp]     @ update interpSave.fp
+    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
     mov     r0, rSELF                       @ arg0<- self
     mov     r1, r9                          @ arg1<- exception
     bl      dvmReportExceptionThrow         @ (self, exception)
diff --git a/vm/mterp/out/InterpAsm-armv7-a.S b/vm/mterp/out/InterpAsm-armv7-a.S
index 5a291f0..6a36b6d 100644
--- a/vm/mterp/out/InterpAsm-armv7-a.S
+++ b/vm/mterp/out/InterpAsm-armv7-a.S
@@ -82,8 +82,8 @@
 /* save/restore the PC and/or FP from the thread struct */
 #define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
 #define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
-#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_fp]
-#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
+#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
+#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
 #define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
 #define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
 
@@ -26783,7 +26783,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     cmp     r0,#0
     bne     common_updateProfile
     GOTO_OPCODE(ip)                         @ jump to next instruction
@@ -26791,7 +26791,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     GOTO_OPCODE(ip)                         @ jump to next instruction
 #endif
 
@@ -26799,7 +26799,6 @@
     @ Profiling - record method entry.  r0: methodToCall
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r1, r0
     mov     r0, rSELF
     bl      dvmReportInvoke             @ (self, method)
@@ -26811,7 +26810,7 @@
     @ r0=methodToCall, r1=newFp, r10=newSaveArea
     ldrb    lr, [rSELF, #offThread_subMode]
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
     mov     r2, r0                      @ r2<- methodToCall
     mov     r0, r1                      @ r0<- newFp (points to args)
@@ -26839,7 +26838,7 @@
     @ equivalent to dvmPopJniLocals
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     bne     common_exceptionThrown      @ no, handle exception
@@ -26851,11 +26850,10 @@
 11:
     @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
     stmfd   sp!, {r0-r3}                @ save all but subModes
-    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPreNativeInvoke    @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
     ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
 
     @ Call the native method
@@ -26866,10 +26864,10 @@
     ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
 
     @ Finish up any post-invoke subMode requirements
-    @ interpSave already up-to-date
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPostNativeInvoke   @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
     b       7b                          @ resume
 
 .LstackOverflow:    @ r0=methodToCall
@@ -26942,7 +26940,7 @@
     PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
 #if defined(WITH_JIT)
     ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
     mov     rPC, r9                     @ publish new rPC
@@ -26964,7 +26962,7 @@
     @ On entry, r0: StackSaveArea
     ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     r1, [rSELF, #offThread_fp]   @ update interpSave.fp
+    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
     mov     r0, rSELF
     bl      dvmReportReturn             @ (self)
     SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
@@ -27047,7 +27045,7 @@
     add     sp, sp, #8                  @ restore stack
     bmi     .LnotCaughtLocally
 
-    /* adjust locals to match self->curFrame and updated PC */
+    /* adjust locals to match self->interpSave.curFrame and updated PC */
     SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
     ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
     str     r1, [rSELF, #offThread_method]  @ self->method = new method
@@ -27073,7 +27071,7 @@
     @ Manage debugger bookkeeping
 7:
     str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp]     @ update interpSave.fp
+    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
     mov     r0, rSELF                       @ arg0<- self
     mov     r1, r9                          @ arg1<- exception
     bl      dvmReportExceptionThrow         @ (self, exception)
diff --git a/vm/mterp/out/InterpAsm-x86.S b/vm/mterp/out/InterpAsm-x86.S
index 68fccd1..5ae3fc3 100644
--- a/vm/mterp/out/InterpAsm-x86.S
+++ b/vm/mterp/out/InterpAsm-x86.S
@@ -130,13 +130,13 @@
 .macro SAVE_PC_FP_TO_SELF _reg
     movl     rSELF,\_reg
     movl     rPC,offThread_pc(\_reg)
-    movl     rFP,offThread_fp(\_reg)
+    movl     rFP,offThread_curFrame(\_reg)
 .endm
 
 .macro LOAD_PC_FP_FROM_SELF
     movl    rSELF,rFP
     movl    offThread_pc(rFP),rPC
-    movl    offThread_fp(rFP),rFP
+    movl    offThread_curFrame(rFP),rFP
 .endm
 
 /* The interpreter assumes a properly aligned stack on entry, and
@@ -25880,7 +25880,7 @@
 
 /* Set up "named" registers */
     movl    offThread_pc(%ecx),rPC
-    movl    offThread_fp(%ecx),rFP
+    movl    offThread_curFrame(%ecx),rFP
     movl    offThread_curHandlerTable(%ecx),rIBASE
 
 /* Remember %esp for future "longjmp" */
@@ -26324,7 +26324,7 @@
     movl        offMethod_insns(%eax), rPC # rPC<- methodToCall->insns
     movl        $1, offThread_debugIsMethodEntry(%ecx)
     movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
-    movl        rFP, offThread_curFrame(%ecx) # self->curFrame<- newFP
+    movl        rFP, offThread_curFrame(%ecx) # curFrame<-newFP
     movl        offThread_curHandlerTable(%ecx),rIBASE
     FETCH_INST
     GOTO_NEXT                           # jump to methodToCall->insns
@@ -26339,7 +26339,6 @@
     SPILL_TMP1(%eax)                   # preserve methodToCall
     SPILL_TMP2(%edx)                   # preserve newSaveArea
     movl        rPC, offThread_pc(%ecx) # update interpSave.pc
-    movl        rFP, offThread_fp(%ecx) # update interpSave.fp
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
     call        dvmReportInvoke        # (self, method)
@@ -26358,7 +26357,7 @@
     movl        rINST, offStackSaveArea_localRefCookie(%edx) # newSaveArea->localRefCookie<- top
     movl        %edx, LOCAL2_OFFSET(%ebp)  # save newSaveArea
     movl        LOCAL1_OFFSET(%ebp), rINST # rINST<- newFP
-    movl        rINST, offThread_curFrame(%ecx)  # self->curFrame<- newFP
+    movl        rINST, offThread_curFrame(%ecx)  # curFrame<- newFP
     cmpb        $0, offThread_subMode(%ecx)  # Anything special going on?
     jne         11f                     # yes - handle it
     movl        %ecx, OUT_ARG3(%esp)    # push parameter self
@@ -26372,7 +26371,7 @@
     movl        rSELF, %eax             # %eax<- self
     movl        offStackSaveArea_localRefCookie(%ecx), %edx # %edx<- old top
     cmp         $0, offThread_exception(%eax) # check for exception
-    movl        rFP, offThread_curFrame(%eax) # self->curFrame<- rFP
+    movl        rFP, offThread_curFrame(%eax) # curFrame<- rFP
     movl        %edx, offThread_jniLocal_topCookie(%eax) # new top <- old top
     jne         common_exceptionThrown  # handle exception
     movl        offThread_curHandlerTable(%eax),rIBASE
@@ -26387,10 +26386,10 @@
      */
     SPILL_TMP1(%eax)                    # save methodTocall
     movl        rPC, offThread_pc(%ecx)
-    movl        rFP, offThread_fp(%ecx)
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
-    call        dvmReportPreNativeInvoke # (self, methodToCall)
+    movl        rFP, OUT_ARG2(%esp)
+    call        dvmReportPreNativeInvoke # (self, methodToCall, fp)
     UNSPILL_TMP1(%eax)                  # restore methodToCall
     movl        rSELF,%ecx              # restore self
 
@@ -26406,7 +26405,8 @@
     movl        rSELF, %ecx
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
-    call        dvmReportPostNativeInvoke # (self, methodToCall)
+    movl        rFP, OUT_ARG2(%esp)
+    call        dvmReportPostNativeInvoke # (self, methodToCall, fp)
     jmp         7b                      # rejoin
 
 .LstackOverflow:    # eax=methodToCall
@@ -26433,7 +26433,7 @@
 
     movl    offStackSaveArea_savedPc(%eax),rPC # pc<- saveArea->savedPC
     movl    rINST,offThread_method(%ecx)       # self->method = newSave->meethod
-    movl    rFP,offThread_curFrame(%ecx)       # self->curFrame = fp
+    movl    rFP,offThread_curFrame(%ecx)       # curFrame = fp
     movl    offMethod_clazz(rINST),%eax        # eax<- method->clazz
     movl    offThread_curHandlerTable(%ecx),rIBASE
     movl    offClassObject_pDvmDex(%eax),rINST # rINST<- method->clazz->pDvmDex
@@ -26447,7 +26447,7 @@
      * Handle special subMode actions
      * On entry, rFP: prevFP, %ecx: self, %eax: saveArea
      */
-    movl     rFP, offThread_fp(%ecx)          # update interpSave.fp
+    movl     rFP, offThread_curFrame(%ecx)    # update interpSave.curFrame
     movl     rPC, offThread_pc(%ecx)          # update interpSave.pc
     movl     %ecx, OUT_ARG0(%esp)             # parameter self
     call     dvmReportReturn                  # (self)
@@ -26468,7 +26468,7 @@
  */
 common_gotoBail:
     movl   rPC,offThread_pc(%ecx)     # export state to self
-    movl   rFP,offThread_fp(%ecx)
+    movl   rFP,offThread_curFrame(%ecx)
     movl   %ecx,OUT_ARG0(%esp)      # self in arg0
     movl   rINST,OUT_ARG1(%esp)     # changeInterp in arg1
     call   dvmMterpStdBail          # bail out....
@@ -26481,7 +26481,7 @@
  common_resumeAfterGlueCall:
      movl  rSELF, %eax
      movl  offThread_pc(%eax),rPC
-     movl  offThread_fp(%eax),rFP
+     movl  offThread_curFrame(%eax),rFP
      movl  offThread_curHandlerTable(%eax),rIBASE
      FETCH_INST
      GOTO_NEXT
@@ -26556,7 +26556,7 @@
 common_exceptionThrown:
     movl    rSELF,%ecx
     movl    rPC,offThread_pc(%ecx)
-    movl    rFP,offThread_fp(%ecx)
+    movl    rFP,offThread_curFrame(%ecx)
     movl    %ecx,OUT_ARG0(%esp)
     call    dvmMterp_exceptionThrown
     jmp     common_resumeAfterGlueCall
diff --git a/vm/mterp/out/InterpC-allstubs.cpp b/vm/mterp/out/InterpC-allstubs.cpp
index 7859c2d..1356597 100644
--- a/vm/mterp/out/InterpC-allstubs.cpp
+++ b/vm/mterp/out/InterpC-allstubs.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
@@ -5053,7 +5054,7 @@
         }
 
         /* update thread FP, and reset local variables */
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -5190,10 +5191,10 @@
 #endif
 
         /*
-         * Adjust local variables to match self->curFrame and the
+         * Adjust local variables to match self->interpSave.curFrame and the
          * updated PC.
          */
-        //fp = (u4*) self->curFrame;
+        //fp = (u4*) self->interpSave.curFrame;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -5372,7 +5373,7 @@
              * calls.  For native calls, we'll mark EXIT on return.
              * For non-native calls, EXIT is marked in the RETURN op.
              */
-            PC_FP_TO_SELF();
+            PC_TO_SELF();
             dvmReportInvoke(self, methodToCall);
         }
 
@@ -5385,7 +5386,7 @@
             self->interpSave.method = curMethod;
             methodClassDex = curMethod->clazz->pDvmDex;
             pc = methodToCall->insns;
-            self->curFrame = fp = newFp;
+            self->interpSave.curFrame = fp = newFp;
 #ifdef EASY_GDB
             debugSaveArea = SAVEAREA_FROM_FP(newFp);
 #endif
@@ -5398,13 +5399,12 @@
             /* set this up for JNI locals, even if not a JNI native */
             newSaveArea->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
 
-            self->curFrame = newFp;
+            self->interpSave.curFrame = newFp;
 
             DUMP_REGS(methodToCall, newFp, true);   // show input args
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPreNativeInvoke(methodToCall, self);
+                dvmReportPreNativeInvoke(methodToCall, self, fp);
             }
 
             ILOGD("> native <-- %s.%s %s", methodToCall->clazz->descriptor,
@@ -5418,13 +5418,12 @@
             (*methodToCall->nativeFunc)(newFp, &retval, methodToCall, self);
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPostNativeInvoke(methodToCall, self);
+                dvmReportPostNativeInvoke(methodToCall, self, fp);
             }
 
             /* pop frame off */
             dvmPopJniLocals(self, newSaveArea);
-            self->curFrame = fp;
+            self->interpSave.curFrame = fp;
 
             /*
              * If the native code threw an exception, or interpreted code
diff --git a/vm/mterp/out/InterpC-armv5te-vfp.cpp b/vm/mterp/out/InterpC-armv5te-vfp.cpp
index 8c3a4c0..4f69687 100644
--- a/vm/mterp/out/InterpC-armv5te-vfp.cpp
+++ b/vm/mterp/out/InterpC-armv5te-vfp.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
diff --git a/vm/mterp/out/InterpC-armv5te.cpp b/vm/mterp/out/InterpC-armv5te.cpp
index 7503ddc..c55f481 100644
--- a/vm/mterp/out/InterpC-armv5te.cpp
+++ b/vm/mterp/out/InterpC-armv5te.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
diff --git a/vm/mterp/out/InterpC-armv7-a-neon.cpp b/vm/mterp/out/InterpC-armv7-a-neon.cpp
index ba9f8a2..18ebfd3 100644
--- a/vm/mterp/out/InterpC-armv7-a-neon.cpp
+++ b/vm/mterp/out/InterpC-armv7-a-neon.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
diff --git a/vm/mterp/out/InterpC-armv7-a.cpp b/vm/mterp/out/InterpC-armv7-a.cpp
index 3c24b7b..e423623 100644
--- a/vm/mterp/out/InterpC-armv7-a.cpp
+++ b/vm/mterp/out/InterpC-armv7-a.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
diff --git a/vm/mterp/out/InterpC-portable.cpp b/vm/mterp/out/InterpC-portable.cpp
index 593a7f7..5bc368f 100644
--- a/vm/mterp/out/InterpC-portable.cpp
+++ b/vm/mterp/out/InterpC-portable.cpp
@@ -403,7 +403,8 @@
  */
 #define PC_FP_TO_SELF()                                                    \
     self->interpSave.pc = pc;                                              \
-    self->interpSave.fp = fp;
+    self->interpSave.curFrame = fp;
+#define PC_TO_SELF() self->interpSave.pc = pc;
 
 /*
  * Instruction framing.  For a switch-oriented implementation this is
@@ -1232,7 +1233,7 @@
 void dvmInterpretPortable(Thread* self)
 {
 #if defined(EASY_GDB)
-    StackSaveArea* debugSaveArea = SAVEAREA_FROM_FP(self->curFrame);
+    StackSaveArea* debugSaveArea = SAVEAREA_FROM_FP(self->interpSave.curFrame);
 #endif
 #if defined(WITH_TRACKREF_CHECKS)
     int debugTrackedRefStart = self->interpSave.debugTrackedRefStart;
@@ -1260,7 +1261,7 @@
     /* copy state in */
     curMethod = self->interpSave.method;
     pc = self->interpSave.pc;
-    fp = self->interpSave.fp;
+    fp = self->interpSave.curFrame;
     retval = self->retval;   /* only need for kInterpEntryReturn? */
 
     methodClassDex = curMethod->clazz->pDvmDex;
@@ -1285,7 +1286,7 @@
     if (self->debugIsMethodEntry) {
         ILOGD("|-- Now interpreting %s.%s", curMethod->clazz->descriptor,
                 curMethod->name);
-        DUMP_REGS(curMethod, self->interpSave.fp, false);
+        DUMP_REGS(curMethod, self->interpSave.curFrame, false);
     }
 #endif
 
@@ -5012,7 +5013,7 @@
         }
 
         /* update thread FP, and reset local variables */
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -5149,10 +5150,10 @@
 #endif
 
         /*
-         * Adjust local variables to match self->curFrame and the
+         * Adjust local variables to match self->interpSave.curFrame and the
          * updated PC.
          */
-        //fp = (u4*) self->curFrame;
+        //fp = (u4*) self->interpSave.curFrame;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -5331,7 +5332,7 @@
              * calls.  For native calls, we'll mark EXIT on return.
              * For non-native calls, EXIT is marked in the RETURN op.
              */
-            PC_FP_TO_SELF();
+            PC_TO_SELF();
             dvmReportInvoke(self, methodToCall);
         }
 
@@ -5344,7 +5345,7 @@
             self->interpSave.method = curMethod;
             methodClassDex = curMethod->clazz->pDvmDex;
             pc = methodToCall->insns;
-            self->curFrame = fp = newFp;
+            self->interpSave.curFrame = fp = newFp;
 #ifdef EASY_GDB
             debugSaveArea = SAVEAREA_FROM_FP(newFp);
 #endif
@@ -5357,13 +5358,12 @@
             /* set this up for JNI locals, even if not a JNI native */
             newSaveArea->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
 
-            self->curFrame = newFp;
+            self->interpSave.curFrame = newFp;
 
             DUMP_REGS(methodToCall, newFp, true);   // show input args
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPreNativeInvoke(methodToCall, self);
+                dvmReportPreNativeInvoke(methodToCall, self, fp);
             }
 
             ILOGD("> native <-- %s.%s %s", methodToCall->clazz->descriptor,
@@ -5377,13 +5377,12 @@
             (*methodToCall->nativeFunc)(newFp, &retval, methodToCall, self);
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPostNativeInvoke(methodToCall, self);
+                dvmReportPostNativeInvoke(methodToCall, self, fp);
             }
 
             /* pop frame off */
             dvmPopJniLocals(self, newSaveArea);
-            self->curFrame = fp;
+            self->interpSave.curFrame = fp;
 
             /*
              * If the native code threw an exception, or interpreted code
diff --git a/vm/mterp/out/InterpC-x86-atom.cpp b/vm/mterp/out/InterpC-x86-atom.cpp
index 5483b84..f91c1f8 100644
--- a/vm/mterp/out/InterpC-x86-atom.cpp
+++ b/vm/mterp/out/InterpC-x86-atom.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
@@ -2142,7 +2143,7 @@
         }
 
         /* update thread FP, and reset local variables */
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -2279,10 +2280,10 @@
 #endif
 
         /*
-         * Adjust local variables to match self->curFrame and the
+         * Adjust local variables to match self->interpSave.curFrame and the
          * updated PC.
          */
-        //fp = (u4*) self->curFrame;
+        //fp = (u4*) self->interpSave.curFrame;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -2461,7 +2462,7 @@
              * calls.  For native calls, we'll mark EXIT on return.
              * For non-native calls, EXIT is marked in the RETURN op.
              */
-            PC_FP_TO_SELF();
+            PC_TO_SELF();
             dvmReportInvoke(self, methodToCall);
         }
 
@@ -2474,7 +2475,7 @@
             self->interpSave.method = curMethod;
             methodClassDex = curMethod->clazz->pDvmDex;
             pc = methodToCall->insns;
-            self->curFrame = fp = newFp;
+            self->interpSave.curFrame = fp = newFp;
 #ifdef EASY_GDB
             debugSaveArea = SAVEAREA_FROM_FP(newFp);
 #endif
@@ -2487,13 +2488,12 @@
             /* set this up for JNI locals, even if not a JNI native */
             newSaveArea->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
 
-            self->curFrame = newFp;
+            self->interpSave.curFrame = newFp;
 
             DUMP_REGS(methodToCall, newFp, true);   // show input args
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPreNativeInvoke(methodToCall, self);
+                dvmReportPreNativeInvoke(methodToCall, self, fp);
             }
 
             ILOGD("> native <-- %s.%s %s", methodToCall->clazz->descriptor,
@@ -2507,13 +2507,12 @@
             (*methodToCall->nativeFunc)(newFp, &retval, methodToCall, self);
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPostNativeInvoke(methodToCall, self);
+                dvmReportPostNativeInvoke(methodToCall, self, fp);
             }
 
             /* pop frame off */
             dvmPopJniLocals(self, newSaveArea);
-            self->curFrame = fp;
+            self->interpSave.curFrame = fp;
 
             /*
              * If the native code threw an exception, or interpreted code
diff --git a/vm/mterp/out/InterpC-x86.cpp b/vm/mterp/out/InterpC-x86.cpp
index ce4435b..1f8d9f2 100644
--- a/vm/mterp/out/InterpC-x86.cpp
+++ b/vm/mterp/out/InterpC-x86.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
@@ -2084,7 +2085,7 @@
         }
 
         /* update thread FP, and reset local variables */
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -2221,10 +2222,10 @@
 #endif
 
         /*
-         * Adjust local variables to match self->curFrame and the
+         * Adjust local variables to match self->interpSave.curFrame and the
          * updated PC.
          */
-        //fp = (u4*) self->curFrame;
+        //fp = (u4*) self->interpSave.curFrame;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -2403,7 +2404,7 @@
              * calls.  For native calls, we'll mark EXIT on return.
              * For non-native calls, EXIT is marked in the RETURN op.
              */
-            PC_FP_TO_SELF();
+            PC_TO_SELF();
             dvmReportInvoke(self, methodToCall);
         }
 
@@ -2416,7 +2417,7 @@
             self->interpSave.method = curMethod;
             methodClassDex = curMethod->clazz->pDvmDex;
             pc = methodToCall->insns;
-            self->curFrame = fp = newFp;
+            self->interpSave.curFrame = fp = newFp;
 #ifdef EASY_GDB
             debugSaveArea = SAVEAREA_FROM_FP(newFp);
 #endif
@@ -2429,13 +2430,12 @@
             /* set this up for JNI locals, even if not a JNI native */
             newSaveArea->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
 
-            self->curFrame = newFp;
+            self->interpSave.curFrame = newFp;
 
             DUMP_REGS(methodToCall, newFp, true);   // show input args
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPreNativeInvoke(methodToCall, self);
+                dvmReportPreNativeInvoke(methodToCall, self, fp);
             }
 
             ILOGD("> native <-- %s.%s %s", methodToCall->clazz->descriptor,
@@ -2449,13 +2449,12 @@
             (*methodToCall->nativeFunc)(newFp, &retval, methodToCall, self);
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPostNativeInvoke(methodToCall, self);
+                dvmReportPostNativeInvoke(methodToCall, self, fp);
             }
 
             /* pop frame off */
             dvmPopJniLocals(self, newSaveArea);
-            self->curFrame = fp;
+            self->interpSave.curFrame = fp;
 
             /*
              * If the native code threw an exception, or interpreted code
diff --git a/vm/mterp/portable/entry.cpp b/vm/mterp/portable/entry.cpp
index 485fa82..dddf136 100644
--- a/vm/mterp/portable/entry.cpp
+++ b/vm/mterp/portable/entry.cpp
@@ -6,7 +6,7 @@
 void dvmInterpretPortable(Thread* self)
 {
 #if defined(EASY_GDB)
-    StackSaveArea* debugSaveArea = SAVEAREA_FROM_FP(self->curFrame);
+    StackSaveArea* debugSaveArea = SAVEAREA_FROM_FP(self->interpSave.curFrame);
 #endif
 #if defined(WITH_TRACKREF_CHECKS)
     int debugTrackedRefStart = self->interpSave.debugTrackedRefStart;
@@ -34,7 +34,7 @@
     /* copy state in */
     curMethod = self->interpSave.method;
     pc = self->interpSave.pc;
-    fp = self->interpSave.fp;
+    fp = self->interpSave.curFrame;
     retval = self->retval;   /* only need for kInterpEntryReturn? */
 
     methodClassDex = curMethod->clazz->pDvmDex;
@@ -59,7 +59,7 @@
     if (self->debugIsMethodEntry) {
         ILOGD("|-- Now interpreting %s.%s", curMethod->clazz->descriptor,
                 curMethod->name);
-        DUMP_REGS(curMethod, self->interpSave.fp, false);
+        DUMP_REGS(curMethod, self->interpSave.curFrame, false);
     }
 #endif
 
diff --git a/vm/mterp/portable/stubdefs.cpp b/vm/mterp/portable/stubdefs.cpp
index de9a8e7..57ff35c 100644
--- a/vm/mterp/portable/stubdefs.cpp
+++ b/vm/mterp/portable/stubdefs.cpp
@@ -21,7 +21,8 @@
  */
 #define PC_FP_TO_SELF()                                                    \
     self->interpSave.pc = pc;                                              \
-    self->interpSave.fp = fp;
+    self->interpSave.curFrame = fp;
+#define PC_TO_SELF() self->interpSave.pc = pc;
 
 /*
  * Instruction framing.  For a switch-oriented implementation this is
diff --git a/vm/mterp/x86/entry.S b/vm/mterp/x86/entry.S
index b6f944a..3e2a708 100644
--- a/vm/mterp/x86/entry.S
+++ b/vm/mterp/x86/entry.S
@@ -43,7 +43,7 @@
 
 /* Set up "named" registers */
     movl    offThread_pc(%ecx),rPC
-    movl    offThread_fp(%ecx),rFP
+    movl    offThread_curFrame(%ecx),rFP
     movl    offThread_curHandlerTable(%ecx),rIBASE
 
 /* Remember %esp for future "longjmp" */
diff --git a/vm/mterp/x86/footer.S b/vm/mterp/x86/footer.S
index b79d8cf..c9a88c1 100644
--- a/vm/mterp/x86/footer.S
+++ b/vm/mterp/x86/footer.S
@@ -393,7 +393,7 @@
     movl        offMethod_insns(%eax), rPC # rPC<- methodToCall->insns
     movl        $$1, offThread_debugIsMethodEntry(%ecx)
     movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
-    movl        rFP, offThread_curFrame(%ecx) # self->curFrame<- newFP
+    movl        rFP, offThread_curFrame(%ecx) # curFrame<-newFP
     movl        offThread_curHandlerTable(%ecx),rIBASE
     FETCH_INST
     GOTO_NEXT                           # jump to methodToCall->insns
@@ -408,7 +408,6 @@
     SPILL_TMP1(%eax)                   # preserve methodToCall
     SPILL_TMP2(%edx)                   # preserve newSaveArea
     movl        rPC, offThread_pc(%ecx) # update interpSave.pc
-    movl        rFP, offThread_fp(%ecx) # update interpSave.fp
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
     call        dvmReportInvoke        # (self, method)
@@ -427,7 +426,7 @@
     movl        rINST, offStackSaveArea_localRefCookie(%edx) # newSaveArea->localRefCookie<- top
     movl        %edx, LOCAL2_OFFSET(%ebp)  # save newSaveArea
     movl        LOCAL1_OFFSET(%ebp), rINST # rINST<- newFP
-    movl        rINST, offThread_curFrame(%ecx)  # self->curFrame<- newFP
+    movl        rINST, offThread_curFrame(%ecx)  # curFrame<- newFP
     cmpb        $$0, offThread_subMode(%ecx)  # Anything special going on?
     jne         11f                     # yes - handle it
     movl        %ecx, OUT_ARG3(%esp)    # push parameter self
@@ -441,7 +440,7 @@
     movl        rSELF, %eax             # %eax<- self
     movl        offStackSaveArea_localRefCookie(%ecx), %edx # %edx<- old top
     cmp         $$0, offThread_exception(%eax) # check for exception
-    movl        rFP, offThread_curFrame(%eax) # self->curFrame<- rFP
+    movl        rFP, offThread_curFrame(%eax) # curFrame<- rFP
     movl        %edx, offThread_jniLocal_topCookie(%eax) # new top <- old top
     jne         common_exceptionThrown  # handle exception
     movl        offThread_curHandlerTable(%eax),rIBASE
@@ -456,10 +455,10 @@
      */
     SPILL_TMP1(%eax)                    # save methodTocall
     movl        rPC, offThread_pc(%ecx)
-    movl        rFP, offThread_fp(%ecx)
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
-    call        dvmReportPreNativeInvoke # (self, methodToCall)
+    movl        rFP, OUT_ARG2(%esp)
+    call        dvmReportPreNativeInvoke # (self, methodToCall, fp)
     UNSPILL_TMP1(%eax)                  # restore methodToCall
     movl        rSELF,%ecx              # restore self
 
@@ -475,7 +474,8 @@
     movl        rSELF, %ecx
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
-    call        dvmReportPostNativeInvoke # (self, methodToCall)
+    movl        rFP, OUT_ARG2(%esp)
+    call        dvmReportPostNativeInvoke # (self, methodToCall, fp)
     jmp         7b                      # rejoin
 
 .LstackOverflow:    # eax=methodToCall
@@ -502,7 +502,7 @@
 
     movl    offStackSaveArea_savedPc(%eax),rPC # pc<- saveArea->savedPC
     movl    rINST,offThread_method(%ecx)       # self->method = newSave->meethod
-    movl    rFP,offThread_curFrame(%ecx)       # self->curFrame = fp
+    movl    rFP,offThread_curFrame(%ecx)       # curFrame = fp
     movl    offMethod_clazz(rINST),%eax        # eax<- method->clazz
     movl    offThread_curHandlerTable(%ecx),rIBASE
     movl    offClassObject_pDvmDex(%eax),rINST # rINST<- method->clazz->pDvmDex
@@ -516,7 +516,7 @@
      * Handle special subMode actions
      * On entry, rFP: prevFP, %ecx: self, %eax: saveArea
      */
-    movl     rFP, offThread_fp(%ecx)          # update interpSave.fp
+    movl     rFP, offThread_curFrame(%ecx)    # update interpSave.curFrame
     movl     rPC, offThread_pc(%ecx)          # update interpSave.pc
     movl     %ecx, OUT_ARG0(%esp)             # parameter self
     call     dvmReportReturn                  # (self)
@@ -537,7 +537,7 @@
  */
 common_gotoBail:
     movl   rPC,offThread_pc(%ecx)     # export state to self
-    movl   rFP,offThread_fp(%ecx)
+    movl   rFP,offThread_curFrame(%ecx)
     movl   %ecx,OUT_ARG0(%esp)      # self in arg0
     movl   rINST,OUT_ARG1(%esp)     # changeInterp in arg1
     call   dvmMterpStdBail          # bail out....
@@ -550,7 +550,7 @@
  common_resumeAfterGlueCall:
      movl  rSELF, %eax
      movl  offThread_pc(%eax),rPC
-     movl  offThread_fp(%eax),rFP
+     movl  offThread_curFrame(%eax),rFP
      movl  offThread_curHandlerTable(%eax),rIBASE
      FETCH_INST
      GOTO_NEXT
@@ -625,7 +625,7 @@
 common_exceptionThrown:
     movl    rSELF,%ecx
     movl    rPC,offThread_pc(%ecx)
-    movl    rFP,offThread_fp(%ecx)
+    movl    rFP,offThread_curFrame(%ecx)
     movl    %ecx,OUT_ARG0(%esp)
     call    dvmMterp_exceptionThrown
     jmp     common_resumeAfterGlueCall
diff --git a/vm/mterp/x86/header.S b/vm/mterp/x86/header.S
index 0a34a6f..6f3be0c 100644
--- a/vm/mterp/x86/header.S
+++ b/vm/mterp/x86/header.S
@@ -123,13 +123,13 @@
 .macro SAVE_PC_FP_TO_SELF _reg
     movl     rSELF,\_reg
     movl     rPC,offThread_pc(\_reg)
-    movl     rFP,offThread_fp(\_reg)
+    movl     rFP,offThread_curFrame(\_reg)
 .endm
 
 .macro LOAD_PC_FP_FROM_SELF
     movl    rSELF,rFP
     movl    offThread_pc(rFP),rPC
-    movl    offThread_fp(rFP),rFP
+    movl    offThread_curFrame(rFP),rFP
 .endm
 
 /* The interpreter assumes a properly aligned stack on entry, and
diff --git a/vm/native/dalvik_system_VMStack.cpp b/vm/native/dalvik_system_VMStack.cpp
index 62efe40..e69fa93 100644
--- a/vm/native/dalvik_system_VMStack.cpp
+++ b/vm/native/dalvik_system_VMStack.cpp
@@ -29,7 +29,8 @@
 static void Dalvik_dalvik_system_VMStack_getCallingClassLoader(const u4* args,
     JValue* pResult)
 {
-    ClassObject* clazz = dvmGetCaller2Class(dvmThreadSelf()->curFrame);
+    ClassObject* clazz =
+        dvmGetCaller2Class(dvmThreadSelf()->interpSave.curFrame);
 
     UNUSED_PARAMETER(args);
 
@@ -46,7 +47,8 @@
 static void Dalvik_dalvik_system_VMStack_getCallingClassLoader2(const u4* args,
     JValue* pResult)
 {
-    ClassObject* clazz = dvmGetCaller3Class(dvmThreadSelf()->curFrame);
+    ClassObject* clazz =
+        dvmGetCaller3Class(dvmThreadSelf()->interpSave.curFrame);
 
     UNUSED_PARAMETER(args);
 
@@ -63,7 +65,8 @@
 static void Dalvik_dalvik_system_VMStack_getStackClass2(const u4* args,
     JValue* pResult)
 {
-    ClassObject* clazz = dvmGetCaller3Class(dvmThreadSelf()->curFrame);
+    ClassObject* clazz =
+        dvmGetCaller3Class(dvmThreadSelf()->interpSave.curFrame);
 
     UNUSED_PARAMETER(args);
 
@@ -88,7 +91,7 @@
     /*
      * Get an array with the stack trace in it.
      */
-    void *fp = dvmThreadSelf()->curFrame;
+    void *fp = dvmThreadSelf()->interpSave.curFrame;
     size_t depth = dvmComputeExactFrameDepth(fp);
     UniquePtr<const Method*[]> methods(new const Method*[depth]);
     dvmFillStackTraceArray(fp, methods.get(), depth);
diff --git a/vm/native/java_lang_Class.cpp b/vm/native/java_lang_Class.cpp
index f05faef..790e7b7 100644
--- a/vm/native/java_lang_Class.cpp
+++ b/vm/native/java_lang_Class.cpp
@@ -536,7 +536,7 @@
      * constructor must be public or, if the caller is in the same package,
      * have package scope.
      */
-    ClassObject* callerClass = dvmGetCaller2Class(self->curFrame);
+    ClassObject* callerClass = dvmGetCaller2Class(self->interpSave.curFrame);
 
     if (!dvmCheckClassAccess(callerClass, clazz)) {
         LOGD("newInstance failed: %s not accessible to %s\n",
diff --git a/vm/native/java_lang_reflect_Field.cpp b/vm/native/java_lang_reflect_Field.cpp
index 2e8aab5..dc7d556 100644
--- a/vm/native/java_lang_reflect_Field.cpp
+++ b/vm/native/java_lang_reflect_Field.cpp
@@ -71,7 +71,7 @@
         }
 
         ClassObject* callerClass =
-            dvmGetCaller2Class(dvmThreadSelf()->curFrame);
+            dvmGetCaller2Class(dvmThreadSelf()->interpSave.curFrame);
 
         /*
          * We need to check two things: