Example usage for org.objectweb.asm ClassWriter visitOuterClass

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

Introduction

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

Prototype

@Override
    public final void visitOuterClass(final String owner, final String name, final String descriptor) 

Source Link

Usage

From source file:com.asakusafw.dag.compiler.builtin.FoldOperatorGenerator.java

License:Apache License

private ClassDescription generateCombinerClass(Context context, UserOperator operator, ClassDescription outer) {
    ClassDescription target = getCombinerName(outer);
    OperatorInput input = operator.getInput(0);

    ClassWriter writer = newWriter(target, Object.class, ObjectCombiner.class);
    writer.visitOuterClass(outer.getInternalName(), target.getInternalName(), null);

    FieldRef impl = defineOperatorField(writer, operator, target);
    defineEmptyConstructor(writer, Object.class, method -> {
        setOperatorField(method, operator, impl);
    });//from   www  .  j a  v  a  2  s  .  c o  m
    defineBuildKey(context, writer, input.getDataType(), input.getGroup());

    MethodVisitor method = writer.visitMethod(Opcodes.ACC_PUBLIC, "combine",
            Type.getMethodDescriptor(Type.VOID_TYPE, typeOf(Object.class), typeOf(Object.class)), null, null);

    List<ValueRef> arguments = new ArrayList<>();
    arguments.add(impl);
    arguments.add(m -> {
        m.visitVarInsn(Opcodes.ALOAD, 1);
        m.visitTypeInsn(Opcodes.CHECKCAST, typeOf(input.getDataType()).getInternalName());
    });
    arguments.add(m -> {
        m.visitVarInsn(Opcodes.ALOAD, 2);
        m.visitTypeInsn(Opcodes.CHECKCAST, typeOf(input.getDataType()).getInternalName());
    });
    for (VertexElement dep : context.getDependencies(operator.getArguments())) {
        Invariants.require(dep.getElementKind() == ElementKind.VALUE);
        ValueDescription value = ((ValueElement) dep).getValue();
        arguments.add(m -> {
            getConst(method, Invariants.safe(() -> value.resolve(context.getClassLoader())));
        });
    }
    invoke(method, context, operator, arguments);
    method.visitInsn(Opcodes.RETURN);
    method.visitMaxs(0, 0);
    method.visitEnd();
    return context.addClassFile(new ClassData(target, writer::toByteArray));
}

From source file:com.asakusafw.dag.compiler.builtin.SummarizeOperatorGenerator.java

License:Apache License

static ClassDescription generateMapperClass(Context context, UserOperator operator, ClassDescription outer) {
    ClassDescription target = getMapperName(outer);

    OperatorInput input = operator.getInput(Summarize.ID_INPUT);
    OperatorOutput output = operator.getOutput(Summarize.ID_OUTPUT);

    ClassWriter writer = newWriter(target, Object.class, Function.class);
    writer.visitOuterClass(outer.getInternalName(), target.getSimpleName(), null);

    FieldRef buffer = defineField(writer, target, "buffer", typeOf(output.getDataType()));
    defineEmptyConstructor(writer, Object.class, method -> {
        method.visitVarInsn(Opcodes.ALOAD, 0);
        getNew(method, output.getDataType());
        putField(method, buffer);/* w w  w  . j  ava  2s.c o  m*/
    });

    MethodVisitor method = writer.visitMethod(Opcodes.ACC_PUBLIC, "apply",
            Type.getMethodDescriptor(typeOf(Object.class), typeOf(Object.class)), null, null);

    LocalVarRef inputVar = cast(method, 1, input.getDataType());
    buffer.load(method);
    LocalVarRef outputVar = putLocalVar(method, Type.OBJECT, 2);

    outputVar.load(method);
    resetDataModel(method, output.getDataType());

    List<PropertyFolding> foldings = Invariants
            .safe(() -> SummarizedModelUtil.getPropertyFoldings(context.getClassLoader(), operator));
    DataModelReference inputModel = context.getDataModelLoader().load(input.getDataType());
    DataModelReference outputModel = context.getDataModelLoader().load(output.getDataType());
    Set<PropertyReference> nullChecked = new HashSet<>();
    for (PropertyFolding folding : foldings) {
        PropertyMapping mapping = folding.getMapping();
        Aggregation aggregation = folding.getAggregation();
        PropertyReference src = Invariants.requireNonNull(inputModel.findProperty(mapping.getSourceProperty()));
        PropertyReference dst = Invariants
                .requireNonNull(outputModel.findProperty(mapping.getDestinationProperty()));
        mapping(method, target, aggregation, src, dst, inputVar, outputVar, nullChecked);
    }

    outputVar.load(method);
    method.visitInsn(Opcodes.ARETURN);
    method.visitMaxs(0, 0);
    method.visitEnd();

    if (nullChecked.isEmpty() == false) {
        defineCheckNull(writer, operator, inputModel);
    }

    return context.addClassFile(new ClassData(target, writer::toByteArray));
}

From source file:com.asakusafw.dag.compiler.builtin.SummarizeOperatorGenerator.java

License:Apache License

static ClassDescription generateCombinerClass(Context context, UserOperator operator, ClassDescription outer) {
    ClassDescription target = getCombinerName(outer);
    OperatorInput input = operator.getInput(Summarize.ID_INPUT);
    OperatorOutput output = operator.getOutput(Summarize.ID_OUTPUT);

    ClassWriter writer = newWriter(target, Object.class, ObjectCombiner.class);
    writer.visitOuterClass(outer.getInternalName(), target.getSimpleName(), null);
    defineEmptyConstructor(writer, Object.class);
    defineBuildKey(context, writer, output.getDataType(), input.getGroup());

    MethodVisitor method = writer.visitMethod(Opcodes.ACC_PUBLIC, "combine",
            Type.getMethodDescriptor(Type.VOID_TYPE, typeOf(Object.class), typeOf(Object.class)), null, null);

    LocalVarRef leftVar = cast(method, 1, output.getDataType());
    LocalVarRef rightVar = cast(method, 2, output.getDataType());

    List<PropertyFolding> foldings = Invariants
            .safe(() -> SummarizedModelUtil.getPropertyFoldings(context.getClassLoader(), operator));
    DataModelReference outputModel = context.getDataModelLoader().load(output.getDataType());
    for (PropertyFolding folding : foldings) {
        PropertyMapping mapping = folding.getMapping();
        Aggregation aggregation = folding.getAggregation();
        PropertyReference property = Invariants
                .requireNonNull(outputModel.findProperty(mapping.getDestinationProperty()));
        combine(method, aggregation, property, leftVar, rightVar);
    }/*w  ww . ja  va 2  s . c  o m*/

    method.visitInsn(Opcodes.RETURN);
    method.visitMaxs(0, 0);
    method.visitEnd();
    return context.addClassFile(new ClassData(target, writer::toByteArray));
}

From source file:com.facebook.buck.java.abi.ClassMirror.java

License:Apache License

public void writeTo(JarOutputStream jar) throws IOException {
    JarEntry entry = new JarEntry(fileName);
    entry.setTime(0);/*from   w w  w .  ja  va 2s . c o m*/

    jar.putNextEntry(entry);
    ClassWriter writer = new ClassWriter(0);
    writer.visit(version, access, name, signature, superName, interfaces);

    if (outerClass != null) {
        writer.visitOuterClass(outerClass.owner, outerClass.name, outerClass.desc);
    }

    for (InnerClass inner : innerClasses) {
        writer.visitInnerClass(inner.name, inner.outerName, inner.innerName, inner.access);
    }

    for (AnnotationMirror annotation : annotations) {
        annotation.appendTo(writer);
    }

    for (FieldMirror field : fields) {
        field.accept(writer);
    }

    for (MethodMirror method : methods) {
        method.appendTo(writer);
    }
    writer.visitEnd();
    ByteSource.wrap(writer.toByteArray()).copyTo(jar);
    jar.closeEntry();
}

From source file:org.summer.aop.ltw.AspectWeaver.java

License:Open Source License

@Override
public void visitEnd() {
    isVisitEndReached = true;/*from   ww  w. j  ava  2  s.com*/
    // If this class should be merged...
    if (mergingClassNode != null) {
        // Add all remaining non matching merging fields
        for (Object fieldNode : mergingClassNode.fields) {
            FieldNode fn = (FieldNode) fieldNode;
            if (!visitedMergingClassFields.contains(fn.name))
                fn.accept(cv);
        }
        // Add all remaining non matching merging methods
        for (Object methodNode : mergingClassNode.methods) {
            shouldInsertRedirectionCondition = false;
            MethodNode mn = (MethodNode) methodNode;
            if (!visitedMergingClassMethods.contains(mn.name + mn.desc))
                mn.accept(this);
        }
    } else if (replacingClassNode != null) // If this class should be replaced...
    {
        // Add all replacing fields
        for (Object fieldNode : replacingClassNode.fields) {
            ((FieldNode) fieldNode).accept(cv);
        }
        // Add all remaining replacing non matching replacing methods
        for (Object methodNode : replacingClassNode.methods) {
            MethodNode mn = (MethodNode) methodNode;
            if (!mn.name.equals("<clinit>"))
                mn.accept(this);
        }
    }
    MethodVisitor mv;
    // Split the advised methods
    for (AspectWeaver.MethodInfo info : interceptedMethodInfos) {
        if (!info.methodName.equals("<clinit>")) {
            int privateAccess = toPrivateAccess(info.access);
            // For non constructor methods replace the original method body
            if (!info.methodName.equals("<init>")) {
                mv = cv.visitMethod(info.access, info.methodName, info.desc, info.signature, info.exceptions);
                mv = new MethodReplacer(className, mv, privateAccess, info.methodName, info.desc,
                        info.signature, info.exceptions, info.matchingAspects);
                mv.visitCode();
                mv.visitMaxs(-1, -1);
                mv.visitEnd();
            }
            // Add a corresponding proceeding method
            mv = cv.visitMethod(privateAccess,
                    AOPContext.toProceedingMethodName(info.methodName, info.constructorNumber), info.desc,
                    info.signature, info.exceptions);
            mv = new ProceedingMethodGenerator(className, mv, privateAccess, info.methodName,
                    info.constructorNumber, info.desc, info.signature, info.exceptions, info.matchingAspects);
            mv.visitCode();
            mv.visitMaxs(-1, -1);
            mv.visitEnd();
        }
    }
    // Add the STATIC_ASPECTS_FIELD
    cv.visitField(ACC_PRIVATE + ACC_STATIC, AOPContext.STATIC_ASPECTS_FIELD, "Ljava/util/Map;",
            "Ljava/util/Map<Ljava/lang/String;Ljava/util/List<Ljava/lang/String;>;>;", null).visitEnd();
    if (mergingClassNode != null) {
        // Add the STATIC_IS_MERGING_REVERTED_FIELD
        cv.visitField(ACC_PRIVATE + ACC_STATIC, AOPContext.STATIC_IS_MERGING_REVERTED_FIELD, "Z", null, null)
                .visitEnd();
    }
    // Declare the static aspects field within the class' static block if not done yet
    if (!isStaticBlockVisited) {
        mv = cv.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
        if (!tryToAppendReplacingClassStaticBlock(mv)) {
            mv.visitCode();
            initializeStaticAspectsField(mv);
            int maxStack = 2;
            if (mergingClassNode != null) {
                initializeStaticIsMergingActiveField(mv);
                maxStack++;
            }
            mv.visitInsn(RETURN);
            mv.visitMaxs(maxStack, 0);
            mv.visitEnd();
        }
        isStaticBlockVisited = true;
    }
    cv.visitInnerClass(anonymousInnerClassName, null, null, 0);
    cv.visitEnd();
    // Instantiate the static aspects field via a dynamic anonymous inner class and populate it with
    // all advised methods and their matching aspects
    ClassWriter cw = new ClassWriter(0);
    //    cv = new org.objectweb.asm.util.CheckClassAdapter(cw); // ASM Tree API (asm-tree.jar) is needed for this
    cw.visit(V1_5, ACC_PUBLIC, anonymousInnerClassName,
            "Ljava/util/HashMap<Ljava/lang/String;Ljava/util/List<Ljava/lang/String;>;>;", "java/util/HashMap",
            null);
    cw.visitOuterClass(className, null, null);
    cw.visitInnerClass(anonymousInnerClassName, null, null, 0);
    mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/util/HashMap", "<init>", "()V");
    for (AspectWeaver.MethodInfo info : interceptedMethodInfos) {
        mv.visitTypeInsn(NEW, "java/util/LinkedList");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/util/LinkedList", "<init>", "()V");
        mv.visitVarInsn(ASTORE, 1);
        for (Aspect aspect : info.matchingAspects) {
            mv.visitVarInsn(ALOAD, 1);
            mv.visitLdcInsn(aspect.getId());
            mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z");
            mv.visitInsn(POP);
        }
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn(info.methodName + info.desc);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, anonymousInnerClassName, "put",
                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
        mv.visitInsn(POP);
    }
    mv.visitInsn(RETURN);
    mv.visitMaxs(3, 2);
    mv.visitEnd();
    // Finish up class writer
    cw.visitEnd();
    // Register the dynamic anonymous inner class within the top level class loader for further class resolving issues
    TopLevelClassLoader.registerAnonymousInnerClass(className, anonymousInnerClassCounter, cw.toByteArray());
}