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