Conditional Compilation + Inner Class Oddity

Vicente-Arturo Romero-Zaldivar vicente.romero at oracle.com
Fri Oct 25 07:26:55 PDT 2013


On 24/10/13 23:42, Jeremy Manson wrote:
> 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!

np,

This is a tricky part of the compiler and we evaluated several possible 
implementations, the final code never shows that :)

Vicente

>
> Jeremy
>
>
> On Thu, Oct 24, 2013 at 12:53 PM, Vicente-Arturo Romero-Zaldivar 
> <vicente.romero at oracle.com <mailto: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
>     [2] 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/20131025/af2b97db/attachment.html 


More information about the compiler-dev mailing list