@Override public void accept(DexCodeVisitor cv) { cv.visitStmt1R(op, a); } }
/** * <pre> * OP_RETURN_X * OP_THROW_X * OP_MONITOR_ENTER * OP_MONITOR_EXIT * OP_MOVE_RESULT_X * OP_MOVE_EXCEPTION_X * </pre> * * @param op * @param reg */ public void visitStmt1R(Op op, int reg) { if (visitor != null) { visitor.visitStmt1R(op, reg); } }
dcv.visitMethodStmt(Op.INVOKE_STATIC_RANGE, new int[]{ from}, new Method("Ljava/lang/Boolean;", "valueOf", new String[]{"Z"}, "Ljava/lang/Boolean;")); dcv.visitStmt1R(Op.MOVE_RESULT_OBJECT, to); break; case 'B': dcv.visitMethodStmt(Op.INVOKE_STATIC_RANGE, new int[]{ from}, new Method("Ljava/lang/Byte;", "valueOf", new String[]{"B"}, "Ljava/lang/Byte;")); dcv.visitStmt1R(Op.MOVE_RESULT_OBJECT, to); break; case 'S': dcv.visitMethodStmt(Op.INVOKE_STATIC_RANGE, new int[]{ from}, new Method("Ljava/lang/Short;", "valueOf", new String[]{"S"}, "Ljava/lang/Short;")); dcv.visitStmt1R(Op.MOVE_RESULT_OBJECT, to); break; case 'C': from}, new Method("Ljava/lang/Character;", "valueOf", new String[]{ "C"}, "Ljava/lang/Character;")); dcv.visitStmt1R(Op.MOVE_RESULT_OBJECT, to); break; case 'I': dcv.visitMethodStmt(Op.INVOKE_STATIC_RANGE, new int[]{ from}, new Method("Ljava/lang/Integer;", "valueOf", new String[]{"I"}, "Ljava/lang/Integer;")); dcv.visitStmt1R(Op.MOVE_RESULT_OBJECT, to); break; case 'F': dcv.visitMethodStmt(Op.INVOKE_STATIC_RANGE, new int[]{ from}, new Method("Ljava/lang/Float;", "valueOf", new String[]{"F"}, "Ljava/lang/Float;")); dcv.visitStmt1R(Op.MOVE_RESULT_OBJECT, to);
code.visitMethodStmt(Op.INVOKE_DIRECT, new int[]{0, 1}, new Method("Ljava/lang/RuntimeException;", "<init>", new String[]{"Ljava/lang/String;"}, "V")); code.visitStmt1R(Op.THROW, 0); code.visitStmt1R(Op.RETURN_OBJECT, 0);
dcv.visitMethodStmt(Op.INVOKE_VIRTUAL_RANGE, new int[]{ i}, new Method("Ljava/lang/Boolean;", "booleanValue", new String[]{}, "Z")); dcv.visitStmt1R(Op.MOVE_RESULT, i); break; case 'B': dcv.visitMethodStmt(Op.INVOKE_VIRTUAL_RANGE, new int[]{ i}, new Method("Ljava/lang/Byte;", "byteValue", new String[]{}, "B")); dcv.visitStmt1R(Op.MOVE_RESULT, i); break; case 'S': dcv.visitMethodStmt(Op.INVOKE_VIRTUAL_RANGE, new int[]{ i}, new Method("Ljava/lang/Short;", "shortValue", new String[]{}, "S")); dcv.visitStmt1R(Op.MOVE_RESULT, i); break; case 'C': dcv.visitMethodStmt(Op.INVOKE_VIRTUAL_RANGE, new int[]{ i}, new Method("Ljava/lang/Character;", "charValue", new String[]{}, "C")); dcv.visitStmt1R(Op.MOVE_RESULT, i); break; case 'I': dcv.visitMethodStmt(Op.INVOKE_VIRTUAL_RANGE, new int[]{ i}, new Method("Ljava/lang/Integer;", "intValue", new String[]{}, "I")); dcv.visitStmt1R(Op.MOVE_RESULT, i); break; case 'F':
case '[': case 'L': dcv.visitStmt1R(Op.MOVE_RESULT_OBJECT, 0); break; case 'J': case 'D': dcv.visitStmt1R(Op.MOVE_RESULT_WIDE, 0); break; default: dcv.visitStmt1R(Op.MOVE_RESULT, 0); break; case '[': case 'L': dcv.visitStmt1R(Op.RETURN_OBJECT, 0); break; case 'J': case 'D': dcv.visitStmt1R(Op.RETURN_WIDE, 0); break; default: dcv.visitStmt1R(Op.RETURN, 0); break;
case '[': case 'L': dcv.visitStmt1R(Op.MOVE_RESULT_OBJECT, 0); break; case 'J': case 'D': dcv.visitStmt1R(Op.MOVE_RESULT_WIDE, 0); break; default: dcv.visitStmt1R(Op.MOVE_RESULT, 0); break; dcv.visitStmt1R(Op.RETURN_OBJECT, 0);
code.visitFieldStmt(SGET_OBJECT, v0, -1, new Field("Ljava/lang/System;", "out", "Ljava/io/PrintStream;")); code.visitLabel(try_start); code.visitStmt1R(MONITOR_ENTER, v0); code.visitConstStmt(CONST_STRING, v1, "haha"); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { v0, v1 }, new Method("Ljava/io/PrintString;", "println", new String[] { "Ljava/lang/String;" }, "V")); code.visitLabel(try_end); code.visitStmt1R(MONITOR_EXIT, v0); code.visitStmt0R(RETURN_VOID); code.visitLabel(catch_a); code.visitStmt1R(MOVE_EXCEPTION, v1); code.visitStmt1R(MONITOR_EXIT, v0); code.visitStmt1R(THROW, v1); code.visitEnd(); mv.visitEnd();
@Test public static void i168(DexClassVisitor cv) { DexMethodVisitor mv = cv.visitMethod(ACC_PUBLIC | ACC_STATIC, new Method("La;", "a", new String[] {}, "I")); DexCodeVisitor code = mv.visitCode(); code.visitRegister(2000); // 2000 locals for (int i = 0; i < 2000; i++) {// 2000 insns code.visitConstStmt(Op.CONST, i, i); } for (int i = 0; i < 18000; i++) {// 18000 insns code.visitConstStmt(Op.CONST, 25, i); } code.visitStmt1R(Op.RETURN, 25); code.visitEnd(); mv.visitEnd(); } }
code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 5, 10 }, new Method("Ljava/util/regex/Pattern;", "matcher", new String[] { "Ljava/lang/CharSequence;" }, "Ljava/util/regex/Matcher;")); code.visitStmt1R(MOVE_RESULT_OBJECT, 1); code.visitStmt1R(MOVE_RESULT, 5); DexLabel L13 = new DexLabel(); code.visitJumpStmt(IF_NEZ, 5, -1,L13); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 6, 8 }, new Method("Ljava/lang/StringBuilder;", "append", new String[] { "Ljava/lang/String;" }, "Ljava/lang/StringBuilder;")); code.visitStmt1R(MOVE_RESULT_OBJECT, 6); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 6, 10 }, new Method("Ljava/lang/StringBuilder;", "append", new String[] { "Ljava/lang/String;" }, "Ljava/lang/StringBuilder;")); code.visitStmt1R(MOVE_RESULT_OBJECT, 6); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 6 }, new Method("Ljava/lang/StringBuilder;", "toString", new String[] {}, "Ljava/lang/String;")); code.visitStmt1R(MOVE_RESULT_OBJECT, 6); code.visitMethodStmt(INVOKE_DIRECT, new int[] { 5, 6 }, new Method( "Lorg/apache/commons/net/MalformedServerReplyException;", "<init>", new String[] { "Ljava/lang/String;" }, "V")); code.visitStmt1R(THROW, 5); code.visitLabel(L13); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 1 }, new Method("Ljava/util/regex/Matcher;", "group", new String[] {}, "Ljava/lang/String;")); code.visitStmt1R(MOVE_RESULT_OBJECT, 10); code.visitStmt1R(MOVE_RESULT_OBJECT, 5); code.visitConstStmt(CONST_STRING, 6, ","); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 5, 6 }, new Method("Ljava/lang/String;", "split",
code.visitStmt1R(MOVE_RESULT_OBJECT, v0); code.visitStmt1R(RETURN_OBJECT, v0); code.visitLabel(cond_7); code.visitConstStmt(CONST_STRING, p1, "ISO-8859-1"); code.visitJumpStmt(GOTO, -1, -1, goto_2); 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")); code.visitStmt1R(THROW, v1); code.visitEnd(); mv.visitEnd();
code.visitRegister(2); code.visitFieldStmt(Op.IGET, 0, 1, new Field(typeNameDesc, "args", "[Ljava/lang/Object;")); code.visitStmt1R(Op.RETURN_OBJECT, 0); code.visitRegister(2); code.visitFieldStmt(Op.IGET, 0, 1, new Field(typeNameDesc, "thiz", "Ljava/lang/Object;")); code.visitStmt1R(Op.RETURN_OBJECT, 0); code.visitEnd(); mv.visitEnd(); code.visitMethodStmt(Op.INVOKE_DIRECT, new int[]{0, 1}, new Method("Ljava/lang/RuntimeException;", "<init>", new String[]{"Ljava/lang/String;"}, "V")); code.visitStmt1R(Op.THROW, 0); code.visitMethodStmt(Op.INVOKE_STATIC, new int[]{0, 1}, mCallback); code.visitStmt1R(Op.MOVE_RESULT_OBJECT, 0); code.visitStmt1R(Op.RETURN_OBJECT, 0);
code.visitJumpStmt(IF_EQ, v0, v0, L2); code.visitLabel(L1); code.visitStmt1R(RETURN_OBJECT, v0); code.visitLabel(L2); code.visitJumpStmt(IF_EQ, v0, v0, L3); code.visitMethodStmt(INVOKE_STATIC, new int[0], new Method("La;", "getBytes", new String[0], "[B")); code.visitStmt1R(MOVE_RESULT_OBJECT, v0); code.visitLabel(L3); code.visitMethodStmt(INVOKE_STATIC, new int[] { v0 }, new Method("La;", "useBytes", code.visitMethodStmt(INVOKE_STATIC, new int[0], new Method("La;", "getObjects", new String[0], "[Ljava/lang/Object;")); code.visitStmt1R(MOVE_RESULT, v0); code.visitJumpStmt(GOTO, -1, -1, L1); code.visitEnd();
dcv.visitStmt1R(op, 0xFF & insns[u1offset + 1]); break; case kFmt12x:
public static void a(DexClassVisitor cv) { DexMethodVisitor mv = cv.visitMethod(ACC_PUBLIC | ACC_STATIC, new Method("La;", "b", new String[] {}, "V")); DexCodeVisitor code = mv.visitCode(); code.visitRegister(2); DexLabel L0 = new DexLabel(); DexLabel L1 = new DexLabel(); DexLabel L2 = new DexLabel(); code.visitTryCatch(L0, L1, new DexLabel[] { L2 }, new String[] { "Lsome/Exception;" }); code.visitLabel(L0); code.visitConstStmt(CONST_STRING, 0, "abc"); code.visitLabel(L1); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 0 }, new Method("Ljava/lang/String;", "toString", new String[] {}, "Ljava/lang/String;")); code.visitStmt0R(RETURN_VOID); code.visitLabel(L2); code.visitStmt1R(MOVE_EXCEPTION, 1); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 1 }, new Method("Ljava/lang/String;", "toString", new String[] {}, "Ljava/lang/String;")); code.visitStmt0R(RETURN_VOID); code.visitEnd(); mv.visitEnd(); }
code.visitStmt2R(MOVE, 2, 4); code.visitLabel(L9); code.visitStmt1R(RETURN_OBJECT, 2); code.visitLabel(L10); code.visitTypeStmt(NEW_INSTANCE, 1, -1, "Lorg/json/JSONObject;"); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 1 }, new Method("Lorg/json/JSONObject;", "toString", new String[] {}, "Ljava/lang/String;")); code.visitStmt1R(MOVE_RESULT_OBJECT, 2); code.visitJumpStmt(GOTO, -1, -1, L9); code.visitLabel(L3); code.visitMethodStmt(INVOKE_STATIC, new int[] { 3 }, new Method("LBase64;", "encode", new String[] { "[B" }, "Ljava/lang/String;")); code.visitStmt1R(MOVE_RESULT, 3); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 1, 2, 3 }, new Method("Lorg/json/JSONObject;", "put", new String[] { "Ljava/lang/String;", "Ljava/lang/Object;" }, "Lorg/json/JSONObject;")); code.visitJumpStmt(GOTO, -1, -1, L1); code.visitLabel(L2); code.visitStmt1R(MOVE_EXCEPTION, 2); code.visitStmt2R(MOVE, 0, 2); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 0 }, new Method("Lorg/json/JSONException;", "getMessage", new String[] {}, "Ljava/lang/String;")); code.visitStmt1R(MOVE_RESULT, 3); code.visitMethodStmt(INVOKE_STATIC, new int[] { 2, 3 }, new Method("Landroid/util/Log;", "e", new String[] { "Ljava/lang/String;", "Ljava/lang/String;" }, "I"));
@Override public void accept(DexCodeVisitor cv) { cv.visitStmt1R(op, a); } }
/** * <pre> * OP_RETURN_X * OP_THROW_X * OP_MONITOR_ENTER * OP_MONITOR_EXIT * OP_MOVE_RESULT_X * OP_MOVE_EXCEPTION_X * </pre> * * @param op * @param reg */ public void visitStmt1R(Op op, int reg) { if (visitor != null) { visitor.visitStmt1R(op, reg); } }
dcv.visitStmt1R(op, 0xFF & insns[u1offset + 1]); break; case kFmt12x: