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

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Sep 20 05:19:00 PDT 2012


On 20/09/12 12:44, 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).
Yeah - this is javac trying to reduce the number of inner classes 
generated during compilation - in order to allow access to a private 
constructor, an instance of a tag inner class is used, which can only be 
instantiated from within the class having access to the tag. In some 
cases javac will try to re-use existing classes as 'tags' - since this 
doesn't take into account the fact that a class might not ultimately be 
generated because of compiler optimizations, I agree that the logic 
appears to be flawed. I will file a bug.

Maurizio
>>
>> 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