changeset 50:e0cffd65b006

Opcode RETURN for int and float
author volker
date Sat, 19 Mar 2011 19:55:30 +0100
parents 86ecbe5ede89
children cb443a3d5b08
files src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java
diffstat 1 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java	Sat Mar 19 19:15:25 2011 +0100
+++ b/src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java	Sat Mar 19 19:55:30 2011 +0100
@@ -126,7 +126,7 @@
             return null;
         }
 
-        return new MethodRewriter(mv);
+        return new MethodRewriter(mv, desc);
     }
 
     @Override
@@ -136,6 +136,7 @@
 
     static class MethodRewriter implements DexMethodVisitor {
         final PatchMethodVisitor mv;
+        final String desc;
 
         private Interpreter interpreter;
         private int returnRegisterType; // type of the register used to stored
@@ -143,8 +144,9 @@
         private int locals;             // number of local variables
         private int parameters;         // number of parameters
 
-        public MethodRewriter(MethodVisitor mv) {
+        public MethodRewriter(MethodVisitor mv, String desc) {
             this.mv = new PatchMethodVisitor(mv);
+            this.desc = desc;
         }
 
         /**
@@ -489,6 +491,24 @@
         @Override
         public void visitInstrOp(Opcode opcode, int srcOrDst) {
             srcOrDst = registerToSlot(srcOrDst);
+            switch (opcode) {
+            case RETURN:
+                int type = getReturnTypeFromMethodDescriptor(desc);
+                mv.visitVarInsn(Register.getJavaOpcode(type, ILOAD), srcOrDst);
+                switch (type) {
+                case INT_TYPE:
+                    mv.visitInsn(IRETURN);
+                    break;
+                case FLOAT_TYPE:
+                    mv.visitInsn(FRETURN);
+                    break;
+                default:
+                    throw new UnsupportedOperationException("NYI " + opcode
+                            + " " + type);
+                }
+                interpreter.load(srcOrDst, type);
+                return;
+            }
             throw new UnsupportedOperationException("NYI " + opcode);
         }