Search in sources :

Example 6 with Textifier

use of org.objectweb.asm.util.Textifier in project drill by apache.

the class ReplaceMethodInvoke method main.

// private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ReplaceMethodInvoke.class);
public static void main(String[] args) throws Exception {
    final String k2 = "org/apache/drill/Pickle.class";
    final URL url = Resources.getResource(k2);
    final byte[] clazz = Resources.toByteArray(url);
    final ClassReader cr = new ClassReader(clazz);
    final ClassWriter cw = writer();
    final TraceClassVisitor visitor = new TraceClassVisitor(cw, new Textifier(), new PrintWriter(System.out));
    final ValueHolderReplacementVisitor v2 = new ValueHolderReplacementVisitor(visitor, true);
    // | ClassReader.SKIP_DEBUG);
    cr.accept(v2, ClassReader.EXPAND_FRAMES);
    final byte[] output = cw.toByteArray();
    Files.write(output, new File("/src/scratch/bytes/S.class"));
    check(output);
    final DrillConfig c = DrillConfig.forClient();
    final SystemOptionManager m = new SystemOptionManager(PhysicalPlanReaderTestFactory.defaultLogicalPlanPersistence(c), new LocalPersistentStoreProvider(c), c);
    m.init();
    try (QueryClassLoader ql = new QueryClassLoader(DrillConfig.create(), m)) {
        ql.injectByteCode("org.apache.drill.Pickle$OutgoingBatch", output);
        Class<?> clz = ql.loadClass("org.apache.drill.Pickle$OutgoingBatch");
        clz.getMethod("x").invoke(null);
    }
}
Also used : LocalPersistentStoreProvider(org.apache.drill.exec.store.sys.store.provider.LocalPersistentStoreProvider) SystemOptionManager(org.apache.drill.exec.server.options.SystemOptionManager) Textifier(org.objectweb.asm.util.Textifier) URL(java.net.URL) ClassWriter(org.objectweb.asm.ClassWriter) QueryClassLoader(org.apache.drill.exec.compile.QueryClassLoader) TraceClassVisitor(org.objectweb.asm.util.TraceClassVisitor) DrillConfig(org.apache.drill.common.config.DrillConfig) ClassReader(org.objectweb.asm.ClassReader) File(java.io.File) PrintWriter(java.io.PrintWriter)

Example 7 with Textifier

use of org.objectweb.asm.util.Textifier in project presto by prestodb.

the class ClassGenerator method defineClasses.

