Example usage for org.objectweb.asm.util Textifier Textifier

List of usage examples for org.objectweb.asm.util Textifier Textifier

Introduction

In this page you can find the example usage for org.objectweb.asm.util Textifier Textifier.

Prototype

public Textifier() 

Source Link

Document

Constructs a new Textifier .

Usage

From source file:ch.raffael.contracts.devtools.browser.BrowserPanel.java

License:Apache License

private void updateSource() {
    if (tree.getSelectionPath() == null) {
        asmSource.setText("");
        reloadClassAction.setEnabled(false);
        return;//from   ww  w  .  ja  v a  2  s  . c o m
    }
    BrowserTreeNode node = (BrowserTreeNode) tree.getSelectionPath().getLastPathComponent();
    if (node.getKind() != BrowserTreeNode.Kind.CLASS) {
        asmSource.setText("");
        reloadClassAction.setEnabled(false);
    } else {
        boolean indent = false;
        reloadClassAction.setEnabled(true);
        StringWriter string = new StringWriter();
        try (InputStream in = new BufferedInputStream(Files.newInputStream(node.getPath()));
                PrintWriter out = new PrintWriter(string)) {
            ASMifier printer = new ASMifier();
            ClassReader reader = new ClassReader(in);
            TraceClassVisitor tracer;
            if (sourceStyle.getSelectedItem() != null && sourceStyle.getSelectedItem().equals("Bytecode")) {
                tracer = new TraceClassVisitor(null, new Textifier(), out);
            } else {
                tracer = new TraceClassVisitor(null, new ASMifier(), out);
                indent = true;
            }
            reader.accept(tracer, 0);
        } catch (IOException e) {
            this.context.require(ErrorDisplayer.class).displayError(root, e);
        }
        if (indent) {
            StringBuilder buf = new StringBuilder();
            int d = 0;
            for (String line : string.toString().split("\\n\\r?|\\r")) {
                if (line.equals("}")) {
                    d--;
                }
                for (int i = 0; i < d; i++) {
                    buf.append("  ");
                }
                buf.append(line).append('\n');
                if (line.equals("{")) {
                    d++;
                }
            }
            asmSource.setText(buf.toString());
        } else {
            asmSource.setText(string.toString());
        }
        asmSource.setSelectionStart(0);
        asmSource.setSelectionEnd(0);
    }
}

From source file:co.paralleluniverse.fibers.instrument.Retransform.java

License:Open Source License

public static void dumpClass(String className, byte[] data) {
    System.out.println("DUMP OF CLASS: " + className);
    ClassReader cr = new ClassReader(data);
    ClassVisitor cv = new TraceClassVisitor(null, new Textifier(), new PrintWriter(System.out));
    cr.accept(cv, ClassReader.SKIP_FRAMES);
    System.out.println("=================");
}

From source file:com.android.build.gradle.internal.incremental.ByteCodeUtils.java

License:Apache License

/**
 * Converts the given method to a String.
 *//*from  w  ww .  j a v  a  2s. com*/
public static String textify(@NonNull MethodNode method) {
    Textifier textifier = new Textifier();
    TraceMethodVisitor trace = new TraceMethodVisitor(textifier);
    method.accept(trace);
    String ret = "";
    for (Object line : textifier.getText()) {
        ret += line;
    }
    return ret;
}

From source file:com.facebook.buck.jvm.java.JarDumper.java

License:Apache License

private Stream<String> dumpClassFile(InputStream stream) throws IOException {
    byte[] textifiedClass;
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); PrintWriter pw = new PrintWriter(bos)) { // NOPMD required by API
        ClassReader reader = new ClassReader(stream);
        TraceClassVisitor traceVisitor = new TraceClassVisitor(null, new Textifier(), pw);
        reader.accept(traceVisitor, asmFlags);
        textifiedClass = bos.toByteArray();
    }//from   w  w w.j a  va 2s.com

    try (InputStreamReader streamReader = new InputStreamReader(new ByteArrayInputStream(textifiedClass))) {
        return CharStreams.readLines(streamReader).stream();
    }
}

From source file:com.facebook.presto.bytecode.ClassGenerator.java

License:Apache License

