RFR (M): JDK-8004967 - Default method cause java.lang.VerifyError: Illegal use of nonvirtual function call

Bharadwaj Yadavalli bharadwaj.yadavalli at oracle.com
Fri Jan 18 14:37:17 UTC 2013


Thanks to Remi, Dean and Karen for looking at the code changes.

Upon further contemplation, it seems to me that my initial proposed 
change (http://cr.openjdk.java.net/~bharadwaj/8004967/webrev/) *might* 
incorrectly trust bytecode in methods that were *not* VM generated and 
flag it as legal.

So, I have implemented, IMHO, a more robust/correct way to handle 
verification of methods generated by the VM in the old verifier. This 
change is consistent with  the way verification done on such methods in 
the (new) split verifier (which I think is appropriate).

The new changes are in hotspot and jdk trees.

Please review the changes at 
http://cr.openjdk.java.net/~bharadwaj/8004967/alt_impl

Hotspot tree changes : 
http://cr.openjdk.java.net/~bharadwaj/8004967/alt_impl/hotspot/webrev/
JDK tree changes : 
http://cr.openjdk.java.net/~bharadwaj/8004967/alt_impl/jdk/webrev/

I ran JCK tests (vm, lang completed; api running), runThese and 
vm.quicklist with no regressions.

Thanks,

Bharadwaj

On 1/16/2013 1:35 PM, Bharadwaj Yadavalli wrote:
> Please review the change at 
> http://cr.openjdk.java.net/~bharadwaj/8004967/webrev/
>
> Default interface methods are new in Java 8. VM creates overpass 
> methods in the vtable slots of classes to invoke a default method 
> using invokespecial.
>
> Consequently, invocation of default interface methods (i.e., overpass 
> methods in the VM) via invokespecial is legal and should not be 
> flagged as illegal.
>
> In short, this change allows invocation of default methods of Java 8 
> using invokespecial.
>
> I ran JCK (vm, lang, api) tests, runThese and vm.quicklist with no new 
> failures.
>
> Thanks,
>
> Bharadwaj
>



More information about the core-libs-dev mailing list