/* * 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(); } @ConstantMethodHandle( kind = ConstantMethodHandle.INVOKE_INTERFACE, owner = "ToStringable", fieldOrMethodName = "toString", descriptor = "()Ljava/lang/String;", ownerIsInterface = true) private static MethodHandle constToStringDefinedInAnInterface() { unreachable("should be replaced by const-method-handle"); return null; } @Override public MethodHandle toStringDefinedInAnInterface() { return constToStringDefinedInAnInterface(); } @ConstantMethodHandle( kind = ConstantMethodHandle.INVOKE_INTERFACE, owner = "Interface1", fieldOrMethodName = "methodOne", descriptor = "()Ljava/lang/String;", ownerIsInterface = true) private static MethodHandle constInterfaceOneMethod() { unreachable("should be replaced by const-method-handle"); return null; } @Override public MethodHandle interfaceOneMethod() { return constInterfaceOneMethod(); } @ConstantMethodHandle( kind = ConstantMethodHandle.INVOKE_INTERFACE, owner = "Interface2", fieldOrMethodName = "methodTwo", descriptor = "()Ljava/lang/String;", ownerIsInterface = true) private static MethodHandle constInterfaceTwoMethod() { unreachable("should be replaced by const-method-handle"); return null; } @Override public MethodHandle interfaceTwoMethod() { return constInterfaceTwoMethod(); } @ConstantMethodHandle( kind = ConstantMethodHandle.INVOKE_INTERFACE, owner = "Interface3", fieldOrMethodName = "methodThree", descriptor = "()Ljava/lang/String;", ownerIsInterface = true) private static MethodHandle constInterfaceThreeMethod() { unreachable("should be replaced by const-method-handle"); return null; } @Override public MethodHandle interfaceThreeMethod() { return constInterfaceThreeMethod(); } @ConstantMethodHandle( kind = ConstantMethodHandle.INVOKE_INTERFACE, owner = "Interface4", fieldOrMethodName = "methodFour", descriptor = "()Ljava/lang/String;", ownerIsInterface = true) private static MethodHandle constInterfaceFourMethod() { unreachable("should be replaced by const-method-handle"); return null; } @Override public MethodHandle interfaceFourMethod() { return constInterfaceFourMethod(); } @ConstantMethodHandle( kind = ConstantMethodHandle.INVOKE_INTERFACE, owner = "FooAndFooConflict", fieldOrMethodName = "defaultToOverride", descriptor = "()Ljava/lang/String;", ownerIsInterface = true) private static MethodHandle constFooAndFooConflictDefault() { unreachable("should be replaced by const-method-handle"); return null; } @Override public MethodHandle fooAndFooConflictDefault() { return constFooAndFooConflictDefault(); } @ConstantMethodHandle( kind = ConstantMethodHandle.INVOKE_INTERFACE, owner = "BaseInterface", fieldOrMethodName = "method", descriptor = "()Ljava/lang/String;", ownerIsInterface = true) private static MethodHandle constBaseInterface() { unreachable("should be replaced by const-method-handle"); return null; } @Override public MethodHandle baseInterface() { return constBaseInterface(); } }