public Map<String, Class<?>> defineClasses(List<ClassDefinition> classDefinitions) {
    ClassInfoLoader classInfoLoader = createClassInfoLoader(classDefinitions, classLoader);
    Map<String, byte[]> bytecodes = new LinkedHashMap<>();

    for (ClassDefinition classDefinition : classDefinitions) {
        ClassWriter writer = new SmartClassWriter(classInfoLoader);

        try {//from  www . ja va  2  s.  com
            classDefinition.visit(fakeLineNumbers ? new AddFakeLineNumberClassVisitor(writer) : writer);
        } catch (IndexOutOfBoundsException | NegativeArraySizeException e) {
            StringWriter out = new StringWriter();
            classDefinition.visit(new TraceClassVisitor(null, new Textifier(), new PrintWriter(out)));
            throw new IllegalArgumentException("Error processing class definition:\n" + out, e);
        }

        byte[] bytecode;
        try {
            bytecode = writer.toByteArray();
        } catch (RuntimeException e) {
            throw new CompilationException("Error compiling class: " + classDefinition.getName(), e);
        }

        bytecodes.put(classDefinition.getType().getJavaClassName(), bytecode);

        if (runAsmVerifier) {
            ClassReader reader = new ClassReader(bytecode);
            CheckClassAdapter.verify(reader, classLoader, true, new PrintWriter(output));
        }
    }

    dumpClassPath.ifPresent(path -> bytecodes.forEach((className, bytecode) -> {
        String name = typeFromJavaClassName(className).getClassName() + ".class";
        Path file = path.resolve(name).toAbsolutePath();
        try {
            createDirectories(file.getParent());
            Files.write(file, bytecode);
        } catch (IOException e) {
            throw new UncheckedIOException("Failed to write generated class file: " + file, e);
        }
    }));

    if (dumpRawBytecode) {
        for (byte[] bytecode : bytecodes.values()) {
            ClassReader classReader = new ClassReader(bytecode);
            classReader.accept(new TraceClassVisitor(new PrintWriter(output)), ClassReader.EXPAND_FRAMES);
        }
    }

    Map<String, Class<?>> classes = classLoader.defineClasses(bytecodes);

    try {
        for (Class<?> clazz : classes.values()) {
            Reflection.initialize(clazz);
        }
    } catch (VerifyError e) {
        throw new RuntimeException(e);
    }

    return classes;
}

From source file:com.facebook.presto.bytecode.CompilerUtils.java

License:Apache License

private static Map<String, Class<?>> defineClasses(List<ClassDefinition> classDefinitions,
        DynamicClassLoader classLoader) {
    ClassInfoLoader classInfoLoader = ClassInfoLoader.createClassInfoLoader(classDefinitions, classLoader);

    if (DUMP_BYTE_CODE_TREE) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        DumpBytecodeVisitor dumpBytecode = new DumpBytecodeVisitor(new PrintStream(out));
        for (ClassDefinition classDefinition : classDefinitions) {
            dumpBytecode.visitClass(classDefinition);
        }/*from   w w  w.j  a  v  a2  s  .  c  o m*/
        System.out.println(new String(out.toByteArray(), StandardCharsets.UTF_8));
    }

    Map<String, byte[]> bytecodes = new LinkedHashMap<>();
    for (ClassDefinition classDefinition : classDefinitions) {
        ClassWriter cw = new SmartClassWriter(classInfoLoader);
        try {
            classDefinition.visit(ADD_FAKE_LINE_NUMBER ? new AddFakeLineNumberClassVisitor(cw) : cw);
        } catch (IndexOutOfBoundsException e) {
            Printer printer = new Textifier();
            StringWriter stringWriter = new StringWriter();
            TraceClassVisitor tcv = new TraceClassVisitor(null, printer, new PrintWriter(stringWriter));
            classDefinition.visit(tcv);
            throw new IllegalArgumentException("An error occurred while processing classDefinition:"
                    + System.lineSeparator() + stringWriter.toString(), e);
        }
        try {
            byte[] bytecode = cw.toByteArray();
            if (RUN_ASM_VERIFIER) {
                ClassReader reader = new ClassReader(bytecode);
                CheckClassAdapter.verify(reader, classLoader, true, new PrintWriter(System.out));
            }
            bytecodes.put(classDefinition.getType().getJavaClassName(), bytecode);
        } catch (RuntimeException e) {
            throw new CompilationException("Error compiling class " + classDefinition.getName(), e);
        }
    }

    String dumpClassPath = DUMP_CLASS_FILES_TO.get();
    if (dumpClassPath != null) {
        for (Map.Entry<String, byte[]> entry : bytecodes.entrySet()) {
            File file = new File(dumpClassPath,
                    ParameterizedType.typeFromJavaClassName(entry.getKey()).getClassName() + ".class");
            try {
                log.debug("ClassFile: " + file.getAbsolutePath());
                Files.createParentDirs(file);
                Files.write(entry.getValue(), file);
            } catch (IOException e) {
                log.error(e, "Failed to write generated class file to: %s" + file.getAbsolutePath());
            }
        }
    }
    if (DUMP_BYTE_CODE_RAW) {
        for (byte[] bytecode : bytecodes.values()) {
            ClassReader classReader = new ClassReader(bytecode);
            classReader.accept(new TraceClassVisitor(new PrintWriter(System.err)), ClassReader.EXPAND_FRAMES);
        }
    }
    Map<String, Class<?>> classes = classLoader.defineClasses(bytecodes);
    try {
        for (Class<?> clazz : classes.values()) {
            Reflection.initialize(clazz);
        }
    } catch (VerifyError e) {
        throw new RuntimeException(e);
    }
    return classes;
}

