List of usage examples for org.objectweb.asm.util Textifier Textifier
public Textifier()
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(); }