Queries and patch for JDK-8034854: outer_class_info_index of synthetic class is not zero

Jan Lahoda jan.lahoda at oracle.com
Wed Feb 19 04:34:11 PST 2014


Hello,

I have a few questions about JDK-8034854 and a possible patch/fix for 
it. The bug URL:
https://bugs.openjdk.java.net/browse/JDK-8034854

The problem is that while JVMS 7, 4.7.6. (The InnerClasses Attribute) 
mandates that:
  If a class file has a version number that is greater than or equal to
  51.0, and has an InnerClasses attribute in its attributes table, then
  for all entries in the classes array of the InnerClasses attribute,
  the value of the outer_class_info_index item must be zero if the value
  of the inner_name_index item is zero.
javac in some cases produces non-zero "outer_class_info_index" even if 
"inner_name_index" is zero. This happens for synthetically generated 
auxiliary classes. These classes are generated for a number of reasons, 
for example to be used as tags when accessing private constructors. The 
synthetic classes internally have an empty name, so the generated 
"inner_name_index" is zero, but their owner is a class, so they get the 
non-zero "outer_class_info_index".

I've sketched out a simple fix for this problem, which ensures that 
"outer_class_info_index" is zero for classes that have empty name:
http://cr.openjdk.java.net/~jlahoda/8034854/webrev.00/

After this change, the generated synthetic classes look a lot like 
anonymous classes defined in an initializer of the given class (based on 
the InnerClasses attribute and the EnclosingMethod attribute). That 
seems reasonable to me.

My questions are:
-does the fix above make sense?
-the change affects all target levels. It seems to me that the new 
behavior makes sense even for pre-7 classfiles, but I'll gladly limit 
the new behavior to only some minimal target level if desired.

Any comments welcome.

Thanks,
    Jan


More information about the compiler-dev mailing list