From source file:com.github.anba.es6draft.compiler.assembler.Code.java

License:Open Source License

/**
 * Returns the decompiled byte code.//  w  w w. j av  a  2s .c  om
 * 
 * @param bytes
 *            the class byte code
 * @param simpleTypes
 *            {@code true} to use simple type representation
 * @return the decompiled byte code
 */
public static String toByteCode(byte[] bytes, boolean simpleTypes) {
    Printer p = simpleTypes ? new SimpleTypeTextifier() : new Textifier();
    return toByteCode(new TraceClassVisitor(null, p, null), p, bytes);
}

From source file:com.google.devtools.build.java.turbine.javac.AbstractJavacTurbineCompilationTest.java

License:Open Source License

static String textify(byte[] bytes) {
    StringWriter sw = new StringWriter();
    ClassReader cr = new ClassReader(bytes);
    cr.accept(new TraceClassVisitor(null, new Textifier(), new PrintWriter(sw, true)), 0);
    return sw.toString();
}

From source file:com.google.template.soy.jbcsrc.ClassData.java

License:Apache License

@Override
public String toString() {
    StringWriter sw = new StringWriter();
    new ClassReader(data).accept(new TraceClassVisitor(null, new Textifier(), new PrintWriter(sw)), 0);
    return sw.toString();
}

From source file:com.googlecode.dex2jar.test.TestUtils.java

License:Apache License

static void printAnalyzerResult(MethodNode method, Analyzer a, final PrintWriter pw)
        throws IllegalArgumentException, IllegalAccessException {
    Frame[] frames = a.getFrames();
    Textifier t = new Textifier();
    TraceMethodVisitor mv = new TraceMethodVisitor(t);
    String format = "%05d %-" + (method.maxStack + method.maxLocals + 6) + "s|%s";
    for (int j = 0; j < method.instructions.size(); ++j) {
        method.instructions.get(j).accept(mv);

        StringBuffer s = new StringBuffer();
        Frame f = frames[j];/*from w  w  w.  j  a v a 2 s .  c  om*/
        if (f == null) {
            s.append('?');
        } else {
            for (int k = 0; k < f.getLocals(); ++k) {
                s.append(getShortName(f.getLocal(k).toString()));
            }
            s.append(" : ");
            for (int k = 0; k < f.getStackSize(); ++k) {
                s.append(getShortName(f.getStack(k).toString()));
            }
        }
        pw.printf(format, j, s, buf.get(t)); // mv.text.get(j));
    }
    for (int j = 0; j < method.tryCatchBlocks.size(); ++j) {
        ((TryCatchBlockNode) method.tryCatchBlocks.get(j)).accept(mv);
        pw.print(" " + buf.get(t));
    }
    pw.println();
    pw.flush();
}