public Map<String, Class<?>> defineClasses(List<ClassDefinition> classDefinitions) {
    ClassInfoLoader classInfoLoader = createClassInfoLoader(classDefinitions, classLoader);
    Map<String, byte[]> bytecodes = new LinkedHashMap<>();
    for (ClassDefinition classDefinition : classDefinitions) {
        // We call the simpler class writer first to get any errors out using simpler setting.
        // This helps when we have large queries that can potentially cause COMPUTE_FRAMES
        // (used by SmartClassWriter for doing more thorough analysis)
        ClassWriter simpleClassWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classDefinition.visit(simpleClassWriter);
        try {
            simpleClassWriter.toByteArray();
        } catch (ClassTooLargeException | MethodTooLargeException largeCodeException) {
            throw new ByteCodeTooLargeException(largeCodeException);
        } catch (RuntimeException e) {
            throw new CompilationException("Error compiling class: " + classDefinition.getName(), e);
        }
        ClassWriter writer = new SmartClassWriter(classInfoLoader);
        try {
            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 (ClassTooLargeException | MethodTooLargeException largeCodeException) {
            throw new ByteCodeTooLargeException(largeCodeException);
        } 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;
}
Also used : ClassWriter(org.objectweb.asm.ClassWriter) MethodHandle(java.lang.invoke.MethodHandle) CharStreams.nullWriter(com.google.common.io.CharStreams.nullWriter) LinkedHashMap(java.util.LinkedHashMap) ImmutableList(com.google.common.collect.ImmutableList) ParameterizedType.typeFromJavaClassName(com.facebook.presto.bytecode.ParameterizedType.typeFromJavaClassName) Map(java.util.Map) Objects.requireNonNull(java.util.Objects.requireNonNull) MethodTooLargeException(org.objectweb.asm.MethodTooLargeException) Path(java.nio.file.Path) TraceClassVisitor(org.objectweb.asm.util.TraceClassVisitor) PrintWriter(java.io.PrintWriter) ImmutableMap(com.google.common.collect.ImmutableMap) Files(java.nio.file.Files) StringWriter(java.io.StringWriter) Reflection(com.google.common.reflect.Reflection) IOException(java.io.IOException) Iterables.getOnlyElement(com.google.common.collect.Iterables.getOnlyElement) CheckClassAdapter(org.objectweb.asm.util.CheckClassAdapter) Files.createDirectories(java.nio.file.Files.createDirectories) ClassInfoLoader.createClassInfoLoader(com.facebook.presto.bytecode.ClassInfoLoader.createClassInfoLoader) UncheckedIOException(java.io.UncheckedIOException) List(java.util.List) ClassReader(org.objectweb.asm.ClassReader) Writer(java.io.Writer) Optional(java.util.Optional) ClassTooLargeException(org.objectweb.asm.ClassTooLargeException) Textifier(org.objectweb.asm.util.Textifier) UncheckedIOException(java.io.UncheckedIOException) Textifier(org.objectweb.asm.util.Textifier) LinkedHashMap(java.util.LinkedHashMap) ClassInfoLoader.createClassInfoLoader(com.facebook.presto.bytecode.ClassInfoLoader.createClassInfoLoader) TraceClassVisitor(org.objectweb.asm.util.TraceClassVisitor) StringWriter(java.io.StringWriter) MethodTooLargeException(org.objectweb.asm.MethodTooLargeException) PrintWriter(java.io.PrintWriter) Path(java.nio.file.Path) IOException(java.io.IOException) UncheckedIOException(java.io.UncheckedIOException) ClassWriter(org.objectweb.asm.ClassWriter) ClassTooLargeException(org.objectweb.asm.ClassTooLargeException) ClassReader(org.objectweb.asm.ClassReader)

Example 8 with Textifier

use of org.objectweb.asm.util.Textifier in project CodeChickenLib by Chicken-Bones.

the class ASMHelper method dump.

public static void dump(Acceptor acceptor, File file, boolean filterImportant, boolean sortLocals, boolean textify) {
    try {
        if (!file.getParentFile().exists())
            file.getParentFile().mkdirs();
        if (!file.exists())
            file.createNewFile();
        PrintWriter pout = new PrintWriter(file);
        ClassVisitor cv = new TraceClassVisitor(null, textify ? new Textifier() : new ASMifier(), pout);
        if (filterImportant)
            cv = new ImportantInsnVisitor(cv);
        if (sortLocals)
            cv = new LocalVariablesSorterVisitor(cv);
        acceptor.accept(cv);
        pout.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
Also used : ASMifier(org.objectweb.asm.util.ASMifier) TraceClassVisitor(org.objectweb.asm.util.TraceClassVisitor) TraceClassVisitor(org.objectweb.asm.util.TraceClassVisitor) ClassVisitor(org.objectweb.asm.ClassVisitor) IOException(java.io.IOException) Textifier(org.objectweb.asm.util.Textifier) PrintWriter(java.io.PrintWriter)

Example 9 with Textifier

use of org.objectweb.asm.util.Textifier in project CodeChickenLib by Chicken-Bones.

the class InsnListSection method toString.

public String toString() {
    Textifier t = new Textifier();
    accept(new TraceMethodVisitor(t));
    StringWriter sw = new StringWriter();
    t.print(new PrintWriter(sw));
    return sw.toString();
}
Also used : StringWriter(java.io.StringWriter) Textifier(org.objectweb.asm.util.Textifier) TraceMethodVisitor(org.objectweb.asm.util.TraceMethodVisitor) PrintWriter(java.io.PrintWriter)

Example 10 with Textifier

use of org.objectweb.asm.util.Textifier in project neo4j by neo4j.

the class ByteCodeVerifier method detailedMessage.

private static String detailedMessage(String errorMessage, MethodNode method, Frame[] frames, AbstractInsnNode errorLocation) {
    StringWriter message = new StringWriter();
    try (PrintWriter out = new PrintWriter(message)) {
        List<Integer> localLengths = new ArrayList<>();
        List<Integer> stackLengths = new ArrayList<>();
        for (Frame frame : frames) {
            if (frame != null) {
                for (int i = 0; i < frame.getLocals(); i++) {
                    insert(i, frame.getLocal(i), localLengths);
                }
                for (int i = 0; i < frame.getStackSize(); i++) {
                    insert(i, frame.getStack(i), stackLengths);
                }
            }
        }
        Textifier formatted = new Textifier();
        TraceMethodVisitor mv = new TraceMethodVisitor(formatted);
        out.println(errorMessage);
        out.append("\t\tin ").append(method.name).append(method.desc).println();
        for (int i = 0; i < method.instructions.size(); i++) {
            AbstractInsnNode insn = method.instructions.get(i);
            insn.accept(mv);
            Frame frame = frames[i];
            out.append("\t\t");
            out.append(insn == errorLocation ? ">>> " : "    ");
            out.format("%05d [", i);
            if (frame == null) {
                padding(out, localLengths.listIterator(), '?');
                out.append(" : ");
                padding(out, stackLengths.listIterator(), '?');
            } else {
                emit(out, localLengths, frame::getLocal, frame.getLocals());
                padding(out, localLengths.listIterator(frame.getLocals()), '-');
                out.append(" : ");
                emit(out, stackLengths, frame::getStack, frame.getStackSize());
                padding(out, stackLengths.listIterator(frame.getStackSize()), ' ');
            }
            out.print("] : ");
            out.print(formatted.text.get(formatted.text.size() - 1));
        }
        for (int j = 0; j < method.tryCatchBlocks.size(); j++) {
            method.tryCatchBlocks.get(j).accept(mv);
            out.print(" " + formatted.text.get(formatted.text.size() - 1));
        }
    }
    return message.toString();
}
Also used : Frame(org.objectweb.asm.tree.analysis.Frame) StringWriter(java.io.StringWriter) ArrayList(java.util.ArrayList) Textifier(org.objectweb.asm.util.Textifier) AbstractInsnNode(org.objectweb.asm.tree.AbstractInsnNode) TraceMethodVisitor(org.objectweb.asm.util.TraceMethodVisitor) PrintWriter(java.io.PrintWriter)

Aggregations

Textifier (org.objectweb.asm.util.Textifier)32 PrintWriter (java.io.PrintWriter)15 StringWriter (java.io.StringWriter)10 TraceClassVisitor (org.objectweb.asm.util.TraceClassVisitor)10 ClassReader (org.objectweb.asm.ClassReader)8 TraceMethodVisitor (org.objectweb.asm.util.TraceMethodVisitor)8 IOException (java.io.IOException)5 ClassWriter (org.objectweb.asm.ClassWriter)4 File (java.io.File)3 ClassVisitor (org.objectweb.asm.ClassVisitor)3 URL (java.net.URL)2 ArrayList (java.util.ArrayList)2 LinkedHashMap (java.util.LinkedHashMap)2 List (java.util.List)2 Map (java.util.Map)2 DrillConfig (org.apache.drill.common.config.DrillConfig)2 QueryClassLoader (org.apache.drill.exec.compile.QueryClassLoader)2 SystemOptionManager (org.apache.drill.exec.server.options.SystemOptionManager)2 LocalPersistentStoreProvider (org.apache.drill.exec.store.sys.store.provider.LocalPersistentStoreProvider)2 AbstractInsnNode (org.objectweb.asm.tree.AbstractInsnNode)2