summaryrefslogtreecommitdiffstats
path: root/vm/mterp
diff options
context:
space:
mode:
authorChris Dearman <chris@mips.com>2012-01-30 17:44:28 -0800
committerRaghu Gandham <raghu@mips.com>2012-02-15 11:02:48 -0800
commit0d5443d0ef4c5538112a9ae1d1c8b93b8ab18736 (patch)
tree7ecdeb6ded77f2beb02f60cde26c7eda0fa462ba /vm/mterp
parent68df230d661dbafb117f942f981f8abfc12e552a (diff)
downloadandroid_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.cpp3
-rw-r--r--vm/mterp/out/InterpC-allstubs.cpp3
-rw-r--r--vm/mterp/out/InterpC-portable.cpp3
-rw-r--r--vm/mterp/out/InterpC-x86-atom.cpp3
-rw-r--r--vm/mterp/out/InterpC-x86.cpp3
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