Search in sources :

Example 11 with IrMethod

use of com.googlecode.dex2jar.ir.IrMethod in project dex2jar by pxb1988.

the class BaseTransformerTest method setup.

@Before
public void setup() {
    method = new IrMethod();
    method.owner = "La/Clz;";
    method.name = "call";
    method.ret = "V";
    method.isStatic = true;
    method.args = new String[0];
    stmts = method.stmts;
    locals = method.locals;
}
Also used : IrMethod(com.googlecode.dex2jar.ir.IrMethod) Before(org.junit.Before)

Example 12 with IrMethod

use of com.googlecode.dex2jar.ir.IrMethod in project dex2jar by pxb1988.

the class ConstTransformerTest method test02.

@Test
public void test02() {
    // test local loop
    IrMethod jm = new IrMethod();
    Local a = nLocal("a");
    Local p = nLocal("p");
    Local q = nLocal("q");
    jm.locals.add(a);
    jm.locals.add(p);
    jm.locals.add(q);
    jm.stmts.add(nAssign(a, nString("a String")));
    jm.stmts.add(nAssign(p, Exprs.nPhi(a, q)));
    jm.stmts.add(nAssign(q, Exprs.nPhi(p)));
    UnopStmt retStmt = nReturn(q);
    jm.stmts.add(retStmt);
    new ConstTransformer().transform(jm);
    Assert.assertTrue(jm.locals.size() == 3);
    Assert.assertTrue(jm.stmts.getSize() == 4);
    Assert.assertEquals("a String", ((Constant) retStmt.op.trim()).value);
}
Also used : ConstTransformer(com.googlecode.dex2jar.ir.ts.ConstTransformer) Exprs.nLocal(com.googlecode.dex2jar.ir.expr.Exprs.nLocal) Local(com.googlecode.dex2jar.ir.expr.Local) IrMethod(com.googlecode.dex2jar.ir.IrMethod) UnopStmt(com.googlecode.dex2jar.ir.stmt.UnopStmt) Test(org.junit.Test)

Example 13 with IrMethod

use of com.googlecode.dex2jar.ir.IrMethod in project dex2jar by pxb1988.

the class ConstTransformerTest method test03.

@Test
public void test03() {
    // test local loop
    IrMethod jm = new IrMethod();
    Local a = nLocal("a");
    Local b = nLocal("b");
    Local p = nLocal("p");
    jm.locals.add(a);
    jm.locals.add(b);
    jm.locals.add(p);
    jm.stmts.add(nAssign(a, nString("a String")));
    jm.stmts.add(nAssign(b, nString("b String")));
    jm.stmts.add(nAssign(p, Exprs.nPhi(a, b)));
    UnopStmt retStmt = nReturn(p);
    jm.stmts.add(retStmt);
    new ConstTransformer().transform(jm);
    Assert.assertTrue(jm.locals.size() == 3);
    Assert.assertTrue(jm.stmts.getSize() == 4);
    Assert.assertEquals(p, retStmt.op.trim());
}
Also used : ConstTransformer(com.googlecode.dex2jar.ir.ts.ConstTransformer) Exprs.nLocal(com.googlecode.dex2jar.ir.expr.Exprs.nLocal) Local(com.googlecode.dex2jar.ir.expr.Local) IrMethod(com.googlecode.dex2jar.ir.IrMethod) UnopStmt(com.googlecode.dex2jar.ir.stmt.UnopStmt) Test(org.junit.Test)

Example 14 with IrMethod

use of com.googlecode.dex2jar.ir.IrMethod in project dex2jar by pxb1988.

the class Dex2jar method doTranslate.

