@Override public void accept(DexCodeVisitor cv) { cv.visitTypeStmt(op, a, b, type); } }
/** * <pre> * OP_INSTANCE_OF * OP_NEW_ARRAY * OP_CHECK_CAST * OP_NEW_INSTANCE * </pre> * * @param op * @param a * @param b * @param type */ public void visitTypeStmt(Op op, int a, int b, String type) { if (visitor != null) { visitor.visitTypeStmt(op, a, b, type); } }
case '[': case 'L': dcv.visitTypeStmt(Op.CHECK_CAST, i, i, argType); break; case 'Z': dcv.visitTypeStmt(Op.CHECK_CAST, i, i, "Ljava/lang/Boolean;"); dcv.visitMethodStmt(Op.INVOKE_VIRTUAL_RANGE, new int[]{ i}, new Method("Ljava/lang/Boolean;", "booleanValue", new String[]{}, "Z")); break; case 'B': dcv.visitTypeStmt(Op.CHECK_CAST, i, i, "Ljava/lang/Byte;"); dcv.visitMethodStmt(Op.INVOKE_VIRTUAL_RANGE, new int[]{ i}, new Method("Ljava/lang/Byte;", "byteValue", new String[]{}, "B")); break; case 'S': dcv.visitTypeStmt(Op.CHECK_CAST, i, i, "Ljava/lang/Short;"); dcv.visitMethodStmt(Op.INVOKE_VIRTUAL_RANGE, new int[]{ i}, new Method("Ljava/lang/Short;", "shortValue", new String[]{}, "S")); break; case 'C': dcv.visitTypeStmt(Op.CHECK_CAST, i, i, "Ljava/lang/Character;"); dcv.visitMethodStmt(Op.INVOKE_VIRTUAL_RANGE, new int[]{ i}, new Method("Ljava/lang/Character;", "charValue", new String[]{}, "C")); break; case 'I':
code.visitTypeStmt(Op.NEW_INSTANCE, 0, 0, "Ljava/lang/RuntimeException;"); code.visitConstStmt(Op.CONST_STRING, 1, "invalid idx"); code.visitMethodStmt(Op.INVOKE_DIRECT, new int[]{0,
} else { dcv.visitConstStmt(Op.CONST, 1, t.getParameterTypes().length); dcv.visitTypeStmt(Op.NEW_ARRAY, 1, 1, "[Ljava/lang/Object;"); for (int i = 0; i < t.getParameterTypes().length; i++) { char type = t.getParameterTypes()[i].charAt(0); dcv.visitConstStmt(Op.CONST, 2, nextIdx); String miTypeDesc = "L" + getCurrentInvocationName() + ";"; dcv.visitTypeStmt(Op.NEW_INSTANCE, 3, 0, miTypeDesc); dcv.visitMethodStmt(Op.INVOKE_DIRECT, new int[]{3, 0, 1, 2}, new Method(miTypeDesc, "<init>", new String[]{
dcv.visitTypeStmt(Op.CHECK_CAST, i, -1, t.getOwner());
dcv.visitConstStmt(op, a, new DexType(getType(b))); } else { dcv.visitTypeStmt(op, a, -1, getType(b)); break; case kIndexTypeRef: dcv.visitTypeStmt(op, a & 0xF, a >> 4, getType(b)); break; default:
code.visitTypeStmt(Op.NEW_INSTANCE, 0, 0, "Ljava/lang/RuntimeException;"); code.visitConstStmt(Op.CONST_STRING, 1, "invalid idx"); code.visitMethodStmt(Op.INVOKE_DIRECT, new int[]{0, code.visitMethodStmt(Op.INVOKE_STATIC, new int[]{1}, mCallback); } else if (callback.isSpecial) { code.visitTypeStmt(Op.CHECK_CAST, 0, -1, mCallback.getOwner()); code.visitMethodStmt(Op.INVOKE_VIRTUAL, new int[]{0, 1}, mCallback); } else {
@Test public static void merge1(DexClassVisitor cv) {// obj = array DexMethodVisitor mv = cv.visitMethod(ACC_PUBLIC | ACC_STATIC, new Method("La;", "b", new String[] {}, "V")); DexCodeVisitor code = mv.visitCode(); DexLabel L0 = new DexLabel(); DexLabel L1 = new DexLabel(); code.visitRegister(3); code.visitConstStmt(CONST, 0, 0); code.visitJumpStmt(GOTO, -1, -1, L1); code.visitLabel(L0); code.visitStmt2R(ARRAY_LENGTH, 1, 0); code.visitConstStmt(CONST, 1, 0); code.visitStmt3R(AGET, 2, 0, 1); code.visitStmt0R(RETURN_VOID); code.visitLabel(L1); code.visitConstStmt(CONST, 1, 1); code.visitTypeStmt(NEW_ARRAY, 0, 1, "[Ljava/security/cert/X509Certificate;"); code.visitJumpStmt(GOTO, -1, -1, L0); code.visitEnd(); mv.visitEnd(); } }
code.visitJumpStmt(IF_NEZ, 5, -1,L13); code.visitTypeStmt(NEW_INSTANCE, 5,-1, "Lorg/apache/commons/net/MalformedServerReplyException;"); code.visitTypeStmt(NEW_INSTANCE, 6,-1, "Ljava/lang/StringBuilder;"); code.visitMethodStmt(INVOKE_DIRECT, new int[] { 6 }, new Method("Ljava/lang/StringBuilder;", "<init>", new String[] {}, "V")); code.visitStmt1R(MOVE_RESULT_OBJECT, 4); code.visitTypeStmt(NEW_INSTANCE, 5, -1,"Ljava/lang/StringBuilder;"); code.visitMethodStmt(INVOKE_DIRECT, new int[] { 5 }, new Method("Ljava/lang/StringBuilder;", "<init>", new String[] {}, "V")); code.visitStmt2R(MOVE, 0, 5); code.visitTypeStmt(NEW_INSTANCE, 5, -1,"Lorg/apache/commons/net/MalformedServerReplyException;"); code.visitTypeStmt(NEW_INSTANCE, 6,-1, "Ljava/lang/StringBuilder;"); code.visitMethodStmt(INVOKE_DIRECT, new int[] { 6 }, new Method("Ljava/lang/StringBuilder;", "<init>", new String[] {}, "V"));
code.visitLabel(catch_a); code.visitStmt1R(MOVE_EXCEPTION, v0); code.visitTypeStmt(NEW_INSTANCE, v1, -1, "Ljava/lang/IllegalArgumentException;"); code.visitMethodStmt(INVOKE_DIRECT, new int[] { v1, v0 }, new Method("Ljava/lang/IllegalArgumentException;", "<init>", new String[] { "Ljava/lang/Throwable;" }, "V"));
@Override public void accept(DexCodeVisitor cv) { cv.visitTypeStmt(op, a, b, type); } }
/** * <pre> * OP_INSTANCE_OF * OP_NEW_ARRAY * OP_CHECK_CAST * OP_NEW_INSTANCE * </pre> * * @param op * @param a * @param b * @param type */ public void visitTypeStmt(Op op, int a, int b, String type) { if (visitor != null) { visitor.visitTypeStmt(op, a, b, type); } }
code.visitStmt1R(RETURN_OBJECT, 2); code.visitLabel(L10); code.visitTypeStmt(NEW_INSTANCE, 1, -1, "Lorg/json/JSONObject;"); code.visitMethodStmt(INVOKE_DIRECT, new int[] { 1 }, new Method("Lorg/json/JSONObject;", "<init>", new String[] {}, "V"));
dcv.visitConstStmt(op, a, new DexType(getType(b))); } else { dcv.visitTypeStmt(op, a, -1, getType(b)); break; case kIndexTypeRef: dcv.visitTypeStmt(op, a & 0xF, a >> 4, getType(b)); break; default: