List of usage examples for org.objectweb.asm ClassWriter visitOuterClass
@Override
public final void visitOuterClass(final String owner, final String name, final String descriptor)
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()); }