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

Jonathan Gibbons jonathan.gibbons at oracle.com
Thu Sep 20 08:09:25 PDT 2012


Ping noted.

-- Jon

On 09/20/2012 04:44 AM, Remi Forax wrote:
> ping !
>
> Rémi
>
> On 07/05/2012 01:00 PM, Rémi Forax 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