src/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java

Print this page

        

*** 28,38 **** * However, the following notice accompanied the original version of this * file: * * ASM: a very small and fast Java bytecode manipulation framework * Copyright (c) 2000-2011 INRIA, France Telecom - * Copyright (c) 2011 Google * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: --- 28,37 ----
*** 65,100 **** import jdk.internal.org.objectweb.asm.Attribute; import jdk.internal.org.objectweb.asm.ClassVisitor; import jdk.internal.org.objectweb.asm.FieldVisitor; import jdk.internal.org.objectweb.asm.MethodVisitor; import jdk.internal.org.objectweb.asm.Opcodes; /** * A {@link ClassVisitor} that prints the classes it visits with a * {@link Printer}. This class visitor can be used in the middle of a class * visitor chain to trace the class that is visited at a given point in this ! * chain. This may be useful for debugging purposes. <p> The trace printed when ! * visiting the <tt>Hello</tt> class is the following: <p> <blockquote> * ! * <pre> // class version 49.0 (49) // access flags 0x21 public class Hello { * * // compiled from: Hello.java * * // access flags 0x1 public &lt;init&gt; ()V ALOAD 0 INVOKESPECIAL * java/lang/Object &lt;init&gt; ()V RETURN MAXSTACK = 1 MAXLOCALS = 1 * * // access flags 0x9 public static main ([Ljava/lang/String;)V GETSTATIC * java/lang/System out Ljava/io/PrintStream; LDC &quot;hello&quot; * INVOKEVIRTUAL java/io/PrintStream println (Ljava/lang/String;)V RETURN ! * MAXSTACK = 2 MAXLOCALS = 1 } </pre> * ! * </blockquote> where <tt>Hello</tt> is defined by: <p> <blockquote> * ! * <pre> public class Hello { * * public static void main(String[] args) { ! * System.out.println(&quot;hello&quot;); } } </pre> * * </blockquote> * * @author Eric Bruneton * @author Eugene Kuleshov --- 64,111 ---- import jdk.internal.org.objectweb.asm.Attribute; import jdk.internal.org.objectweb.asm.ClassVisitor; import jdk.internal.org.objectweb.asm.FieldVisitor; import jdk.internal.org.objectweb.asm.MethodVisitor; import jdk.internal.org.objectweb.asm.Opcodes; + import jdk.internal.org.objectweb.asm.TypePath; /** * A {@link ClassVisitor} that prints the classes it visits with a * {@link Printer}. This class visitor can be used in the middle of a class * visitor chain to trace the class that is visited at a given point in this ! * chain. This may be useful for debugging purposes. ! * <p> ! * The trace printed when visiting the <tt>Hello</tt> class is the following: ! * <p> ! * <blockquote> * ! * <pre> ! * // class version 49.0 (49) // access flags 0x21 public class Hello { * * // compiled from: Hello.java * * // access flags 0x1 public &lt;init&gt; ()V ALOAD 0 INVOKESPECIAL * java/lang/Object &lt;init&gt; ()V RETURN MAXSTACK = 1 MAXLOCALS = 1 * * // access flags 0x9 public static main ([Ljava/lang/String;)V GETSTATIC * java/lang/System out Ljava/io/PrintStream; LDC &quot;hello&quot; * INVOKEVIRTUAL java/io/PrintStream println (Ljava/lang/String;)V RETURN ! * MAXSTACK = 2 MAXLOCALS = 1 } ! * </pre> * ! * </blockquote> where <tt>Hello</tt> is defined by: ! * <p> ! * <blockquote> * ! * <pre> ! * public class Hello { * * public static void main(String[] args) { ! * System.out.println(&quot;hello&quot;); ! * } ! * } ! * </pre> * * </blockquote> * * @author Eric Bruneton * @author Eugene Kuleshov
*** 112,167 **** public final Printer p; /** * Constructs a new {@link TraceClassVisitor}. * ! * @param pw the print writer to be used to print the class. */ public TraceClassVisitor(final PrintWriter pw) { this(null, pw); } /** * Constructs a new {@link TraceClassVisitor}. * ! * @param cv the {@link ClassVisitor} to which this visitor delegates calls. ! * May be <tt>null</tt>. ! * @param pw the print writer to be used to print the class. */ public TraceClassVisitor(final ClassVisitor cv, final PrintWriter pw) { this(cv, new Textifier(), pw); } /** * Constructs a new {@link TraceClassVisitor}. * ! * @param cv the {@link ClassVisitor} to which this visitor delegates calls. ! * May be <tt>null</tt>. ! * @param p the object that actually converts visit events into text. ! * @param pw the print writer to be used to print the class. May be null if * you simply want to use the result via * {@link Printer#getText()}, instead of printing it. */ ! public TraceClassVisitor( ! final ClassVisitor cv, ! final Printer p, ! final PrintWriter pw) ! { ! super(Opcodes.ASM4, cv); this.pw = pw; this.p = p; } @Override ! public void visit( ! final int version, ! final int access, ! final String name, ! final String signature, ! final String superName, ! final String[] interfaces) ! { p.visit(version, access, name, signature, superName, interfaces); super.visit(version, access, name, signature, superName, interfaces); } @Override --- 123,176 ---- public final Printer p; /** * Constructs a new {@link TraceClassVisitor}. * ! * @param pw ! * the print writer to be used to print the class. */ public TraceClassVisitor(final PrintWriter pw) { this(null, pw); } /** * Constructs a new {@link TraceClassVisitor}. * ! * @param cv ! * the {@link ClassVisitor} to which this visitor delegates ! * calls. May be <tt>null</tt>. ! * @param pw ! * the print writer to be used to print the class. */ public TraceClassVisitor(final ClassVisitor cv, final PrintWriter pw) { this(cv, new Textifier(), pw); } /** * Constructs a new {@link TraceClassVisitor}. * ! * @param cv ! * the {@link ClassVisitor} to which this visitor delegates ! * calls. May be <tt>null</tt>. ! * @param p ! * the object that actually converts visit events into text. ! * @param pw ! * the print writer to be used to print the class. May be null if * you simply want to use the result via * {@link Printer#getText()}, instead of printing it. */ ! public TraceClassVisitor(final ClassVisitor cv, final Printer p, ! final PrintWriter pw) { ! super(Opcodes.ASM5, cv); this.pw = pw; this.p = p; } @Override ! public void visit(final int version, final int access, final String name, ! final String signature, final String superName, ! final String[] interfaces) { p.visit(version, access, name, signature, superName, interfaces); super.visit(version, access, name, signature, superName, interfaces); } @Override
*** 169,254 **** p.visitSource(file, debug); super.visitSource(file, debug); } @Override ! public void visitOuterClass( ! final String owner, ! final String name, ! final String desc) ! { p.visitOuterClass(owner, name, desc); super.visitOuterClass(owner, name, desc); } @Override ! public AnnotationVisitor visitAnnotation( ! final String desc, ! final boolean visible) ! { Printer p = this.p.visitClassAnnotation(desc, visible); AnnotationVisitor av = cv == null ? null : cv.visitAnnotation(desc, visible); return new TraceAnnotationVisitor(av, p); } @Override public void visitAttribute(final Attribute attr) { p.visitClassAttribute(attr); super.visitAttribute(attr); } @Override ! public void visitInnerClass( ! final String name, ! final String outerName, ! final String innerName, ! final int access) ! { p.visitInnerClass(name, outerName, innerName, access); super.visitInnerClass(name, outerName, innerName, access); } @Override ! public FieldVisitor visitField( ! final int access, ! final String name, ! final String desc, ! final String signature, ! final Object value) ! { ! Printer p = this.p.visitField(access, ! name, ! desc, ! signature, ! value); ! FieldVisitor fv = cv == null ? null : cv.visitField(access, ! name, ! desc, ! signature, ! value); return new TraceFieldVisitor(fv, p); } @Override ! public MethodVisitor visitMethod( ! final int access, ! final String name, ! final String desc, ! final String signature, ! final String[] exceptions) ! { ! Printer p = this.p.visitMethod(access, ! name, ! desc, ! signature, exceptions); ! MethodVisitor mv = cv == null ? null : cv.visitMethod(access, ! name, ! desc, ! signature, ! exceptions); return new TraceMethodVisitor(mv, p); } @Override public void visitEnd() { --- 178,241 ---- p.visitSource(file, debug); super.visitSource(file, debug); } @Override ! public void visitOuterClass(final String owner, final String name, ! final String desc) { p.visitOuterClass(owner, name, desc); super.visitOuterClass(owner, name, desc); } @Override ! public AnnotationVisitor visitAnnotation(final String desc, ! final boolean visible) { Printer p = this.p.visitClassAnnotation(desc, visible); AnnotationVisitor av = cv == null ? null : cv.visitAnnotation(desc, visible); return new TraceAnnotationVisitor(av, p); } @Override + public AnnotationVisitor visitTypeAnnotation(int typeRef, + TypePath typePath, String desc, boolean visible) { + Printer p = this.p.visitClassTypeAnnotation(typeRef, typePath, desc, + visible); + AnnotationVisitor av = cv == null ? null : cv.visitTypeAnnotation( + typeRef, typePath, desc, visible); + return new TraceAnnotationVisitor(av, p); + } + + @Override public void visitAttribute(final Attribute attr) { p.visitClassAttribute(attr); super.visitAttribute(attr); } @Override ! public void visitInnerClass(final String name, final String outerName, ! final String innerName, final int access) { p.visitInnerClass(name, outerName, innerName, access); super.visitInnerClass(name, outerName, innerName, access); } @Override ! public FieldVisitor visitField(final int access, final String name, ! final String desc, final String signature, final Object value) { ! Printer p = this.p.visitField(access, name, desc, signature, value); ! FieldVisitor fv = cv == null ? null : cv.visitField(access, name, desc, ! signature, value); return new TraceFieldVisitor(fv, p); } @Override ! public MethodVisitor visitMethod(final int access, final String name, ! final String desc, final String signature, final String[] exceptions) { ! Printer p = this.p.visitMethod(access, name, desc, signature, exceptions); ! MethodVisitor mv = cv == null ? null : cv.visitMethod(access, name, ! desc, signature, exceptions); return new TraceMethodVisitor(mv, p); } @Override public void visitEnd() {