[9] RFR (S): 8032400: JSR292: invokeSpecial: InternalError attempting to lookup a method

Paul Sandoz paul.sandoz at oracle.com
Thu Jun 5 08:07:32 UTC 2014


On Jun 4, 2014, at 5:25 PM, Vladimir Ivanov <vladimir.x.ivanov at oracle.com> wrote:

> https://bugs.openjdk.java.net/browse/JDK-8032400
> http://cr.openjdk.java.net/~vlivanov/8032400/webrev.00/
> 
> Consider the following hierarchy:
>  class T1            {        int m() { return 1; }}
>  class T2 extends T1 { static int m() { return 2; }}
>  class T3 extends T2 {        int m() { return 3; }}
> 
> T3 has a method, which does the following using method handles:
>   T3::test { invokespecial T1.m() T3 }
> 
> T1.m lookup attempt from T3 ends up as T2.m lookup, but it fails since T2 has static method with the same signature. Lookup.getDirectMethodCommon doesn't expect such failure and throws InternalError.
> 
> JVMS specification states the following:
>  // JVMS 6.5: invokespecial
>  // ... 2. Otherwise, if C is a class and has a superclass, a search
>  // for a declaration of an instance method with the same name and
>  // descriptor as the resolved method is performed, starting with the
>  // direct superclass of C and continuing with the direct superclass
>  // of that class, and so forth, until a match is found or no further
>  // superclasses exist. If a match is found, then it is the method to
>  // be invoked.
> 
> The fix is to comply with the spec and search upper in the class hierarchy if lookup attempt fails.
> 
> Testing: regression test, jdk/test/java/lang/invoke, tests on access checks.
> 

Looks ok.

The behaviour of MethodHandles.Lookup.findSpecial got me confused for a while :-)

Minor point: is it also worth exposing a T3.lookup() method and on the returned Lookup calling findSpecial(T1.class, "m", MethodType.methodType(int.class), T3.class).invokeExact() to ensure the programmatic path also works?

Paul.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 841 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20140605/2f63dbd3/signature.asc>


More information about the mlvm-dev mailing list