From ea47769d7c21507e8dc5c2a142375485658455c7 Mon Sep 17 00:00:00 2001 From: Vicente Romero Date: Tue, 8 Jun 2021 11:52:53 -0400 Subject: [PATCH 1/2] 8267421: j.l.constant.DirectMethodHandleDesc.Kind.valueOf(int) implementation doesn't conform to the spec regarding REF_invokeInterface handling --- .../classes/java/lang/constant/DirectMethodHandleDesc.java | 2 +- test/jdk/java/lang/constant/MethodHandleDescTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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..987632ad7c8c9 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); } /** diff --git a/test/jdk/java/lang/constant/MethodHandleDescTest.java b/test/jdk/java/lang/constant/MethodHandleDescTest.java index 549d0660a934a..ac666f0b5fb5d 100644 --- a/test/jdk/java/lang/constant/MethodHandleDescTest.java +++ b/test/jdk/java/lang/constant/MethodHandleDescTest.java @@ -359,6 +359,7 @@ 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); } } From a5e1c8e5a8f101e1690a91dd137f305a9fc377db Mon Sep 17 00:00:00 2001 From: Vicente Romero Date: Thu, 10 Jun 2021 19:21:26 -0400 Subject: [PATCH 2/2] addressing review changes --- .../lang/constant/DirectMethodHandleDesc.java | 7 ++++--- .../java/lang/constant/MethodHandleDescTest.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) 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 987632ad7c8c9..e6b0e06c664e6 100644 --- a/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDesc.java +++ b/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDesc.java @@ -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 ac666f0b5fb5d..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; @@ -362,5 +364,18 @@ public void testKind() { 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)); + } } }