Mercurial > hg > icedrobot > daneel
changeset 48:15c49e72ddef
Add new_instance, ldc_class and check_cast. Contributed by R?mi Forax.
author | Mario Torre <neugens.limasoftware@gmail.com> |
---|---|
date | Sat, 19 Mar 2011 18:57:55 +0100 |
parents | 3f0bf7420296 |
children | 86ecbe5ede89 |
files | src/main/java/org/icedrobot/daneel/dex/DexMethodVisitor.java src/main/java/org/icedrobot/daneel/dex/dexlib/DexLibDexReader.java src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java |
diffstat | 3 files changed, 38 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/main/java/org/icedrobot/daneel/dex/DexMethodVisitor.java Sat Mar 19 18:07:31 2011 +0100 +++ b/src/main/java/org/icedrobot/daneel/dex/DexMethodVisitor.java Sat Mar 19 18:57:55 2011 +0100 @@ -167,10 +167,10 @@ * Visits an instruction with a {@code 21c} format id. * * @param opcode An opcode among CONST_CLASS, CHECK_CAST, NEW_INSTANCE. - * @param vdest Destination register (no register pair). + * @param vsrcOrDest Source or destination register (no register pair). * @param type Constant type descriptor value. */ - void visitInstrClass(Opcode opcode, int vdest, String type); + void visitInstrClass(Opcode opcode, int vsrcOrDest, String type); /** * Visits an instruction with a {@code 22c} format id.
--- a/src/main/java/org/icedrobot/daneel/dex/dexlib/DexLibDexReader.java Sat Mar 19 18:07:31 2011 +0100 +++ b/src/main/java/org/icedrobot/daneel/dex/dexlib/DexLibDexReader.java Sat Mar 19 18:57:55 2011 +0100 @@ -408,6 +408,14 @@ desc); break; } + + case INSTR_CLASS: { + Instruction21c i21c = (Instruction21c) instr; + String type = ((TypeIdItem)i21c.getReferencedItem()).getTypeDescriptor(); + mv.visitInstrClass(opcode, i21c.getRegisterA(), type); + break; + } + default: throw new AssertionError("unknown category for " + dexOpcode);
--- a/src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java Sat Mar 19 18:07:31 2011 +0100 +++ b/src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java Sat Mar 19 18:57:55 2011 +0100 @@ -266,6 +266,34 @@ mv.visitVarInsn(ASTORE, vdest); interpreter.store(vdest, OBJECT_TYPE); } + + @Override + public void visitInstrClass(Opcode opcode, int vsrcOrDest, String type) { + vsrcOrDest = registerToSlot(vsrcOrDest); + switch(opcode) { + case CONST_CLASS: + mv.visitLdcInsn(Type.getType(type)); + mv.visitVarInsn(ASTORE, vsrcOrDest); + interpreter.store(vsrcOrDest, OBJECT_TYPE); + break; + case NEW_INSTANCE: + mv.visitTypeInsn(NEW, TypeUtil + .convertDescToInternal(type)); + mv.visitVarInsn(ASTORE, vsrcOrDest); + interpreter.store(vsrcOrDest, OBJECT_TYPE); + break; + case CHECK_CAST: + mv.visitVarInsn(ALOAD, vsrcOrDest); + interpreter.load(vsrcOrDest, OBJECT_TYPE); + mv.visitTypeInsn(CHECKCAST, TypeUtil + .convertDescToInternal(type)); + mv.visitVarInsn(ASTORE, vsrcOrDest); + interpreter.store(vsrcOrDest, OBJECT_TYPE); + break; + default: + throw newAssertionError(opcode); + } + } @Override public void visitInstrMethod(Opcode opcode, int num, int va, @@ -411,12 +439,6 @@ } @Override - public void visitInstrClass(Opcode opcode, int vdest, String type) { - vdest = registerToSlot(vdest); - throw new UnsupportedOperationException("NYI " + opcode); - } - - @Override public void visitInstrFillArrayData(Opcode opcode, int vsrc, Object arrayData) { vsrc = registerToSlot(vsrc);