Mercurial > hg > icedrobot > daneel
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); }