@Override public void accept(DexCodeVisitor cv) { cv.visitConstStmt(op, a, value); } }
/** * <pre> * CONST * CONST_WIDE * CONST_STRING * CONST_CLASS * * </pre> * * @param op * @param ra * @param value * int/long/type */ public void visitConstStmt(Op op, int ra, Object value) { if (visitor != null) { visitor.visitConstStmt(op, ra, value); } }
@SuppressWarnings("incomplete-switch") @Override public void visitConstStmt(Op op, int ra, Object value) { switch (op) { case CONST_WIDE_16: { Long v = (Long) value; value = (int) v.shortValue(); break; } case CONST_WIDE_HIGH16: { Long v = (Long) value; value = (int) ((short) (v >> 48)); break; } case CONST_WIDE_32: { Long v = (Long) value; value = (int) v.intValue(); break; } case CONST_HIGH16: { Integer v = (Integer) value; value = (int) v.intValue() >> 16; break; } } out.s("%s %s, %s", op.displayName, reg(ra), BaksmaliDumper.escapeValue(value)); super.visitConstStmt(op, ra, value); }
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.visitConstStmt(Op.CONST_STRING, 0, e.getKey()); code.visitStmt1R(Op.RETURN_OBJECT, 0);
@Test public static void a123(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, 0); code.visitConstStmt(CONST, 1, 1); code.visitConstStmt(CONST, 2, 0x63); code.visitStmt3R(APUT, 2, 0, 1); code.visitStmt0R(RETURN_VOID); code.visitEnd(); mv.visitEnd(); }
@Test public static void a122(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.visitConstStmt(CONST, 2, Integer.valueOf(1)); code.visitStmt3R(AGET, 1, 0, 2); code.visitStmt0R(RETURN_VOID); code.visitEnd(); mv.visitEnd(); }
argStart++; } else { dcv.visitConstStmt(Op.CONST_4, 0, 0); dcv.visitConstStmt(Op.CONST_4, 1, 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, i); box(type, argStart, 3, dcv); dcv.visitStmt3R(Op.APUT_OBJECT, 3, 1, 2); dcv.visitConstStmt(Op.CONST, 2, nextIdx); String miTypeDesc = "L" + getCurrentInvocationName() + ";"; dcv.visitTypeStmt(Op.NEW_INSTANCE, 3, 0, miTypeDesc);
@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(); }
@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(); } }
@Test public static void i71(DexClassVisitor cv) { DexMethodVisitor mv = cv.visitMethod(ACC_STATIC, new Method("La;", "test", new String[] {}, "V")); if (mv != null) { DexCodeVisitor code = mv.visitCode(); if (code != null) { code.visitRegister(2); code.visitConstStmt(CONST_WIDE, 0, 0L); code.visitConstStmt(CONST_WIDE, 1, 2L); code.visitStmt3R(ADD_LONG, 0, 0, 1); code.visitStmt0R(RETURN_VOID); code.visitEnd(); } mv.visitEnd(); } } }
for (int i1 = 0; i1 < parameterTypes.length; i1++) { String argType = parameterTypes[i1]; dcv.visitConstStmt(Op.CONST, 0, i1); dcv.visitStmt3R(Op.AGET_OBJECT, i, argStart, 0); unbox(argType, i, dcv); dcv.visitConstStmt(Op.CONST, 0, 0); } else { switch (t.getReturnType().charAt(0)) {
@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(); } }
@Test public void test() { ASMifierFileV fv = new ASMifierFileV(new File("target/asmftest").toPath(), "a.b"); DexClassVisitor cv = fv.visit(ACC_PUBLIC, "La/f;", "Ljava/lang/Object;", null); DexFieldVisitor f2v = cv.visitField(ACC_PUBLIC, new Field("La/f;", "abc", "I"), null); f2v.visitEnd(); DexMethodVisitor mv = cv.visitMethod(ACC_PUBLIC | ACC_STATIC, new Method("La/f;", "zz", new String[0], "I")); DexAnnotationAble pv = mv.visitParameterAnnotation(2); DexAnnotationVisitor dav = pv.visitAnnotation("Leeeff;", Visibility.BUILD); dav.visitEnd(); DexCodeVisitor dcv = mv.visitCode(); dcv.visitConstStmt(Op.FILL_ARRAY_DATA, 0, new int[] { 1, 2, 3 }); dcv.visitStmt0R(Op.RETURN_VOID); dcv.visitEnd(); mv.visitEnd(); cv.visitEnd(); fv.visitEnd(); } }
code.visitConstStmt(CONST_STRING, 2, "response"); code.visitConstStmt(CONST_STRING, 4, ""); code.visitLabel(L0); code.visitFieldStmt(IGET, 2, 5, new Field("LJSResponseTest;", "className", "Ljava/lang/String;")); code.visitJumpStmt(IF_NEZ, 2, -1, L10); code.visitLabel(L8); code.visitConstStmt(CONST_STRING, 2, ""); code.visitStmt2R(MOVE, 2, 4); code.visitLabel(L9); code.visitConstStmt(CONST_STRING, 2, "class"); code.visitFieldStmt(IGET, 3, 5, new Field("LJSResponseTest;", "className", "Ljava/lang/String;")); 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.visitConstStmt(CONST_STRING, 2, "call"); code.visitFieldStmt(IGET, 3, 5, new Field("LJSResponseTest;", "methodName", "Ljava/lang/String;")); 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.visitConstStmt(CONST_STRING, 2, "result"); code.visitFieldStmt(IGET, 3, 5, new Field("LJSResponseTest;", "result", "I")); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 1, 2, 3 }, new Method("Lorg/json/JSONObject;", "put", code.visitConstStmt(CONST_STRING, 2, "response"); code.visitFieldStmt(IGET, 3, 5, new Field("LJSResponseTest;", "response", "Ljava/lang/Object;")); code.visitMethodStmt(INVOKE_VIRTUAL, new int[] { 1, 2, 3 }, new Method("Lorg/json/JSONObject;", "put",
new String[] {}, "V")); code.visitFieldStmt(SGET_BOOLEAN, 0, -1, f); code.visitConstStmt(CONST, 1, 0xffFFffFF); code.visitStmt3R(ADD_INT, 0, 0, 1); code.visitFieldStmt(SPUT_SHORT, 0, -1, f);
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.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"));
DexLabel L2 = new DexLabel(); DexLabel L3 = new DexLabel(); code.visitConstStmt(CONST, v0, 0); code.visitJumpStmt(IF_EQ, v0, v0, L2); code.visitLabel(L1);
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.visitStmt1R(RETURN_OBJECT, v0); code.visitLabel(cond_7); code.visitConstStmt(CONST_STRING, p1, "ISO-8859-1");