From 7786b209cbadd3ff5e1aa0f600e7c757849e9d49 Mon Sep 17 00:00:00 2001 From: Nathan Henderson Date: Fri, 1 Dec 2023 14:11:23 -0800 Subject: [PATCH] Match RI behaviour for MethodHandles.unrelfect with OpenJDK MHs This patch addresses eclipse-openj9/openj9#14985. For MethodHandles to private interface methods, the RI erroneously initializes the MethodHandle to have an InvokeInterface reference kind, leading to an invoke-time AbstractMethodError throw. As per the spec, OpenJ9 initializes MethodHandles to private interface methods to have an InvokeSpecial reference kind which does not throw the error. This distinction causes a test failure for a test reported in eclipse-openj9/openj9#14985. Though not-spec compliant, the test expects an AbstractMethodError to be thrown to conform to the RI behaviour. For OpenJ9 MHs, MethodHandles.unreflect identifies private interface methods and installs an AbstractMethodError-thrower MH. This patch sets up a similar mechanisms for OpenJDK MHs by calling a MethodHandleResolver method that installs the AbstractMethodError-thrower MH. Issues: eclipse-openj9/openj9#14985 Signed-off-by: Nathan Henderson --- jdk/src/share/classes/java/lang/invoke/MethodHandles.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/jdk/src/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/share/classes/java/lang/invoke/MethodHandles.java index 5f0ed2a6de9..533c67a7f46 100644 --- a/jdk/src/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/share/classes/java/lang/invoke/MethodHandles.java @@ -1183,6 +1183,10 @@ public MethodHandle unreflect(Method m) throws IllegalAccessException { MethodHandle mh = unreflectForMH(m); if (mh != null) return mh; } + + MethodHandle mh = MethodHandleResolver.maybeCreateAbstractMethodErrorThrower(m); + if (mh != null) return mh; + MemberName method = new MemberName(m); byte refKind = method.getReferenceKind(); if (refKind == REF_invokeSpecial)