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

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

Introduction

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

Prototype

public TraceClassVisitor(final ClassVisitor classVisitor, final Printer printer,
        final PrintWriter printWriter) 

Source Link

Document

Constructs a new TraceClassVisitor .

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;// ww w  . java2  s .  co  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:ch.sourcepond.utils.podescoin.devel.PrintASMInstructions.java

License:Apache License

@Test
public void printInstructions() throws Exception {
    final ClassReader reader = new ClassReader(WriteInjectorMethodClass.class.getName());
    final ClassVisitor visitor = new PrintClassVisitor(
            new TraceClassVisitor(null, new ASMifier(), new PrintWriter(System.out)));
    reader.accept(visitor, ClassReader.SKIP_DEBUG);
}

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.tasks.fd.InjectBootstrapApplicationTaskTest.java

License:Apache License

private static String asmify(File expected) throws IOException {
    ClassReader reader = new ClassReader(new FileInputStream(expected));
    StringWriter writer = new StringWriter();
    try (PrintWriter printWriter = new PrintWriter(writer)) {
        reader.accept(new TraceClassVisitor(null, new ASMifier(), printWriter), 0);
    }//from  ww w.  j a  v  a2s  . c  om
    return writer.toString();
}

From source file:com.costlowcorp.eriktools.jardetails.JarNavigationController.java

private void readClass(String filename) {
    try (JarFile jar = new JarFile(this.file)) {
        final JarEntry entry = jar.getJarEntry(filename);
        final ClassNode node = new ClassNode(ASM5);
        final InputStream in = jar.getInputStream(entry);
        final ClassReader reader = new ClassReader(in);
        //reader.accept(node, ClassReader.EXPAND_FRAMES);

        final Printer asmifier = new ASMifier();
        //final InputStream in2 = jar.getInputStream(entry);
        final ByteArrayOutputStream bout = new ByteArrayOutputStream();

        final TraceClassVisitor tracer = new TraceClassVisitor(node, asmifier, new PrintWriter(bout));
        reader.accept(tracer, ClassReader.EXPAND_FRAMES);
        final String className = filename.replace('/', '.').substring(0, filename.length() - ".class".length());
        final String javap = JavaPGrabber.INSTANCE.run(file.toPath(), className);
        Platform.runLater(() -> {//from   ww  w .  j a  v  a2 s.  c o m
            classDetails.populateClassSummary(node.name, filename, node.sourceFile, node.version,
                    node.superName, node.interfaces);
            classDetails.populateAsmifierTab(bout.toString());
            classDetails.populateJavaPTab(javap);
        });
    } catch (IOException ex) {
        Logger.getLogger(JarNavigationController.class.getName()).log(Level.SEVERE, null, ex);
    }

}

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  v a 2  s  .co  m

    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 w  w w  .  j ava 2s .  c  om
            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 ava 2s.  co  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.gargoylesoftware.js.nashorn.internal.codegen.ClassEmitter.java

License:Open Source License

/**
 * Disassemble an array of byte code./*from w ww  . j a  va  2s. c  o  m*/
 *
 * @param bytecode  byte array representing bytecode
 *
 * @return disassembly as human readable string
 */
static String disassemble(final byte[] bytecode) {
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (final PrintWriter pw = new PrintWriter(baos)) {
        final NashornClassReader cr = new NashornClassReader(bytecode);
        final Context ctx = AccessController.doPrivileged(new PrivilegedAction<Context>() {
            @Override
            public Context run() {
                return Context.getContext();
            }
        });
        final TraceClassVisitor tcv = new TraceClassVisitor(null, new NashornTextifier(ctx.getEnv(), cr), pw);
        cr.accept(tcv, 0);
    }

    final String str = new String(baos.toByteArray());
    return str;
}

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

License:Open Source License

/**
 * Returns the decompiled byte code.// ww w .j a  v a 2s .  com
 * 
 * @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);
}