private void doTranslate(final Path dist) throws IOException {
    DexFileNode fileNode = new DexFileNode();
    try {
        reader.accept(fileNode, readerConfig | DexFileReader.IGNORE_READ_EXCEPTION);
    } catch (Exception ex) {
        exceptionHandler.handleFileException(ex);
    }
    ClassVisitorFactory cvf = new ClassVisitorFactory() {

        @Override
        public ClassVisitor create(final String name) {
            return new ClassVisitor(Opcodes.ASM4, new ClassWriter(ClassWriter.COMPUTE_MAXS)) {

                @Override
                public void visitEnd() {
                    super.visitEnd();
                    ClassWriter cw = (ClassWriter) super.cv;
                    byte[] data;
                    try {
                        // FIXME handle 'java.lang.RuntimeException: Method code too large!'
                        data = cw.toByteArray();
                    } catch (Exception ex) {
                        System.err.println(String.format("ASM fail to generate .class file: %s", name));
                        exceptionHandler.handleFileException(ex);
                        return;
                    }
                    try {
                        Path dist1 = dist.resolve(name + ".class");
                        Path parent = dist1.getParent();
                        if (parent != null && !Files.exists(parent)) {
                            Files.createDirectories(parent);
                        }
                        Files.write(dist1, data);
                    } catch (IOException e) {
                        e.printStackTrace(System.err);
                    }
                }
            };
        }
    };
    new ExDex2Asm(exceptionHandler) {

        public void convertCode(DexMethodNode methodNode, MethodVisitor mv) {
            if ((readerConfig & DexFileReader.SKIP_CODE) != 0 && methodNode.method.getName().equals("<clinit>")) {
                // also skip clinit
                return;
            }
            super.convertCode(methodNode, mv);
        }

        @Override
        public void optimize(IrMethod irMethod) {
            T_cleanLabel.transform(irMethod);
            if (0 != (v3Config & V3.TOPOLOGICAL_SORT)) {
            // T_topologicalSort.transform(irMethod);
            }
            T_deadCode.transform(irMethod);
            T_removeLocal.transform(irMethod);
            T_removeConst.transform(irMethod);
            T_zero.transform(irMethod);
            if (T_npe.transformReportChanged(irMethod)) {
                T_deadCode.transform(irMethod);
                T_removeLocal.transform(irMethod);
                T_removeConst.transform(irMethod);
            }
            T_new.transform(irMethod);
            T_fillArray.transform(irMethod);
            T_agg.transform(irMethod);
            T_multiArray.transform(irMethod);
            T_voidInvoke.transform(irMethod);
            if (0 != (v3Config & V3.PRINT_IR)) {
                int i = 0;
                for (Stmt p : irMethod.stmts) {
                    if (p.st == Stmt.ST.LABEL) {
                        LabelStmt labelStmt = (LabelStmt) p;
                        labelStmt.displayName = "L" + i++;
                    }
                }
                System.out.println(irMethod);
            }
            T_type.transform(irMethod);
            T_unssa.transform(irMethod);
            T_ir2jRegAssign.transform(irMethod);
            T_trimEx.transform(irMethod);
        }

        @Override
        public void ir2j(IrMethod irMethod, MethodVisitor mv) {
            new IR2JConverter(0 != (V3.OPTIMIZE_SYNCHRONIZED & v3Config)).convert(irMethod, mv);
        }
    }.convertDex(fileNode, cvf);
}
Also used : Path(java.nio.file.Path) LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) ClassVisitor(org.objectweb.asm.ClassVisitor) IOException(java.io.IOException) IrMethod(com.googlecode.dex2jar.ir.IrMethod) IOException(java.io.IOException) ClassWriter(org.objectweb.asm.ClassWriter) MethodVisitor(org.objectweb.asm.MethodVisitor) LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) Stmt(com.googlecode.dex2jar.ir.stmt.Stmt) DexMethodNode(com.googlecode.d2j.node.DexMethodNode) DexFileNode(com.googlecode.d2j.node.DexFileNode) IR2JConverter(com.googlecode.d2j.converter.IR2JConverter)

Aggregations

IrMethod (com.googlecode.dex2jar.ir.IrMethod)14 Exprs.nLocal (com.googlecode.dex2jar.ir.expr.Exprs.nLocal)5 Local (com.googlecode.dex2jar.ir.expr.Local)5 UnopStmt (com.googlecode.dex2jar.ir.stmt.UnopStmt)5 ConstTransformer (com.googlecode.dex2jar.ir.ts.ConstTransformer)5 Test (org.junit.Test)5 IOException (java.io.IOException)3 IR2JConverter (com.googlecode.d2j.converter.IR2JConverter)2 InvocationTargetException (java.lang.reflect.InvocationTargetException)2 DexFileNode (com.googlecode.d2j.node.DexFileNode)1 DexMethodNode (com.googlecode.d2j.node.DexMethodNode)1 StmtTraveler (com.googlecode.dex2jar.ir.StmtTraveler)1 Exprs.nString (com.googlecode.dex2jar.ir.expr.Exprs.nString)1 Value (com.googlecode.dex2jar.ir.expr.Value)1 LabelStmt (com.googlecode.dex2jar.ir.stmt.LabelStmt)1 Stmt (com.googlecode.dex2jar.ir.stmt.Stmt)1 Method (java.lang.reflect.Method)1 Path (java.nio.file.Path)1 Before (org.junit.Before)1 ClassVisitor (org.objectweb.asm.ClassVisitor)1