diff --git a/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDesc.java b/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDesc.java index 6136edef58f46..e6b0e06c664e6 100644 --- a/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDesc.java +++ b/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDesc.java @@ -105,7 +105,7 @@ enum Kind { * @throws IllegalArgumentException if there is no such member */ public static Kind valueOf(int refKind) { - return valueOf(refKind, false); + return valueOf(refKind, refKind == REF_invokeInterface); } /** @@ -137,13 +137,14 @@ public static Kind valueOf(int refKind, boolean isInterface) { if (i >= 0 && i < TABLE.length) { Kind kind = TABLE[i]; if (kind == null) { - throw new IllegalArgumentException(String.format("refKind=%d", refKind)); + throw new IllegalArgumentException(String.format("refKind=%d isInterface=%s", refKind, isInterface)); } - if (kind.refKind == refKind && kind.isInterface == isInterface) { + if (kind.refKind == refKind && + (refKind != REF_invokeStatic || refKind != REF_invokeSpecial || kind.isInterface == isInterface)){ return kind; } } - throw new IllegalArgumentException(String.format("refKind=%d", refKind)); + throw new IllegalArgumentException(String.format("refKind=%d isInterface=%s", refKind, isInterface)); } private static int tableIndex(int refKind, boolean isInterface) { diff --git a/test/jdk/java/lang/constant/MethodHandleDescTest.java b/test/jdk/java/lang/constant/MethodHandleDescTest.java index 549d0660a934a..173b1ebad9d27 100644 --- a/test/jdk/java/lang/constant/MethodHandleDescTest.java +++ b/test/jdk/java/lang/constant/MethodHandleDescTest.java @@ -53,7 +53,9 @@ import static java.lang.constant.ConstantDescs.CD_String; import static java.lang.constant.ConstantDescs.CD_int; import static java.lang.constant.ConstantDescs.CD_void; +import static java.lang.invoke.MethodHandleInfo.*; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotEquals; import static org.testng.Assert.assertNotSame; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; @@ -359,7 +361,21 @@ public void testSymbolicDescsConstants() throws ReflectiveOperationException { public void testKind() { for (Kind k : Kind.values()) { + assertEquals(Kind.valueOf(k.refKind), Kind.valueOf(k.refKind, k.refKind == MethodHandleInfo.REF_invokeInterface)); assertEquals(Kind.valueOf(k.refKind, k.isInterface), k); } + // let's now verify those cases for which the value of the isInterface parameter is ignored + int[] isInterfaceIgnored = new int[] { + REF_getField, + REF_getStatic, + REF_putField, + REF_putStatic, + REF_newInvokeSpecial, + REF_invokeInterface + }; + + for (int refKind : isInterfaceIgnored) { + assertEquals(Kind.valueOf(refKind, false), Kind.valueOf(refKind, true)); + } } }