List of usage examples for org.objectweb.asm Opcodes ACC_SUPER
int ACC_SUPER
To view the source code for org.objectweb.asm Opcodes ACC_SUPER.
Click Source Link
From source file:com.changingbits.Builder.java
License:Apache License
/** Build a {@link LongRangeMultiSet} implementation to * lookup intervals for a given point./*from w w w . j ava 2s . c o m*/ * * @param useAsm If true, the tree will be compiled to * java bytecodes using the {@code asm} library; typically * this results in a faster (~3X) implementation. */ public LongRangeMultiSet getMultiSet(boolean useAsm, boolean useArrayImpl) { finish(useArrayImpl); if (useAsm) { StringBuilder sb = new StringBuilder(); sb.append('\n'); int count = 0; for (LongRange range : ranges) { sb.append("// range "); sb.append(count++); sb.append(": "); sb.append(range); sb.append('\n'); } sb.append('\n'); sb.append("int upto = 0;\n"); buildJavaSource(root, 0, sb); String javaSource = sb.toString(); //System.out.println("java: " + javaSource); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); classWriter.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, COMPILED_TREE_CLASS.replace('.', '/'), null, LONG_RANGE_MULTI_SET_TYPE.getInternalName(), null); classWriter.visitSource(javaSource, null); Method m = Method.getMethod("void <init> ()"); GeneratorAdapter constructor = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, m, null, null, classWriter); constructor.loadThis(); constructor.loadArgs(); constructor.invokeConstructor(LONG_RANGE_MULTI_SET_TYPE, m); constructor.returnValue(); constructor.endMethod(); GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, LOOKUP_METHOD, null, null, classWriter); //Label labelTop = new Label(); //Label labelEnd = new Label(); //gen.visitLabel(labelTop); int uptoLocal = gen.newLocal(Type.INT_TYPE); //System.out.println("uptoLocal=" + uptoLocal); // nocommit is this not needed!? //gen.visitLocalVariable("upto", "I", null, labelTop, labelEnd, uptoLocal); gen.push(0); gen.storeLocal(uptoLocal, Type.INT_TYPE); buildAsm(gen, root, uptoLocal); // Return upto: gen.loadLocal(uptoLocal, Type.INT_TYPE); gen.returnValue(); //gen.visitLabel(labelEnd); gen.endMethod(); classWriter.visitEnd(); byte[] bytes = classWriter.toByteArray(); // javap -c /x/tmp/my.class /* try { FileOutputStream fos = new FileOutputStream(new File("/x/tmp/my.class")); fos.write(bytes); fos.close(); } catch (Exception e) { throw new RuntimeException(e); } */ // nocommit allow changing the class loader Class<? extends LongRangeMultiSet> treeClass = new Loader(LongRangeMultiSet.class.getClassLoader()) .define(COMPILED_TREE_CLASS, classWriter.toByteArray()); try { return treeClass.getConstructor().newInstance(); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new RuntimeException(e); } } else if (useArrayImpl) { return new ArrayLongRangeMultiSet(root); } else { return new SimpleLongRangeMultiSet(root); } }
From source file:com.changingbits.Builder.java
License:Apache License
public LongRangeCounter getCounter(boolean useAsm) { finish(false);//from ww w . j a va 2 s.c o m if (useAsm) { StringBuilder sb = new StringBuilder(); sb.append('\n'); int count = 0; for (LongRange range : ranges) { sb.append("// range "); sb.append(count++); sb.append(": "); sb.append(range); sb.append('\n'); } sb.append('\n'); buildJavaCounterSource(root, 0, sb, false); String javaSource = sb.toString(); //System.out.println("javaSource:\n" + javaSource); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); classWriter.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, COMPILED_COUNTER_CLASS.replace('.', '/'), null, BASE_LONG_RANGE_COUNTER_TYPE.getInternalName(), null); classWriter.visitSource(javaSource, null); Method m = Method.getMethod("void <init> (com.changingbits.Node, int, int)"); GeneratorAdapter constructor = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, m, null, null, classWriter); constructor.loadThis(); constructor.loadArgs(); constructor.invokeConstructor(Type.getType(BaseLongRangeCounter.class), m); constructor.returnValue(); constructor.endMethod(); GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, ADD_METHOD, null, null, classWriter); buildCounterAsm(gen, root, false); gen.returnValue(); gen.endMethod(); classWriter.visitEnd(); byte[] bytes = classWriter.toByteArray(); // javap -c /x/tmp/my.class /* try { FileOutputStream fos = new FileOutputStream(new File("/x/tmp/counter.class")); fos.write(bytes); fos.close(); } catch (Exception e) { throw new RuntimeException(e); } */ // nocommit allow changing the class loader Class<? extends LongRangeCounter> cl = new CounterLoader(LongRangeCounter.class.getClassLoader()) .define(COMPILED_COUNTER_CLASS, classWriter.toByteArray()); try { return cl.getConstructor(Node.class, int.class, int.class).newInstance(root, elementaryIntervals.size(), ranges.length); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new RuntimeException(e); } } else { return new SimpleLongRangeCounter(root, elementaryIntervals, ranges.length); } }
From source file:com.changingbits.Builder.java
License:Apache License
public LongRangeCounter getCounter2() { finish(false);// ww w.j a v a2s . c o m // Maps each range to the leaf counts that contribute to it: Map<Integer, List<Integer>> rangeToLeaf = new HashMap<>(); buildRangeToLeaf(root, new ArrayList<Integer>(), rangeToLeaf); StringBuilder sb = new StringBuilder(); sb.append('\n'); sb.append("public void add(long v) {\n"); int count = 0; for (LongRange range : ranges) { sb.append(" // range "); sb.append(count++); sb.append(": "); sb.append(range); sb.append('\n'); } buildJavaCounter2Source(root, 1, sb, false); sb.append("}\n\n"); sb.append("public int[] getCounts() {\n"); sb.append(" int[] counts = new int["); sb.append(ranges.length); sb.append("];\n"); for (int range = 0; range < ranges.length; range++) { List<Integer> elements = rangeToLeaf.get(range); if (elements != null) { sb.append(" counts["); sb.append(range); sb.append("] = count"); sb.append(elements.get(0)); for (int i = 1; i < elements.size(); i++) { sb.append(" + count"); sb.append(elements.get(i)); } sb.append(";\n"); } } sb.append(" return counts;\n}\n"); String javaSource = sb.toString(); //System.out.println("counter2 javaSource:\n" + javaSource); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); classWriter.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, COMPILED_COUNTER_CLASS2.replace('.', '/'), null, LONG_RANGE_COUNTER_TYPE.getInternalName(), null); classWriter.visitSource(javaSource, null); // Define "int countN" members: int numLeaves = elementaryIntervals.size(); for (int i = 0; i < numLeaves; i++) { classWriter.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC, "count" + i, "I", null, null); } // init: Method m = Method.getMethod("void <init> ()"); GeneratorAdapter constructor = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, m, null, null, classWriter); // Init all counters to 0: for (int i = 0; i < numLeaves; i++) { constructor.loadThis(); constructor.push(0); constructor.putField(COMPILED_COUNTER_CLASS2_TYPE, "count" + i, Type.INT_TYPE); } constructor.loadThis(); constructor.invokeConstructor(LONG_RANGE_COUNTER_TYPE, m); constructor.returnValue(); constructor.endMethod(); // void add(long v): GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, ADD_METHOD, null, null, classWriter); buildCounterAsm2(gen, root, false); gen.returnValue(); gen.endMethod(); // int[] getCounts(): gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, GET_COUNTS_METHOD, null, null, classWriter); int countsLocal = gen.newLocal(INT_ARRAY_TYPE); gen.push(ranges.length); gen.newArray(Type.INT_TYPE); gen.storeLocal(countsLocal); for (int range = 0; range < ranges.length; range++) { List<Integer> elements = rangeToLeaf.get(range); if (elements != null) { gen.loadLocal(countsLocal); gen.push(range); gen.loadThis(); gen.getField(COMPILED_COUNTER_CLASS2_TYPE, "count" + elements.get(0), Type.INT_TYPE); for (int i = 1; i < elements.size(); i++) { gen.loadThis(); gen.getField(COMPILED_COUNTER_CLASS2_TYPE, "count" + elements.get(i), Type.INT_TYPE); gen.visitInsn(Opcodes.IADD); } gen.arrayStore(Type.INT_TYPE); } } gen.loadLocal(countsLocal); gen.returnValue(); gen.endMethod(); classWriter.visitEnd(); byte[] bytes = classWriter.toByteArray(); // javap -c /x/tmp/my.class /* try { FileOutputStream fos = new FileOutputStream(new File("/x/tmp/counter2.class")); fos.write(bytes); fos.close(); } catch (Exception e) { throw new RuntimeException(e); } */ // nocommit allow changing the class loader Class<? extends LongRangeCounter> cl = new CounterLoader(LongRangeCounter.class.getClassLoader()) .define(COMPILED_COUNTER_CLASS2, classWriter.toByteArray()); try { return cl.getConstructor().newInstance(); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new RuntimeException(e); } }
From source file:com.e2info.helloasm.HelloAsmApp.java
License:Open Source License
public static void main(String[] args) throws IOException { String name = "HelloAsm"; int flag = ClassWriter.COMPUTE_MAXS; ClassWriter cw = new ClassWriter(flag); cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, name, null, "java/lang/Object", null); cw.visitSource(name + ".java", null); {/*from w ww . j a va2 s .c om*/ MethodVisitor mv; mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); mv.visitInsn(Opcodes.RETURN); // we need this call to take effect ClassWriter.COMPUTE_MAXS flag. mv.visitMaxs(0, 0); mv.visitEnd(); } { MethodVisitor mv; mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); mv.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("hello ASM"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mv.visitInsn(Opcodes.RETURN); // we need this call to take effect ClassWriter.COMPUTE_MAXS flag. mv.visitMaxs(0, 0); mv.visitEnd(); } cw.visitEnd(); // build binary byte[] bin = cw.toByteArray(); // save asm trace for human readable { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); new ClassReader(bin).accept(new TraceClassVisitor(pw), 0); File f = new File(name + ".txt"); FileUtils.writeStringToFile(f, sw.toString()); } // save as calss file { File f = new File(name + ".class"); FileUtils.writeByteArrayToFile(f, bin); } }
From source file:com.facebook.buck.jvm.java.abi.AccessFlags.java
License:Apache License
/** * Gets the class access flags (see JVMS8 4.1) for the given type element, augmented by the * special ASM pseudo-access flag for @Deprecated types. *///w ww .j a va2s.c o m public int getAccessFlags(TypeElement typeElement) { int result = getCommonAccessFlags(typeElement); switch (typeElement.getKind()) { case ANNOTATION_TYPE: // No ACC_SUPER here per JVMS 4.1 result = result | Opcodes.ACC_ANNOTATION; result = result | Opcodes.ACC_INTERFACE; result = result | Opcodes.ACC_ABSTRACT; break; case ENUM: result = result | Opcodes.ACC_SUPER; // JVMS 4.1 result = result | Opcodes.ACC_ENUM; // Enums have this lovely property that you can't declare them abstract in source, even // if they have abstract methods or incompletely implemented interfaces, yet the class // file will have ACC_ABSTRACT in that case. Because it's a pain to figure out if an // enum is abstract (and impossible in the no-deps case), and you can't instantiate or // subclass one directly anyway, we just leave the flag off. break; case INTERFACE: // No ACC_SUPER here per JVMS 4.1 result = result | Opcodes.ACC_ABSTRACT; result = result | Opcodes.ACC_INTERFACE; break; // $CASES-OMITTED$ default: result = result | Opcodes.ACC_SUPER; // JVMS 4.1 break; } return result; }
From source file:com.facebook.buck.jvm.java.abi.AccessFlagsTest.java
License:Apache License
@Test public void testStaticFlagOnClass() throws IOException { testTypeFlags(Joiner.on('\n').join("class Foo {", " static class Inner { }", "}"), "Foo.Inner", Opcodes.ACC_STATIC | Opcodes.ACC_SUPER); }
From source file:com.facebook.buck.jvm.java.abi.AccessFlagsTest.java
License:Apache License
@Test public void testEnumTypeFlags() throws IOException { testTypeFlags("enum Foo { Item }", "Foo", Opcodes.ACC_ENUM | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL); }
From source file:com.facebook.buck.jvm.java.abi.AccessFlagsTest.java
License:Apache License
/** * The {@link javax.lang.model.element.TypeElement} for an abstract Enum will *sometimes* report * that the enum is abstract, but not in all the cases where ACC_ABSTRACT needs to appear in the * class file. For this and other reasons we just never use the flag. *///ww w . ja va 2 s .c o m @Test public void testEnumAbstractFlagIsRemoved() throws IOException { testTypeFlags(Joiner.on('\n').join("enum Foo {", " Value {", " int get() { return 3; }", " };", " abstract int get();", "}"), "Foo", Opcodes.ACC_ENUM | Opcodes.ACC_SUPER); }
From source file:com.facebook.buck.jvm.java.abi.AccessFlagsTest.java
License:Apache License
private void testClassFlags(String modifiers, int expectedFlags) throws IOException { testTypeFlags(String.format("%s class Foo { }", modifiers), "Foo", expectedFlags | Opcodes.ACC_SUPER); }
From source file:com.facebook.buck.jvm.java.abi.InnerClassesTable.java
License:Apache License
public void reportInnerClassReferences(Element topElement, ClassVisitor visitor) { List<TypeElement> enclosingClasses = new ArrayList<>(); List<TypeElement> memberClasses = new ArrayList<>(); Set<TypeElement> referencesToInners = new HashSet<>(); ElementKind elementKind = topElement.getKind(); if (elementKind.isClass() || elementKind.isInterface()) { TypeElement walker = (TypeElement) topElement; while (walker.getNestingKind() == NestingKind.MEMBER) { enclosingClasses.add(walker); walker = (TypeElement) walker.getEnclosingElement(); }/* www . j a v a2s. c om*/ } ElementScanner8<Void, Void> elementScanner = new ElementScanner8<Void, Void>() { @Override public Void visitPackage(PackageElement e, Void aVoid) { addTypeReferences(e.getAnnotationMirrors()); // If we're being asked to report inner class references of a package, it really means // we're being asked to report inner class references of package-info.java; i.e., just // the package annotations. We therefore return without chaining to super to avoid // recursing into enclosed elements. return null; } @Override public Void visitType(TypeElement e, Void aVoid) { if (e != topElement && !memberClasses.contains(e)) { memberClasses.add(e); return null; } addTypeReferences(e.getAnnotationMirrors()); e.getTypeParameters().forEach(typeParam -> scan(typeParam, aVoid)); addTypeReferences(e.getSuperclass()); e.getInterfaces().forEach(this::addTypeReferences); // Members will be visited in the call to super, below return super.visitType(e, aVoid); } @Override public Void visitExecutable(ExecutableElement e, Void aVoid) { addTypeReferences(e.getAnnotationMirrors()); e.getTypeParameters().forEach(typeParam -> scan(typeParam, aVoid)); addTypeReferences(e.getReturnType()); addTypeReferences(e.getDefaultValue()); // Parameters will be visited in the call to super, below e.getThrownTypes().forEach(this::addTypeReferences); return super.visitExecutable(e, aVoid); } @Override public Void visitVariable(VariableElement e, Void aVoid) { addTypeReferences(e.getAnnotationMirrors()); addTypeReferences(e.asType()); return super.visitVariable(e, aVoid); } @Override public Void visitTypeParameter(TypeParameterElement e, Void aVoid) { addTypeReferences(e.getAnnotationMirrors()); addTypeReferences(e.asType()); return super.visitTypeParameter(e, aVoid); } private void addTypeReferences(TypeMirror type) { new TypeScanner8<Void, Void>() { @Override public Void scan(@Nullable TypeMirror t, Void aVoid) { if (t == null) { return null; } return super.scan(t, aVoid); } @Override public Void visitDeclared(DeclaredType t, Void aVoid) { TypeElement element = (TypeElement) t.asElement(); if (element.getNestingKind() == NestingKind.MEMBER) { referencesToInners.add(element); element.getEnclosingElement().asType().accept(this, null); } return super.visitDeclared(t, aVoid); } }.scan(type); } private void addTypeReferences(List<? extends AnnotationMirror> annotationMirrors) { annotationMirrors.forEach(this::addTypeReferences); } private void addTypeReferences(AnnotationMirror annotationMirror) { addTypeReferences(annotationMirror.getAnnotationType()); annotationMirror.getElementValues().values().forEach(this::addTypeReferences); } private void addTypeReferences(@Nullable AnnotationValue annotationValue) { if (annotationValue == null) { return; } new AnnotationValueScanner8<Void, Void>() { @Override public Void visitType(TypeMirror t, Void aVoid) { addTypeReferences(t); return super.visitType(t, aVoid); } @Override public Void visitEnumConstant(VariableElement c, Void aVoid) { addTypeReferences(c.asType()); return super.visitEnumConstant(c, aVoid); } @Override public Void visitAnnotation(AnnotationMirror a, Void aVoid) { addTypeReferences(a.getAnnotationType()); return super.visitAnnotation(a, aVoid); } }.scan(annotationValue); } }; elementScanner.scan(topElement); Set<TypeElement> reported = new HashSet<>(); for (TypeElement element : Lists.reverse(enclosingClasses)) { if (reported.add(element)) { visitor.visitInnerClass(descriptorFactory.getInternalName(element), descriptorFactory.getInternalName((TypeElement) element.getEnclosingElement()), element.getSimpleName().toString(), accessFlagsUtils.getAccessFlags(element) & ~Opcodes.ACC_SUPER); } } for (TypeElement element : Lists.reverse(memberClasses)) { if (reported.add(element)) { visitor.visitInnerClass(descriptorFactory.getInternalName(element), descriptorFactory.getInternalName((TypeElement) element.getEnclosingElement()), element.getSimpleName().toString(), accessFlagsUtils.getAccessFlags(element) & ~Opcodes.ACC_SUPER); } } referencesToInners.stream().filter(reported::add) .sorted(Comparator.comparing(e -> e.getQualifiedName().toString())).forEach(element -> { visitor.visitInnerClass(descriptorFactory.getInternalName(element), descriptorFactory.getInternalName((TypeElement) element.getEnclosingElement()), element.getSimpleName().toString(), accessFlagsUtils.getAccessFlags(element) & ~Opcodes.ACC_SUPER); }); }