@Override public void accept(DexCodeVisitor cv) { cv.visitMethodStmt(op, args, name, proto, bsm, bsmArgs); }
/** * <pre> * OP_INVOKE_POLYMORPHIC * </pre> * */ public void visitMethodStmt(Op op, int[] args, Method bsm, Proto proto) { if (visitor != null) { visitor.visitMethodStmt(op, args, bsm, proto); } }
/** * <pre> * OP_INVOKE_CUSTOM * </pre> */ public void visitMethodStmt(Op op, int[] args, String name, Proto proto, MethodHandle bsm, Object... bsmArgs) { if (visitor != null) { visitor.visitMethodStmt(op, args, name, proto, bsm, bsmArgs); } }
@Override public void accept(DexCodeVisitor cv) { cv.visitMethodStmt(op, args, method); }
@Override public void accept(DexCodeVisitor cv) { cv.visitMethodStmt(op, args, method, proto); }
/** * <pre> * OP_INVOKE_VIRTUAL * OP_INVOKE_SUPER * OP_INVOKE_DIRECT * OP_INVOKE_STATIC * OP_INVOKE_INTERFACE * </pre> * * @param op * @param args * @param method */ public void visitMethodStmt(Op op, int[] args, Method method) { if (visitor != null) { visitor.visitMethodStmt(op, args, method); } }
break; case 'Z': 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': dcv.visitMethodStmt(Op.INVOKE_STATIC_RANGE, new int[]{ from}, new Method("Ljava/lang/Character;", "valueOf", new String[]{ "C"}, "Ljava/lang/Character;")); 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[]{
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")); dcv.visitStmt1R(Op.MOVE_RESULT, i); 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")); dcv.visitStmt1R(Op.MOVE_RESULT, i); 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")); dcv.visitStmt1R(Op.MOVE_RESULT, i); 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")); dcv.visitStmt1R(Op.MOVE_RESULT, i); case 'I': dcv.visitTypeStmt(Op.CHECK_CAST, i, i, "Ljava/lang/Integer;"); dcv.visitMethodStmt(Op.INVOKE_VIRTUAL_RANGE, new int[]{ i}, new Method("Ljava/lang/Integer;", "intValue", new String[]{}, "I")); dcv.visitStmt1R(Op.MOVE_RESULT, 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, 1}, new Method("Ljava/lang/RuntimeException;", "<init>", new String[]{"Ljava/lang/String;"}, "V")); code.visitStmt1R(Op.THROW, 0);
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[]{ "Ljava/lang/Object;", "[Ljava/lang/Object;", "I" }, "V")); Method call = build(mapTo); dcv.visitMethodStmt(Op.INVOKE_STATIC, new int[]{3}, call); if (!"V".equals(t.getReturnType())) { switch (call.getReturnType().charAt(0)) {
@Test public static void a120(DexClassVisitor cv) { DexMethodVisitor mv = cv.visitMethod(ACC_PUBLIC | ACC_STATIC, new Method("La;", "b", new String[] {}, "V")); DexCodeVisitor code = mv.visitCode(); code.visitRegister(3); code.visitConstStmt(CONST, 0, Integer.valueOf(0)); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 0 }, new Method("Ljava/lang/String;", "toString", new String[] {}, "Ljava/lang/String;")); code.visitConstStmt(CONST, 1, Integer.valueOf(0)); code.visitStmt2R(ARRAY_LENGTH, 2, 1); code.visitStmt0R(RETURN_VOID); code.visitEnd(); mv.visitEnd(); }
dcv.visitMethodStmt(opcode, args, t); if ("V".equals(t.getReturnType())) { dcv.visitConstStmt(Op.CONST, 0, 0);
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.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 1 }, new Method("Ljava/util/regex/Matcher;", "find", new String[] {}, "Z")); code.visitStmt1R(MOVE_RESULT, 5); code.visitMethodStmt(INVOKE_DIRECT, new int[] { 6 }, new Method("Ljava/lang/StringBuilder;", "<init>", new String[] {}, "V")); code.visitConstStmt(CONST_STRING, 7, "Could not parse passive host information.\nServer Reply: "); 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.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", new String[] { "[B" }, "V")); code.visitMethodStmt(INVOKE_STATIC, new int[0], new Method("La;", "getObjects", new String[0], "[Ljava/lang/Object;")); code.visitStmt1R(MOVE_RESULT, v0);
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.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, 1}, new Method("Ljava/lang/RuntimeException;", "<init>", new String[]{"Ljava/lang/String;"}, "V")); code.visitStmt1R(Op.THROW, 0); Method mCallback = (Method) callback.callback; if (callback.isStatic) { 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 { code.visitMethodStmt(Op.INVOKE_STATIC, new int[]{0, 1}, mCallback);
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")); 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.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.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 1, 2, 3 }, new Method("Lorg/json/JSONObject;", "put", new String[] { "Ljava/lang/String;", "I" }, "Lorg/json/JSONObject;")); 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.visitLabel(L1); 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.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.visitLabel(L4); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 0 }, new Method("Lorg/json/JSONException;",
code.visitLabel(try_start_2); code.visitMethodStmt(INVOKE_STATIC, new int[] { p0, p1 }, new Method("Ljava/net/URLEncoder;", "encode", new String[] { "Ljava/lang/String;", "Ljava/lang/String;" }, "Ljava/lang/String;")); code.visitStmt1R(MOVE_RESULT_OBJECT, v0); 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.visitRegister(3); code.visitMethodStmt(INVOKE_SUPER, new int[] { 2 }, new Method("Ljava/lang/Object;", "<init>", new String[] {}, "V")); code.visitFieldStmt(SGET_BOOLEAN, 0, -1, f);
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);