diff options
author | 2024-11-07 10:01:49 +0000 | |
---|---|---|
committer | 2024-11-12 14:27:31 +0000 | |
commit | 3051a5e03f32ca7aaae6041025ec60f90d41e34c (patch) | |
tree | 6d253e5c533e032ef1a43a914410d32f7e31081a /test/2277-methodhandle-invokeexact/src/ConstMethodHandleTest.java | |
parent | 20cdc427d5f5875c2d58f9fde775957ad2e28cfd (diff) |
Remove now unnecessary checks from invokeExact intrinsic.
Also rewrote tests to make sure that MethodHandle-s created via
const-method-handle and Java API behave identically. They can
be slightly different even if lookup is done in the same class
for the same method as const-method-handle can target copied
methods.
Bug: 297147201
Test: ./art/test/testrunner/testrunner.py -b --host --64
Test: ./art/test/testrunner/testrunner.py -b --jvm
Change-Id: I69cdf2c44f2838ee0e57eaa2e93a6ed5276c39fb
Diffstat (limited to 'test/2277-methodhandle-invokeexact/src/ConstMethodHandleTest.java')
-rw-r--r-- | test/2277-methodhandle-invokeexact/src/ConstMethodHandleTest.java | 532 |
1 files changed, 532 insertions, 0 deletions
diff --git a/test/2277-methodhandle-invokeexact/src/ConstMethodHandleTest.java b/test/2277-methodhandle-invokeexact/src/ConstMethodHandleTest.java new file mode 100644 index 0000000000..38b7eeb10f --- /dev/null +++ b/test/2277-methodhandle-invokeexact/src/ConstMethodHandleTest.java @@ -0,0 +1,532 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import annotations.ConstantMethodHandle; + +import java.lang.invoke.MethodHandle; + +public class ConstMethodHandleTest extends AbstractInvokeExactTest { + + @Override + void $noinline$privateMethods() throws Throwable { + // TODO(b/378051428): can't create const-method-handle targeting private methods of + // inner classes. + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "java/util/Optional", + fieldOrMethodName = "get", + descriptor = "()Ljava/lang/Object;") + private static MethodHandle constOptionalGet() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle optionalGet() { + return constOptionalGet(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "A", + fieldOrMethodName = "voidMethod", + descriptor = "()V") + private static MethodHandle constVoidMethod() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle voidMethod() { + return constVoidMethod(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "A", + fieldOrMethodName = "returnInt", + descriptor = "()I") + private static MethodHandle constReturnInt() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle returnInt() { + return constReturnInt(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "A", + fieldOrMethodName = "returnDouble", + descriptor = "()D") + private static MethodHandle constReturnDouble() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle returnDouble() { + return constReturnDouble(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_INTERFACE, + owner = "I", + fieldOrMethodName = "defaultMethod", + descriptor = "()V", + ownerIsInterface = true) + private static MethodHandle constInterfaceDefaultMethod() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle interfaceDefaultMethod() { + return constInterfaceDefaultMethod(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_INTERFACE, + owner = "I", + fieldOrMethodName = "overrideMe", + descriptor = "()V", + ownerIsInterface = true) + private static MethodHandle constOverwrittenInterfaceDefaultMethod() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle overwrittenInterfaceDefaultMethod() { + return constOverwrittenInterfaceDefaultMethod(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "A", + fieldOrMethodName = "throwException", + descriptor = "()V") + private static MethodHandle constExceptionThrowingMethod() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle exceptionThrowingMethod() { + return constExceptionThrowingMethod(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_STATIC, + owner = "A", + fieldOrMethodName = "staticMethod", + descriptor = "(LA;)Ljava/lang/String;") + private static MethodHandle constStaticMethod() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle staticMethod() { + return constStaticMethod(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(I)I") + private static MethodHandle constSumI() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sumI() { + return constSumI(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(II)I") + private static MethodHandle constSum2I() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum2I() { + return constSum2I(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(III)I") + private static MethodHandle constSum3I() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum3I() { + return constSum3I(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IIII)I") + private static MethodHandle constSum4I() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum4I() { + return constSum4I(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IIIII)I") + private static MethodHandle constSum5I() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum5I() { + return constSum5I(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IIIIII)I") + private static MethodHandle constSum6I() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum6I() { + return constSum6I(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IIIIIII)I") + private static MethodHandle constSum7I() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum7I() { + return constSum7I(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IIIIIIII)I") + private static MethodHandle constSum8I() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum8I() { + return constSum8I(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IIIIIIIII)I") + private static MethodHandle constSum9I() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum9I() { + return constSum9I(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IIIIIIIIII)I") + private static MethodHandle constSum10I() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum10I() { + return constSum10I(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IJ)J") + private static MethodHandle constSumIJ() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sumIJ() { + return constSumIJ(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IJIJ)J") + private static MethodHandle constSum2IJ() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum2IJ() { + return constSum2IJ(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IJIJIJ)J") + private static MethodHandle constSum3IJ() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum3IJ() { + return constSum3IJ(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IJIJIJIJ)J") + private static MethodHandle constSum4IJ() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum4IJ() { + return constSum4IJ(); + } + + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "Sums", + fieldOrMethodName = "sum", + descriptor = "(IJIJIJIJIJ)J") + private static MethodHandle constSum5IJ() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle sum5IJ() { + return constSum5IJ(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_INTERFACE, + owner = "Foo", + fieldOrMethodName = "nonDefault", + descriptor = "()Ljava/lang/String;", + ownerIsInterface = true) + private static MethodHandle constFooNonDefault() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle fooNonDefault() { + return constFooNonDefault(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "FooBarImpl", + fieldOrMethodName = "nonDefault", + descriptor = "()Ljava/lang/String;") + private static MethodHandle constFooBarImplNonDefault() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle fooBarImplNonDefault() { + return constFooBarImplNonDefault(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_INTERFACE, + owner = "Bar", + fieldOrMethodName = "defaultToOverride", + descriptor = "()Ljava/lang/String;", + ownerIsInterface = true) + private static MethodHandle constBarDefault() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle barDefault() { + return constBarDefault(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_INTERFACE, + owner = "Foo", + fieldOrMethodName = "defaultToOverride", + descriptor = "()Ljava/lang/String;", + ownerIsInterface = true) + private static MethodHandle constFooDefault() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle fooDefault() { + return constFooDefault(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "FooBarImpl", + fieldOrMethodName = "defaultToOverride", + descriptor = "()Ljava/lang/String;") + private static MethodHandle constFooBarImplDefault() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle fooBarImplDefault() { + return constFooBarImplDefault(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_INTERFACE, + owner = "Foo", + fieldOrMethodName = "nonOverriddenDefault", + descriptor = "()Ljava/lang/String;", + ownerIsInterface = true) + private static MethodHandle constFooNonOverriddenDefault() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle fooNonOverriddenDefault() { + return constFooNonOverriddenDefault(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_INTERFACE, + owner = "Bar", + fieldOrMethodName = "nonOverriddenDefault", + descriptor = "()Ljava/lang/String;", + ownerIsInterface = true) + private static MethodHandle constBarNonOverriddenDefault() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle barNonOverriddenDefault() { + return constBarNonOverriddenDefault(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "FooBar", + fieldOrMethodName = "definedInAbstract", + descriptor = "()Ljava/lang/String;") + private static MethodHandle constFooBarDefinedInAbstract() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle fooBarDefinedInAbstract() { + return constFooBarDefinedInAbstract(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "FooBarImpl", + fieldOrMethodName = "definedInAbstract", + descriptor = "()Ljava/lang/String;") + private static MethodHandle constFooBarImplDefinedInAbstract() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle fooBarImplDefinedInAbstract() { + return constFooBarImplDefinedInAbstract(); + } + + @ConstantMethodHandle( + kind = ConstantMethodHandle.INVOKE_VIRTUAL, + owner = "FooBar", + fieldOrMethodName = "nonDefault", + descriptor = "()Ljava/lang/String;") + private static MethodHandle constFooBarNonDefault() { + unreachable("should be replaced by const-method-handle"); + return null; + } + + @Override + public MethodHandle fooBarNonDefault() { + return constFooBarNonDefault(); + } + +} |