Example usage for org.objectweb.asm ClassVisitor visitEnd

List of usage examples for org.objectweb.asm ClassVisitor visitEnd

Introduction

In this page you can find the example usage for org.objectweb.asm ClassVisitor visitEnd.

Prototype

public void visitEnd() 

Source Link

Document

Visits the end of the class.

Usage

From source file:org.springframework.migrationanalyzer.contributions.bytecode.DelegatingClassVisitor.java

License:Apache License

@Override
public void visitEnd() {
    for (ClassVisitor delegate : this.delegates) {
        delegate.visitEnd();
    }
}

From source file:org.teavm.flavour.regex.bytecode.MatcherClassBuilder.java

License:Apache License

public byte[] build(String className, Dfa dfa) {
    dfa = reorder(dfa, getOrdering(dfa));

    className = className.replace('.', '/');
    this.className = className;
    ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    ClassVisitor cv = writer;
    cv.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object",
            new String[] { Type.getInternalName(Matcher.class) });

    cv.visitField(Opcodes.ACC_PRIVATE, "state", "I", null, null).visitEnd();
    cv.visitField(Opcodes.ACC_PRIVATE, "domain", "I", null, null).visitEnd();
    cv.visitField(Opcodes.ACC_PRIVATE, "index", "I", null, null).visitEnd();

    buildConstructor(cv, className);/*from   w w w  .ja  v a 2  s . c o  m*/
    buildValidMethod(cv, className);
    buildDomainMethod(cv, className);
    buildIndexMethod(cv, className);
    buildRestartMethod(cv, className);
    buildForkMethod(cv, className);
    buildEndMethod(cv, className, dfa);
    buildWorkerMethod(cv, className, dfa);

    cv.visitEnd();

    byte[] result = writer.toByteArray();
    return result;
}

From source file:rubah.bytecode.transformers.ProxyGenerator.java

License:Open Source License

public byte[] generateProxy(String name) {
    final String proxyName = name.replace('.', '/');

    ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);

    HashMap<Object, String> namesMap = new HashMap<Object, String>();
    HashMap<String, Object> objectsMap = new HashMap<String, Object>();

    //      Map<Pair<Clazz, Method>, Integer> overloads = this.computeInheritedOverloads(this.version.getOverloads());

    ClassVisitor visitor = writer;

    visitor = new ReplaceUniqueByOriginalNames(namesMap, objectsMap, this.version.getNamespace(), visitor);

    visitor = new UpdatableClassRenamer(this.version, objectsMap, visitor);
    visitor = this.getMethodsTransformer(proxyName, this.thisClass, visitor);
    // The placement of this transformer is important
    // because convert methods require special treatment
    // as they operate in between versions
    if (this.version.getPrevious() != null) {
        UpdateClass updateClass = VersionManager.getInstance().getUpdateClass(this.version);
        visitor = new ProcessUpdateClass(objectsMap, this.version, updateClass, visitor);
        visitor = new ClassVisitor(ASM5, visitor) {
            @Override//from w w w .ja  va  2  s. c o  m
            public void visitEnd() {

                Type t = thisClass.getASMType();
                String updatableName = version.getUpdatableName(t.getClassName());

                if (updatableName != null) {
                    Type t1 = Type.getObjectType(updatableName.replace('.', '/'));

                    String prevName = version.getPrevious().getUpdatableName(t.getClassName());

                    MethodVisitor mv = this.cv.visitMethod(ACC_PUBLIC, "convert",
                            Type.getMethodDescriptor(Type.VOID_TYPE, OBJECT_TYPE, OBJECT_TYPE), null, null);

                    if (prevName != null) {
                        Type t0 = Type.getObjectType(
                                version.getPrevious().getUpdatableName(t.getClassName()).replace('.', '/'));

                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitTypeInsn(CHECKCAST, t0.getInternalName());
                        mv.visitVarInsn(ALOAD, 2);
                        mv.visitTypeInsn(CHECKCAST, t1.getInternalName());

                        mv.visitMethodInsn(INVOKESTATIC, proxyName, ProcessUpdateClass.METHOD_NAME_STATIC,
                                Type.getMethodDescriptor(Type.VOID_TYPE, t0, t1), false);

                        mv.visitInsn(RETURN);

                    } else {
                        // Class was introduced this version
                        mv.visitTypeInsn(NEW, "java/lang/Error");
                        mv.visitInsn(DUP);
                        mv.visitLdcInsn(
                                "Should not execute, converting a class that did not exist in the previous version");
                        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Error", "<init>", "(Ljava/lang/String;)V",
                                false);
                        mv.visitInsn(ATHROW);
                    }

                    mv.visitMaxs(0, 0);
                    mv.visitEnd();
                }

                this.cv.visitEnd();
            }
        };
    }
    //      visitor = new RenameOverloads(objectsMap, overloads, this.version.getNamespace(), visitor);
    //      visitor = new TypeEraser(objectsMap, this.version, visitor);
    visitor = new AddGettersAndSetters(objectsMap, this.version.getNamespace(), visitor)
            .setGenerateInheritedFields(true);
    visitor = new ReplaceOriginalNamesByUnique(namesMap, objectsMap, this.version.getNamespace(), visitor);

    visitor = new OverrideInheritedMethods(this.thisClass, visitor);

    visitor.visit(V1_5, CLASS_ACCESS, this.thisClass.getASMType().getInternalName(), null, null, null);

    visitor.visitEnd();
    return writer.toByteArray();
}

From source file:suneido.compiler.TestAsm.java

License:Open Source License

public static void main(String[] args) throws Exception {

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    ClassVisitor cv = new CheckClassAdapter(cw);
    MethodVisitor mv;//from  w  w w.j a  va 2  s .  co  m

    cv.visit(V1_6, ACC_PUBLIC + ACC_SUPER, Type.getInternalName(SampleFunction.class), null,
            Type.getInternalName(SuCallBase.class), null);
    mv = cv.visitMethod(ACC_PUBLIC + ACC_VARARGS, "call",
            "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", null, null);
    mv.visitCode();
    Label l0 = new Label();
    mv.visitLabel(l0);
    mv.visitInsn(ACONST_NULL);
    mv.visitInsn(ARETURN);
    Label l3 = new Label();
    mv.visitLabel(l3);
    mv.visitLocalVariable("this", Type.getDescriptor(SampleFunction.class), null, l0, l3, 0);
    mv.visitLocalVariable("self", "Ljava/lang/Object;", null, l0, l3, 1);
    mv.visitLocalVariable("args", "[Ljava/lang/Object;", null, l0, l3, 2);
    mv.visitMaxs(0, 0);
    mv.visitEnd();

    cv.visitEnd();
}