diff options
author | Chris Dearman <chris@mips.com> | 2012-01-30 17:44:28 -0800 |
---|---|---|
committer | Raghu Gandham <raghu@mips.com> | 2012-02-15 11:02:48 -0800 |
commit | 0d5443d0ef4c5538112a9ae1d1c8b93b8ab18736 (patch) | |
tree | 7ecdeb6ded77f2beb02f60cde26c7eda0fa462ba /vm/mterp | |
parent | 68df230d661dbafb117f942f981f8abfc12e552a (diff) | |
download | android_dalvik-0d5443d0ef4c5538112a9ae1d1c8b93b8ab18736.tar.gz android_dalvik-0d5443d0ef4c5538112a9ae1d1c8b93b8ab18736.tar.bz2 android_dalvik-0d5443d0ef4c5538112a9ae1d1c8b93b8ab18736.zip |
Restore fp after calling JNI method in allstubs interpreter
The allstubs interpreter uses self->interpSave.curFrame as fp.
The invokeMethod native code sets self->interpSave.curFrame directly
effectively updating fp, so restore fp after the call has completed.
Change-Id: I0ffb15b71a48c2780251bbcd66e551bb0a52fe94
Signed-off-by: Chris Dearman <chris@mips.com>
Diffstat (limited to 'vm/mterp')
-rw-r--r-- | vm/mterp/c/gotoTargets.cpp | 3 | ||||
-rw-r--r-- | vm/mterp/out/InterpC-allstubs.cpp | 3 | ||||
-rw-r--r-- | vm/mterp/out/InterpC-portable.cpp | 3 | ||||
-rw-r--r-- | vm/mterp/out/InterpC-x86-atom.cpp | 3 | ||||
-rw-r--r-- | vm/mterp/out/InterpC-x86.cpp | 3 |
5 files changed, 10 insertions, 5 deletions
diff --git a/vm/mterp/c/gotoTargets.cpp b/vm/mterp/c/gotoTargets.cpp index f51abe882..229983346 100644 --- a/vm/mterp/c/gotoTargets.cpp +++ b/vm/mterp/c/gotoTargets.cpp @@ -999,7 +999,8 @@ GOTO_TARGET(invokeMethod, bool methodCallRange, const Method* _methodToCall, /* pop frame off */ dvmPopJniLocals(self, newSaveArea); - self->interpSave.curFrame = fp; + self->interpSave.curFrame = newSaveArea->prevFrame; + fp = newSaveArea->prevFrame; /* * If the native code threw an exception, or interpreted code diff --git a/vm/mterp/out/InterpC-allstubs.cpp b/vm/mterp/out/InterpC-allstubs.cpp index 5f29d8a7e..43b852d54 100644 --- a/vm/mterp/out/InterpC-allstubs.cpp +++ b/vm/mterp/out/InterpC-allstubs.cpp @@ -5406,7 +5406,8 @@ GOTO_TARGET(invokeMethod, bool methodCallRange, const Method* _methodToCall, /* pop frame off */ dvmPopJniLocals(self, newSaveArea); - self->interpSave.curFrame = fp; + self->interpSave.curFrame = newSaveArea->prevFrame; + fp = newSaveArea->prevFrame; /* * If the native code threw an exception, or interpreted code diff --git a/vm/mterp/out/InterpC-portable.cpp b/vm/mterp/out/InterpC-portable.cpp index f702bce03..2ccfcfdcd 100644 --- a/vm/mterp/out/InterpC-portable.cpp +++ b/vm/mterp/out/InterpC-portable.cpp @@ -5360,7 +5360,8 @@ GOTO_TARGET(invokeMethod, bool methodCallRange, const Method* _methodToCall, /* pop frame off */ dvmPopJniLocals(self, newSaveArea); - self->interpSave.curFrame = fp; + self->interpSave.curFrame = newSaveArea->prevFrame; + fp = newSaveArea->prevFrame; /* * 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 5b8716b20..75d59590b 100644 --- a/vm/mterp/out/InterpC-x86-atom.cpp +++ b/vm/mterp/out/InterpC-x86-atom.cpp @@ -2495,7 +2495,8 @@ GOTO_TARGET(invokeMethod, bool methodCallRange, const Method* _methodToCall, /* pop frame off */ dvmPopJniLocals(self, newSaveArea); - self->interpSave.curFrame = fp; + self->interpSave.curFrame = newSaveArea->prevFrame; + fp = newSaveArea->prevFrame; /* * 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 51eb54c95..0a4c7db3c 100644 --- a/vm/mterp/out/InterpC-x86.cpp +++ b/vm/mterp/out/InterpC-x86.cpp @@ -2437,7 +2437,8 @@ GOTO_TARGET(invokeMethod, bool methodCallRange, const Method* _methodToCall, /* pop frame off */ dvmPopJniLocals(self, newSaveArea); - self->interpSave.curFrame = fp; + self->interpSave.curFrame = newSaveArea->prevFrame; + fp = newSaveArea->prevFrame; /* * If the native code threw an exception, or interpreted code |