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 <init> ()V ALOAD 0 INVOKESPECIAL
* java/lang/Object <init> ()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 "hello"
* 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("hello"); } } </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 <init> ()V ALOAD 0 INVOKESPECIAL
* java/lang/Object <init> ()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 "hello"
* 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("hello");
! * }
! * }
! * </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() {