JDK-5063124 : recursive class loading in javadoc causes assertion error
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 5.0
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: solaris_8
  • CPU: generic
  • Submitted: 2004-06-15
  • Updated: 2004-06-25
  • Resolved: 2004-06-25
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
Other
5.0 b58Fixed
Related Reports
Relates :  
Description
After building tiger, the following script can be used to reproduce
a javadoc crash that is due to an underlying problem in javac.

==========$ cat -n cmd
     1
     2  J2SE=/usr/home/gafter/tiger-rc/j2se
     3  BUILD=${J2SE}/build/`platform`
     4  BIN=${BUILD}/bin
     5
     6  ${BIN}/javadoc -J-esa -J-ms64m -J-mx128m -doclet GenDocletBeanInfo -x false -d ${BUILD}/tmp/1.2src -t ${J2SE}/make/tools/swing-beans/SwingBeanInfo.template -docletpath ${BUILD}/tmp ${J2SE}/src/share/classes/javax/swing/JTree.java ${J2SE}/src/share/classes/javax/swing/text/JTextComponent.java
==========$ sh cmd
Loading source file /usr/home/gafter/tiger-rc/j2se/src/share/classes/javax/swing/JTree.java...
Loading source file /usr/home/gafter/tiger-rc/j2se/src/share/classes/javax/swing/text/JTextComponent.java...
Constructing Javadoc information...

>>> Generating beaninfo for javax.swing.JTree...
javadoc: error - In doclet class GenDocletBeanInfo,  method start has thrown an exception java.lang.reflect.InvocationTargetException
java.lang.AssertionError
        at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:1544)
        at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:1518)
        at com.sun.tools.javac.code.Symbol.complete(Symbol.java:354)
        at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:613)
        at com.sun.tools.javac.code.Type$ClassType.complete(Type.java:593)
        at com.sun.tools.javac.code.Type$ClassType.typarams(Type.java:531)
        at com.sun.tools.javac.jvm.ClassReader.enterTypevars(ClassReader.java:1257)
        at com.sun.tools.javac.jvm.ClassReader.enterTypevars(ClassReader.java:1256)
        at com.sun.tools.javac.jvm.ClassReader.readClass(ClassReader.java:1272)
        at com.sun.tools.javac.jvm.ClassReader.readClassFile(ClassReader.java:1380)
        at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:1559)
        at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:1518)
        at com.sun.tools.javac.code.Symbol.complete(Symbol.java:354)
        at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:613)
        at com.sun.tools.javac.code.Symbol$ClassSymbol.flags(Symbol.java:551)
        at com.sun.tools.javadoc.ClassDocImpl.getFlags(ClassDocImpl.java:105)
        at com.sun.tools.javadoc.ClassDocImpl.isAnnotationType(ClassDocImpl.java:116)
        at com.sun.tools.javadoc.DocEnv.isAnnotationType(DocEnv.java:574)
        at com.sun.tools.javadoc.DocEnv.getClassDoc(DocEnv.java:546)
        at com.sun.tools.javadoc.PackageDocImpl.getClasses(PackageDocImpl.java:152)
        at com.sun.tools.javadoc.PackageDocImpl.findClass(PackageDocImpl.java:307)
        at com.sun.tools.javadoc.ClassDocImpl.searchClass(ClassDocImpl.java:708)
        at com.sun.tools.javadoc.ClassDocImpl.searchClass(ClassDocImpl.java:700)
        at com.sun.tools.javadoc.ClassDocImpl.findClass(ClassDocImpl.java:665)
        at com.sun.tools.javadoc.SeeTagImpl.findReferenced(SeeTagImpl.java:239)
        at com.sun.tools.javadoc.SeeTagImpl.<init>(SeeTagImpl.java:56)
        at com.sun.tools.javadoc.Comment$1CommentStringParser.parseCommentComponent(Comment.java:139)
        at com.sun.tools.javadoc.Comment$1CommentStringParser.parseCommentStateMachine(Comment.java:93)
        at com.sun.tools.javadoc.Comment.<init>(Comment.java:167)
        at com.sun.tools.javadoc.DocImpl.comment(DocImpl.java:81)
        at com.sun.tools.javadoc.DocImpl.tags(DocImpl.java:100)
        at GenDocletBeanInfo.start(GenDocletBeanInfo.java:159)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:582)
        at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:215)
        at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:91)
        at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:340)
        at com.sun.tools.javadoc.Start.begin(Start.java:128)
        at com.sun.tools.javadoc.Main.execute(Main.java:41)
        at com.sun.tools.javadoc.Main.main(Main.java:31)
1 error
==========$

Comments
CONVERTED DATA BugTraq+ Release Management Values COMMIT TO FIX: tiger-rc FIXED IN: tiger-rc INTEGRATED IN: tiger-b58 tiger-rc
17-07-2004

SUGGESTED FIX ------- ClassReader.java ------- *** /tmp/sccs.a5NHzI Tue Jun 15 10:34:56 2004 --- ClassReader.java Tue Jun 15 09:52:50 2004 *************** *** 1514,1520 **** if (sym.kind == TYP) { ClassSymbol c = (ClassSymbol)sym; c.members_field = new Scope.ErrorScope(c); // make sure it's always defined ! c.owner.complete(); fillIn(c); } else if (sym.kind == PCK) { PackageSymbol p = (PackageSymbol)sym; --- 1514,1520 ---- if (sym.kind == TYP) { ClassSymbol c = (ClassSymbol)sym; c.members_field = new Scope.ErrorScope(c); // make sure it's always defined ! completeOwners(c.owner); fillIn(c); } else if (sym.kind == PCK) { PackageSymbol p = (PackageSymbol)sym; *************** *** 1523,1531 **** annotate.flush(); // finish attaching annotations } /** We can only read a single class file at a time; this ! * flag keeps track of when we are currently reading a class ! * file. */ private boolean filling = false; --- 1523,1537 ---- annotate.flush(); // finish attaching annotations } + /** complete up through the enclosing package. */ + private void completeOwners(Symbol o) { + if (o.kind != PCK) completeOwners(o.owner); + o.complete(); + } + /** We can only read a single class file at a time; this ! * flag keeps track of when we are currently reading a class ! * file. */ private boolean filling = false;
17-07-2004

PUBLIC COMMENTS ...
17-07-2004

EVALUATION Will aim to fix in the first patch after Tiger. ###@###.### 2004-06-14
14-06-2004