Example usage for org.objectweb.asm ClassWriter COMPUTE_FRAMES

List of usage examples for org.objectweb.asm ClassWriter COMPUTE_FRAMES

Introduction

In this page you can find the example usage for org.objectweb.asm ClassWriter COMPUTE_FRAMES.

Prototype

int COMPUTE_FRAMES

To view the source code for org.objectweb.asm ClassWriter COMPUTE_FRAMES.

Click Source Link

Document

A flag to automatically compute the stack map frames of methods from scratch.

Usage

From source file:Test1.java

License:Apache License

private static void implementInterface(ClassNode cn) throws Exception {

    // MethodNode fromMethod = new MethodNode(ACC_PUBLIC, "fromData",
    // "(Ljava/io/DataInput;)V", null, new String[] {
    // "java/io/IOException",
    // "java/lang/ClassNotFoundException" });
    // mv = cw.visitMethod(ACC_PUBLIC, "toData", "(Ljava/io/DataOutput;)V",
    // null, new String[] { "java/io/IOException" });
    MethodNode toMethod = new MethodNode(ACC_PUBLIC, "toData", "(Ljava/io/DataOutput;)V", null,
            new String[] { "java/io/IOException" });
    InsnList instToMethod = toMethod.instructions;
    for (int i = 0; i < cn.fields.size(); i++) {
        FieldNode fn = (FieldNode) cn.fields.get(i);
        toMethod(cn.name, fn, instToMethod);
    }//from   w w w.jav a  2 s.co m
    instToMethod.add(new InsnNode(RETURN));
    cn.methods.add(toMethod);

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    cn.accept(cw);
    byte[] bt = cw.toByteArray();

    ClassReader cr = new ClassReader(bt);
    CheckClassAdapter ca = new CheckClassAdapter(cw);
    FileOutputStream fo = new FileOutputStream("d:/x1.log");
    PrintWriter pw = new PrintWriter(fo);
    ca.verify(cr, true, pw);

    ByteArrayClassLoader bacl = new ByteArrayClassLoader(bt);

    Class cls = bacl.loadClass("ynd.test.Ac01");
    DataSerializable di = (DataSerializable) cls.newInstance();
    di.toData(null);
}

From source file:allout58.mods.techtree.asm.TechTreeModClassTransformer.java

License:Open Source License

private byte[] apply(byte[] bytes, String name, int id) {
    Preconditions.checkNotNull(bytes);/*w  ww. jav  a  2 s .co m*/
    ClassReader reader = new ClassReader(bytes);
    ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES);
    ClassVisitor visitor = null;

    switch (id) {
    case 0:
        visitor = new CraftingContainerVisitor(name, writer);
        break;
    case 1:
        visitor = new CraftingPlayerVisitor(name, writer);
        break;
    }
    try {
        if (visitor != null)
            reader.accept(visitor, 0);
        return writer.toByteArray();
    } catch (Exception e) {
        FMLRelaunchLog.severe("Error transforming %s: %s", name, e);
        return bytes;
    }
}

From source file:analysis.RuntimeTemplateGenerator.java

License:Open Source License

public JarClasses generateTemplate() {
    ClassReader classReader;/*from   ww w  . j  a  v  a2s  .c  o  m*/
    ClassVisitor classVisitor;
    ClassWriter classWriter;

    Map<String, JarClasses.Entry> entries = new HashMap<String, JarClasses.Entry>();

    for (ClassReference ref : references) {
        classReader = classes.get(ref.getName());

        classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
        classVisitor = getClassTransformer(ref, classWriter);

        classReader.accept(classVisitor, ClassReader.SKIP_FRAMES);

        entries.put(ref.getName(), new JarClasses.Entry(classWriter.toByteArray(), ref.getName()));
    }

    return new JarClasses(entries);
}

From source file:asmlib.UninitializedCallChecker.java

License:Open Source License

public static void verify(ClassReader cr, PrintWriter pw) {
    // O AnalyzerAdapter
    // precisa que as frames estejam delimitadas no cdigo para funcionar correctamente.
    // Frames parecem ser obrigatrias a partir do Java 6, mas muitas classes no as tm
    // por isso fazemos mais um pass com um ClassWriter, para obtermos uma classe com
    // as frames calculadas.
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    cr.accept(cw, 0);// ww  w.  ja v  a  2 s .c  o m
    cr = new ClassReader(cw.toByteArray());

    try {
        cr.accept(new GenericMethodVisitorAdapter(new EmptyClassVisitor(), UninitializedCallChecker.class,
                cr.getClassName(), pw), ClassReader.EXPAND_FRAMES);
    } catch (ArrayIndexOutOfBoundsException e) {
    }
}

From source file:blue.origami.asm.OClassWriter.java

License:Apache License

OClassWriter(OClassDecl cdecl) {
    super(ClassWriter.COMPUTE_FRAMES);
    // super(ClassWriter.COMPUTE_MAXS);
    this.cname = cdecl.getName().replace(".", "/");
    Type superType = cdecl.getSupertype().asmType();
    String[] inames = null;/*from  w w w .j a  v a 2 s. c o m*/
    OType[] inf = cdecl.getInterfaces();
    if (inf.length > 0) {
        inames = new String[inf.length];
        map(inf, inames, t -> t.asmType().getInternalName());
    }
    this.visit(V1_8, cdecl.getAnno().acc(), this.cname, cdecl.getSignature(), superType.getInternalName(),
            inames);
    this.visitSource(cdecl.getSourceName(), null);
    this.cdecl = cdecl;
}

