Conditional Compilation + Inner Class Oddity

Jeremy Manson jeremymanson at google.com
Thu Oct 24 15:42:12 PDT 2013


Ah, that makes sense, as far as it goes.  In that case, it isn't a bug at
all - it is just my mistake.  Thanks!

Jeremy


On Thu, Oct 24, 2013 at 12:53 PM, Vicente-Arturo Romero-Zaldivar <
vicente.romero at oracle.com> wrote:

> Hi Jeremy,
>
> The bug your are mentioning was reported in our bug DB as: "JDK-7199823:
> javac generates inner class that can't be verified" [1], the changeset can
> be accessed here [2].
>
> Test$1 is used as a token to access the constructor of class NamedClass if
> it's private.
>
> The issue here is that if DBG is true then an anonymous inner class Test$1
> extending Runnable is also created. javac was reusing that class as the
> token. The problem is that if DBG is false, all the content of the "then"
> brace of the if is discarded by Lower, but as before other class, Check,
> had created Test$1 as a to-be-generated class then that class would be
> incomplete and was violating the spec as you have mentioned. So the fix at
> [2] is creating a new class if necessary and swaping the old unusable class
> extending Runnable, in this case, by a fresh empty class.
>
> HTH,
> Vicente.
>
> [1] https://bugs.openjdk.java.net/**browse/JDK-7199823<https://bugs.openjdk.java.net/browse/JDK-7199823>
> [2] http://hg.openjdk.java.net/**jdk8/jdk8/langtools/rev/**a51a8dac0a2f<http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/a51a8dac0a2f>
>
>
> On 24/10/13 19:34, Jeremy Manson wrote:
>
>> Hi folks,
>>
>> We've found an oddity with conditional compilation and inner classes, and
>> was wondering if there was an explanation for it.  In the following code,
>> whether Test$1 is generated depends on whether Test$NestedClass is private
>> or not.  I don't think this violates the spec (given that you don't have to
>> generate Test$1 at all), but it is deeply curious:
>>
>> public class Test {
>>   private static final boolean DBG = false;
>>
>>   private
>>   static class NamedClass {
>>     int abc;
>>   }
>>
>>   public void method() {
>>     if (DBG) {
>>       Thread t = new Thread(new Runnable() {
>>           @Override public void run() {
>>             System.out.println();
>>           }
>>         });
>>     }
>>     NamedClass nc = new NamedClass();
>>   }
>> }
>>
>> (Note that in javac 7, Test$1 has run() and <init> methods without Code
>> attributes, which violates the spec.  In javac 8, Test$1 doesn't have run()
>> or <init> methods at all, which is probably fine (albeit odd).  Perhaps the
>> fix should be backported?)
>>
>> Presumably, there is some method to the decision as to whether to
>> generate Test$1, but I have no idea what it is.
>>
>> Jeremy
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20131024/1a5f6e87/attachment.html 


More information about the compiler-dev mailing list