javac 7 is able to generate inner class that can't be verified

Jan Lahoda lahoda at gmail.com
Thu Jul 5 04:16:58 PDT 2012


I have noticed that too some time ago. I tried to create a patch for
that, and recently did a webrev for it here:
http://lahoda.info/hudson/job/langtools-patches/lastStableBuild/artifact/webrev/private-constructor-tag-generation/webrev/index.html

Jan

On Thu, Jul 5, 2012 at 1:00 PM, Rémi Forax <forax at univ-mlv.fr> wrote:
> Hi Maurizio, hi all,
> there is a dubious code in javac that try to reuse existing inner class (or
> create one)
> when a constructor accessor need to be generated (see
> Lower.accessConstructorTag).
>
> Used in conjunction with the fact that the inner class exists but
> is created in a block guarded by 'if(false)' leads to a half baked generated
> class
> (no code for method run()) so the inner-class doesn't pass the verifier
> check.
>
> Code to reproduce:
> public class EmptyClassWithFakeConstructor {
>   private static class Foo {
>     // need to generate an accessor method
>   }
>
>   public static void main(String[] args) {
>     new Foo();  // call the accessor
>
>     if(false) {
>       new Runnable() {
>         @Override
>         public void run() {   // the code of this method is not generated
>           System.out.println();
>         }
>       }.run();
>     }
>   }
> }
>
> javap -c EmptyClassWithFakeConstructor\$1.class
> Compiled from "EmptyClassWithFakeConstructor.java"
> final class EmptyClassWithFakeConstructor$1 implements java.lang.Runnable {
>   EmptyClassWithFakeConstructor$1();
>
>   public void run();
> }
>
> as you see, the method run is empty (but not abstract).
>
> cheers,
> Rémi
>
>
>



More information about the compiler-dev mailing list