From source file:blusunrize.immersiveengineering.common.asm.IEClassTransformer.java

@Override
public byte[] transform(String name, String transformedName, byte[] basicClass) {
    if (basicClass != null && transformerMap.containsKey(transformedName)) {
        MethodTransformer[] transformers = transformerMap.get(transformedName);
        ClassReader reader = new ClassReader(basicClass);
        ClassNode node = new ClassNode();
        reader.accept(node, 0);// w  ww.  ja va 2s. c o  m

        for (MethodNode method : node.methods)
            for (MethodTransformer methodTransformer : transformers)
                if ((methodTransformer.functionName.equals(method.name)
                        || methodTransformer.srgName.equals(method.name))
                        && methodTransformer.functionDesc.equals(method.desc))
                    methodTransformer.function.accept(method);

        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
        node.accept(writer);
        return writer.toByteArray();
    }
    return basicClass;
}

From source file:boilerplate.processor.BinaryProcessor.java

License:Open Source License

public void processBinary(Binary binary) throws IOException {
    String type = binary.getClassName();
    type = type.replace('.', '/');
    byte[] data = binary.loadBytes();

    ClassReader reader = new ClassReader(data);
    ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES);

    ClassVisitor visitor = writer;/*from  ww w.ja  v  a2 s .c  om*/
    visitor = new CheckClassAdapter(visitor);
    // visitor = new TraceClassVisitor(visitor, new
    // PrintWriter(System.out));
    visitor = new ToStringAdapter(logger, type, visitor);
    visitor = new EqualsAdapter(logger, type, visitor);

    reader.accept(visitor, 0);

    data = writer.toByteArray();
    binary.saveBytes(data);
}

From source file:br.ufpr.gres.core.MutationTest.java

License:Apache License

public Mutant getMutation(final MutationIdentifier id, byte[] classToMutate) {
    Collection<IMutationOperator> mutators = MUTATORS.stream().collect(Collectors.toList());
    Collection<IMutationOperator> mutatorsFiltered = mutators.stream()
            .filter(p -> id.getMutator().equals(p.getName())).collect(Collectors.toList());

    final ClassContext context = new ClassContext();
    context.setTargetMutation(id);// w  w w  . j a  v a 2 s  . c  om

    // Lembrar de usar isso aqui (ClassPathByteArraySource - pitest)
    // GregorMutater... carregar os bytes
    //        final Optional<byte[]> bytes = this.byteSource.getBytes(id.getClassName()
    //                .asJavaName());
    //final PremutationClassInfo classInfo = performPreScan(classToMutate);
    final ClassReader reader = new ClassReader(classToMutate);
    final ClassWriter w = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);

    final MutatingClassVisitor mca = new MutatingClassVisitor(mutatorsFiltered, context, w);
    reader.accept(mca, ClassReader.EXPAND_FRAMES);

    final List<MutationDetails> details = context.getCollectedMutations();

    return new Mutant(details.stream().filter(p -> p.getId().equals(id)).findFirst().get(), w.toByteArray());
}

From source file:br.ufpr.gres.core.MutationTest.java

License:Apache License

public Mutant getHigherOrderMutant(final ArrayList<MutationIdentifier> ids, byte[] classToMutate) {
    Collection<IMutationOperator> mutators = MUTATORS.stream().collect(Collectors.toList());
    //Collection<IMutationOperator> mutatorsFiltered = mutators.stream().filter(p ->.getMutator().equals(p.getName())).collect(Collectors.toList());

    final ClassContext context = new ClassContext();
    context.setTargetMutation(ids);//  w  w w . jav  a 2  s  .co m

    // Lembrar de usar isso aqui (ClassPathByteArraySource - pitest)
    // GregorMutater... carregar os bytes
    //        final Optional<byte[]> bytes = this.byteSource.getBytes(id.getClassName()
    //                .asJavaName());
    //final PremutationClassInfo classInfo = performPreScan(classToMutate);
    final ClassReader reader = new ClassReader(classToMutate);
    final ClassWriter w = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);

    final MutatingClassVisitor mca = new MutatingClassVisitor(mutators, context, w);
    reader.accept(mca, ClassReader.EXPAND_FRAMES);

    List<MutationDetails> details = new ArrayList<>();

    for (MutationDetails detail : context.getCollectedMutations()) {
        if (ids.stream().anyMatch(p -> p.equals(detail.getId()))) {
            details.add(detail);
        }
    }

    return new Mutant(details, w.toByteArray());
}

From source file:br.ufpr.gres.core.Mutator.java

License:Apache License

public static Mutant getMutation(Collection<IMutationOperator> mutators, ArrayList<MutationIdentifier> ids,
        byte[] classToMutate) {
    final ClassContext context = new ClassContext();
    context.setTargetMutation(ids);// www  .  ja v  a  2  s.  c  om
    final ClassReader reader = new ClassReader(classToMutate);
    final ClassWriter w = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);

    final MutatingClassVisitor mca = new MutatingClassVisitor(mutators, context, w);
    reader.accept(mca, ClassReader.EXPAND_FRAMES);

    List<MutationDetails> details = new ArrayList<>();

    for (MutationDetails detail : context.getCollectedMutations()) {
        if (ids.stream().anyMatch(p -> p.equals(detail.getId()))) {
            details.add(detail);
        }
    }

    return new Mutant(details, w.toByteArray());
}