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);