[jdk17] RFR: 8267421: j.l.constant.DirectMethodHandleDesc.Kind.valueOf(int) implementation doesn't conform to the spec regarding REF_invokeInterface handling [v2]

Mandy Chung mchung at openjdk.java.net
Tue Jun 22 00:48:32 UTC 2021


On Fri, 11 Jun 2021 18:17:10 GMT, Vicente Romero <vromero at openjdk.org> wrote:

>> This PR is a copy of [PR-4416](https://github.com/openjdk/jdk/pull/4416) which was intended to openjdk/jdk.
>> 
>> Please review this PR which is syncing the implementation of `DirectMethodHandleDesc.Kind.valueOf(int)` and `DirectMethodHandleDesc.Kind.valueOf(int, boolean)` with its spec. My reading of the method's spec is that if the value of the refKind parameter is: MethodHandleInfo.REF_invokeInterface, then DirectMethodHandleDesc.Kind.valueOf(int, boolean) should be called with a value of true for its second argument, currently it is invoked with false regardless of the value of the refKind parameter
>> 
>> TIA
>
> Vicente Romero has updated the pull request incrementally with one additional commit since the last revision:
> 
>   updating after review comments

Marked as reviewed by mchung (Reviewer).

src/java.base/share/classes/java/lang/constant/DirectMethodHandleDesc.java line 138:

> 136:             int i = tableIndex(refKind, isInterface);
> 137:             if (i >= 2 && i < TABLE.length) {
> 138:                 return TABLE[i];

This fix looks good.   The resulting `TABLE` has two entries per `refKind` for `isInterface` = `true` and `false`.

test/jdk/java/lang/constant/MethodHandleDescTest.java line 379:

> 377:         for (int refKind : isInterfaceIgnored) {
> 378:             assertEquals(Kind.valueOf(refKind, false), Kind.valueOf(refKind, true));
> 379:         }

Can you also add the test cases to verify `Kind::valueOf` with `REF_invokeStatic` and `REF_invokeSpecial`?

-------------

PR: https://git.openjdk.java.net/jdk17/pull/29


More information about the core-libs-dev mailing list