# HG changeset patch # User forax # Date 1301340945 -7200 # Node ID 27104b37e259d80210af16e1aa7229ecb9a34061 # Parent 677ddb123c9171f0bf5b83f48de828ddcaa09ec1 Add the implementation of filled-new-array. Also fix a small bug in the implementation of checkcast (array of primitive should be supported). diff -r 677ddb123c91 -r 27104b37e259 src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java --- a/src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java Mon Mar 28 16:19:59 2011 +0200 +++ b/src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java Mon Mar 28 21:35:45 2011 +0200 @@ -451,10 +451,11 @@ case CHECK_CAST: mv.visitVarInsn(ALOAD, vsrcOrDest); interpreter.load(vsrcOrDest, OBJECT_TYPE); - mv.visitTypeInsn(CHECKCAST, TypeUtil - .convertDescToInternal(typeDesc)); + mv.visitTypeInsn(CHECKCAST, Type.getType(typeDesc) + .getInternalName()); mv.visitVarInsn(ASTORE, vsrcOrDest); - interpreter.store(vsrcOrDest, getTypeFromASMType(Type.getType(typeDesc))); + interpreter.store(vsrcOrDest, + getTypeFromASMType(Type.getType(typeDesc))); break; default: throw newAssertionError(opcode); @@ -973,6 +974,44 @@ } @Override + public void visitInstrFilledNewArray(Opcode opcode, int num, int va, + int vpacked, String desc) { + fixStackAfterAMethodCallOrAnExceptionHandler(); + + int[] registers; + if (opcode == Opcode.FILLED_NEW_ARRAY_RANGE) { + registers = null; + } else { + registers = new int[] { getRegisterD(vpacked), + getRegisterE(vpacked), getRegisterF(vpacked), + getRegisterG(vpacked), va }; + } + + Type asmType = Type.getType(desc.substring(1)); + int type = getTypeFromASMType(asmType); + mv.visitLdcInsn(num); // array length + if (Register.isArray(type) || type == OBJECT_TYPE) { + mv.visitTypeInsn(ANEWARRAY, asmType.getInternalName()); + } else { + mv.visitIntInsn(NEWARRAY, getNewArrayKindFromASMType(asmType)); + } + + for (int r=0, i=0; r