Skip to content

Commit

Permalink
Match RI behaviour for MethodHandles.unrelfect with OpenJDK MHs
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
ThanHenderson committed Dec 1, 2023
1 parent 5a3af11 commit d7eb93d
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion jdk/src/share/classes/java/lang/invoke/MethodHandles.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit d7eb93d

Please sign in to comment.