[10] RFR (XS): 8194963: SystemDictionary::link_method_handle_constant() can't link MethodHandle.invoke()/invokeExact()
Paul Sandoz
paul.sandoz at oracle.com
Wed Jan 17 18:24:04 UTC 2018
Hi,
Fix looks ok.
VarHandle sigpoly methods also leverage an appendix argument, see the upcall to MethodHandleNatives.linkMethod. Might they be affected too?
However, i believe there might be a limitation in HotSpot such that it’s not possible to resolve method references to VarHandle sigpoly methods (something that was likely missed with the VarHandle integration).
Thanks,
Paul.
> On 12 Jan 2018, at 07:39, Vladimir Ivanov <vladimir.x.ivanov at oracle.com> wrote:
>
> http://cr.openjdk.java.net/~vlivanov/8194963/webrev.00/
> https://bugs.openjdk.java.net/browse/JDK-8194963
>
> It's a fix for a bug introduced by 8188145 [1].
>
> MethodHandle.invoke()/invokeExact() have an implicit appendix argument (MethodType isntance) which is used for type checking method handle against call site.
>
> MemberName resolution doesn't support such methods (with appendix argument), because there's no way to attach an appendix to MemberName.
>
> Before 8188145, it was handled in JDK code [2], but now JVM performs MemberName resolution first before doing the upcall into JDK.
>
> The fix is to avoid resolving those methods in SystemDictionary::link_method_handle_constant() (they are well-known, public, signature polymorphic) and only resolve method descriptor before doing the upcall.
>
> Testing:
> * failing tests, jdk/java/lang/invoke
> * hs-precheckin-comp, hs-tier1, hs-tier2, jdk-tier1, jdk-tier2 (in progress)
>
> Thanks!
>
> Best regards,
> Vladimir Ivanov
>
> [1] https://bugs.openjdk.java.net/browse/JDK-8188145
>
> [2] http://hg.openjdk.java.net/jdk/hs/file/bade224cc81e/src/java.base/share/classes/java/lang/invoke/MethodHandles.java#l2446
> MethodHandle linkMethodHandleConstant(byte refKind, Class<?> defc, String name, Object type) throws ReflectiveOperationException {
> ...
> // Treat MethodHandle.invoke and invokeExact specially.
> if (defc == MethodHandle.class && refKind == REF_invokeVirtual) {
> mh = findVirtualForMH(member.getName(), member.getMethodType());
> if (mh != null) {
> return mh;
> }
> }
More information about the hotspot-runtime-dev
mailing list