xref: /aosp_15_r20/art/test/2277-methodhandle-invokeexact/src/AbstractInvokeExactTest.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodHandle;
18*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.WrongMethodTypeException;
19*795d594fSAndroid Build Coastguard Worker import java.util.Objects;
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker public abstract class AbstractInvokeExactTest {
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker   public static String STATUS = "";
24*795d594fSAndroid Build Coastguard Worker 
runAll()25*795d594fSAndroid Build Coastguard Worker   public final void runAll() throws Throwable {
26*795d594fSAndroid Build Coastguard Worker     STATUS = "";
27*795d594fSAndroid Build Coastguard Worker     Multi.$noinline$testMHFromMain(optionalGet());
28*795d594fSAndroid Build Coastguard Worker     $noinline$privateMethods();
29*795d594fSAndroid Build Coastguard Worker     $noinline$testNoArgsCalls();
30*795d594fSAndroid Build Coastguard Worker     $noinline$nullchecks();
31*795d594fSAndroid Build Coastguard Worker     $noinline$testWithArgs();
32*795d594fSAndroid Build Coastguard Worker     $noinline$interfaceChecks();
33*795d594fSAndroid Build Coastguard Worker     $noinline$abstractClass();
34*795d594fSAndroid Build Coastguard Worker   }
35*795d594fSAndroid Build Coastguard Worker 
36*795d594fSAndroid Build Coastguard Worker   // There is no privateLookupIn for const-method-handle.
$noinline$privateMethods()37*795d594fSAndroid Build Coastguard Worker   abstract void $noinline$privateMethods() throws Throwable;
38*795d594fSAndroid Build Coastguard Worker 
$noinline$testNoArgsCalls()39*795d594fSAndroid Build Coastguard Worker   private void $noinline$testNoArgsCalls() throws Throwable {
40*795d594fSAndroid Build Coastguard Worker     voidMethod().invokeExact(new A());
41*795d594fSAndroid Build Coastguard Worker     assertEquals("A.voidMethod", STATUS);
42*795d594fSAndroid Build Coastguard Worker 
43*795d594fSAndroid Build Coastguard Worker     int returnedInt = (int) returnInt().invokeExact(new A());
44*795d594fSAndroid Build Coastguard Worker     assertEquals(42, returnedInt);
45*795d594fSAndroid Build Coastguard Worker 
46*795d594fSAndroid Build Coastguard Worker     double returnedDouble = (double) returnDouble().invokeExact(new A());
47*795d594fSAndroid Build Coastguard Worker     assertEquals(42.0d, returnedDouble);
48*795d594fSAndroid Build Coastguard Worker     try {
49*795d594fSAndroid Build Coastguard Worker       interfaceDefaultMethod().invokeExact(new A());
50*795d594fSAndroid Build Coastguard Worker       unreachable("MethodHandle's type is (Main$I)V, but callsite is (Main$A)V");
51*795d594fSAndroid Build Coastguard Worker     } catch (WrongMethodTypeException expected) {}
52*795d594fSAndroid Build Coastguard Worker 
53*795d594fSAndroid Build Coastguard Worker     interfaceDefaultMethod().invokeExact((I) new A());
54*795d594fSAndroid Build Coastguard Worker     assertEquals("I.defaultMethod", STATUS);
55*795d594fSAndroid Build Coastguard Worker 
56*795d594fSAndroid Build Coastguard Worker     overwrittenInterfaceDefaultMethod().invokeExact((I) new A());
57*795d594fSAndroid Build Coastguard Worker     assertEquals("A.overrideMe", STATUS);
58*795d594fSAndroid Build Coastguard Worker 
59*795d594fSAndroid Build Coastguard Worker 
60*795d594fSAndroid Build Coastguard Worker     try {
61*795d594fSAndroid Build Coastguard Worker       exceptionThrowingMethod().invokeExact(new A());
62*795d594fSAndroid Build Coastguard Worker       unreachable("Target method always throws");
63*795d594fSAndroid Build Coastguard Worker     } catch (MyRuntimeException expected) {
64*795d594fSAndroid Build Coastguard Worker       assertEquals("A.throwException", STATUS);
65*795d594fSAndroid Build Coastguard Worker     }
66*795d594fSAndroid Build Coastguard Worker 
67*795d594fSAndroid Build Coastguard Worker     try {
68*795d594fSAndroid Build Coastguard Worker       returnInt().invokeExact(new A());
69*795d594fSAndroid Build Coastguard Worker       unreachable("MethodHandle's type is (Main$A)I, but callsite type is (Main$A)V");
70*795d594fSAndroid Build Coastguard Worker     } catch (WrongMethodTypeException expected) {}
71*795d594fSAndroid Build Coastguard Worker 
72*795d594fSAndroid Build Coastguard Worker     String returnedString = (String) staticMethod().invokeExact(new A());
73*795d594fSAndroid Build Coastguard Worker     assertEquals("staticMethod", returnedString);
74*795d594fSAndroid Build Coastguard Worker   }
75*795d594fSAndroid Build Coastguard Worker 
$noinline$nullchecks()76*795d594fSAndroid Build Coastguard Worker   private void $noinline$nullchecks() throws Throwable {
77*795d594fSAndroid Build Coastguard Worker     try {
78*795d594fSAndroid Build Coastguard Worker       voidMethod().invokeExact((A) null);
79*795d594fSAndroid Build Coastguard Worker       unreachable("Receiver is null, should throw NPE");
80*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException expected) {}
81*795d594fSAndroid Build Coastguard Worker 
82*795d594fSAndroid Build Coastguard Worker     try {
83*795d594fSAndroid Build Coastguard Worker       voidMethod().invokeExact((Main) null);
84*795d594fSAndroid Build Coastguard Worker       unreachable("Should throw WMTE: input is of wrong type");
85*795d594fSAndroid Build Coastguard Worker     } catch (WrongMethodTypeException expected) {}
86*795d594fSAndroid Build Coastguard Worker 
87*795d594fSAndroid Build Coastguard Worker     try {
88*795d594fSAndroid Build Coastguard Worker       interfaceDefaultMethod().invokeExact((I) null);
89*795d594fSAndroid Build Coastguard Worker       unreachable("Receiver is null, should throw NPE");
90*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException expected) {}
91*795d594fSAndroid Build Coastguard Worker 
92*795d594fSAndroid Build Coastguard Worker     try {
93*795d594fSAndroid Build Coastguard Worker       interfaceDefaultMethod().invokeExact((A) null);
94*795d594fSAndroid Build Coastguard Worker       unreachable("Should throw WMTE: input is of wrong type");
95*795d594fSAndroid Build Coastguard Worker     } catch (WrongMethodTypeException expected) {}
96*795d594fSAndroid Build Coastguard Worker 
97*795d594fSAndroid Build Coastguard Worker     try {
98*795d594fSAndroid Build Coastguard Worker       MethodHandle mh = $noinline$nullMethodHandle();
99*795d594fSAndroid Build Coastguard Worker       mh.invokeExact();
100*795d594fSAndroid Build Coastguard Worker       unreachable("MethodHandle object is null, should throw NPE");
101*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException expected) {}
102*795d594fSAndroid Build Coastguard Worker   }
103*795d594fSAndroid Build Coastguard Worker 
$noinline$nullMethodHandle()104*795d594fSAndroid Build Coastguard Worker   private static MethodHandle $noinline$nullMethodHandle() {
105*795d594fSAndroid Build Coastguard Worker     return null;
106*795d594fSAndroid Build Coastguard Worker   }
107*795d594fSAndroid Build Coastguard Worker 
$noinline$testWithArgs()108*795d594fSAndroid Build Coastguard Worker   private void $noinline$testWithArgs() throws Throwable {
109*795d594fSAndroid Build Coastguard Worker     int sum = (int) sumI().invokeExact(new Sums(), 1);
110*795d594fSAndroid Build Coastguard Worker     assertEquals(1, sum);
111*795d594fSAndroid Build Coastguard Worker 
112*795d594fSAndroid Build Coastguard Worker     sum = (int) sum2I().invokeExact(new Sums(), 1, 2);
113*795d594fSAndroid Build Coastguard Worker     assertEquals(3, sum);
114*795d594fSAndroid Build Coastguard Worker 
115*795d594fSAndroid Build Coastguard Worker     sum = (int) sum3I().invokeExact(new Sums(), 1, 2, 3);
116*795d594fSAndroid Build Coastguard Worker     assertEquals(6, sum);
117*795d594fSAndroid Build Coastguard Worker 
118*795d594fSAndroid Build Coastguard Worker     sum = (int) sum4I().invokeExact(new Sums(), 1, 2, 3, 4);
119*795d594fSAndroid Build Coastguard Worker     assertEquals(10, sum);
120*795d594fSAndroid Build Coastguard Worker 
121*795d594fSAndroid Build Coastguard Worker     sum = (int) sum5I().invokeExact(new Sums(), 1, 2, 3, 4, 5);
122*795d594fSAndroid Build Coastguard Worker     assertEquals(15, sum);
123*795d594fSAndroid Build Coastguard Worker 
124*795d594fSAndroid Build Coastguard Worker     sum = (int) sum6I().invokeExact(new Sums(), 1, 2, 3, 4, 5, 6);
125*795d594fSAndroid Build Coastguard Worker     assertEquals(21, sum);
126*795d594fSAndroid Build Coastguard Worker 
127*795d594fSAndroid Build Coastguard Worker     sum = (int) sum7I().invokeExact(new Sums(), 1, 2, 3, 4, 5, 6, 7);
128*795d594fSAndroid Build Coastguard Worker     assertEquals(28, sum);
129*795d594fSAndroid Build Coastguard Worker 
130*795d594fSAndroid Build Coastguard Worker     sum = (int) sum8I().invokeExact(new Sums(), 1, 2, 3, 4, 5, 6, 7, 8);
131*795d594fSAndroid Build Coastguard Worker     assertEquals(36, sum);
132*795d594fSAndroid Build Coastguard Worker 
133*795d594fSAndroid Build Coastguard Worker     sum = (int) sum9I().invokeExact(new Sums(), 1, 2, 3, 4, 5, 6, 7, 8, 9);
134*795d594fSAndroid Build Coastguard Worker     assertEquals(45, sum);
135*795d594fSAndroid Build Coastguard Worker 
136*795d594fSAndroid Build Coastguard Worker     sum = (int) sum10I().invokeExact(new Sums(), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
137*795d594fSAndroid Build Coastguard Worker     assertEquals(55, sum);
138*795d594fSAndroid Build Coastguard Worker 
139*795d594fSAndroid Build Coastguard Worker     long lsum = (long) sumIJ().invokeExact(new Sums(), 1, 2L);
140*795d594fSAndroid Build Coastguard Worker     assertEquals(3L, lsum);
141*795d594fSAndroid Build Coastguard Worker 
142*795d594fSAndroid Build Coastguard Worker     lsum = (long) sum2IJ().invokeExact(new Sums(), 1, 2L, 3, 4L);
143*795d594fSAndroid Build Coastguard Worker     assertEquals(10L, lsum);
144*795d594fSAndroid Build Coastguard Worker 
145*795d594fSAndroid Build Coastguard Worker     lsum = (long) sum3IJ().invokeExact(new Sums(), 1, 2L, 3, 4L, 5, 6L);
146*795d594fSAndroid Build Coastguard Worker     assertEquals(21L, lsum);
147*795d594fSAndroid Build Coastguard Worker 
148*795d594fSAndroid Build Coastguard Worker     lsum = (long) sum4IJ().invokeExact(new Sums(), 1, 2L, 3, 4L, 5, 6L, 7, 8L);
149*795d594fSAndroid Build Coastguard Worker     assertEquals(36L, lsum);
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker     lsum = (long) sum5IJ().invokeExact(new Sums(), 1, 2L, 3, 4L, 5, 6L, 7, 8L, 9, 10L);
152*795d594fSAndroid Build Coastguard Worker     assertEquals(55L, lsum);
153*795d594fSAndroid Build Coastguard Worker   }
154*795d594fSAndroid Build Coastguard Worker 
$noinline$interfaceChecks()155*795d594fSAndroid Build Coastguard Worker   private void $noinline$interfaceChecks() throws Throwable {
156*795d594fSAndroid Build Coastguard Worker     FooBarImpl instance = new FooBarImpl();
157*795d594fSAndroid Build Coastguard Worker 
158*795d594fSAndroid Build Coastguard Worker     String result = null;
159*795d594fSAndroid Build Coastguard Worker     result = (String) fooNonDefault().invokeExact((Foo) instance);
160*795d594fSAndroid Build Coastguard Worker     assertEquals("FooBarImpl.nonDefault", result);
161*795d594fSAndroid Build Coastguard Worker 
162*795d594fSAndroid Build Coastguard Worker     result = (String) fooBarImplNonDefault().invokeExact(instance);
163*795d594fSAndroid Build Coastguard Worker     assertEquals("FooBarImpl.nonDefault", result);
164*795d594fSAndroid Build Coastguard Worker 
165*795d594fSAndroid Build Coastguard Worker     result = (String) barDefault().invokeExact((Bar) instance);
166*795d594fSAndroid Build Coastguard Worker     assertEquals("Bar.defaultToOverride", result);
167*795d594fSAndroid Build Coastguard Worker 
168*795d594fSAndroid Build Coastguard Worker     result = (String) fooDefault().invokeExact((Foo) instance);
169*795d594fSAndroid Build Coastguard Worker     assertEquals("Bar.defaultToOverride", result);
170*795d594fSAndroid Build Coastguard Worker 
171*795d594fSAndroid Build Coastguard Worker     result = (String) fooBarImplDefault().invokeExact(instance);
172*795d594fSAndroid Build Coastguard Worker     assertEquals("Bar.defaultToOverride", result);
173*795d594fSAndroid Build Coastguard Worker 
174*795d594fSAndroid Build Coastguard Worker     result = (String) fooNonOverriddenDefault().invokeExact((Foo) instance);
175*795d594fSAndroid Build Coastguard Worker     assertEquals("Foo.nonOverriddenDefault", result);
176*795d594fSAndroid Build Coastguard Worker 
177*795d594fSAndroid Build Coastguard Worker     result = (String) barNonOverriddenDefault().invokeExact((Bar) instance);
178*795d594fSAndroid Build Coastguard Worker     assertEquals("Foo.nonOverriddenDefault", result);
179*795d594fSAndroid Build Coastguard Worker 
180*795d594fSAndroid Build Coastguard Worker     ToStringable toStringable = new ToStringableImpl();
181*795d594fSAndroid Build Coastguard Worker     result = (String) toStringDefinedInAnInterface().invokeExact(toStringable);
182*795d594fSAndroid Build Coastguard Worker     assertEquals("ToStringableImpl", result);
183*795d594fSAndroid Build Coastguard Worker 
184*795d594fSAndroid Build Coastguard Worker     try {
185*795d594fSAndroid Build Coastguard Worker       String ignored = (String) toStringDefinedInAnInterface().invokeExact(instance);
186*795d594fSAndroid Build Coastguard Worker       unreachable("Should throw WMTE");
187*795d594fSAndroid Build Coastguard Worker     } catch (WrongMethodTypeException expected) {}
188*795d594fSAndroid Build Coastguard Worker 
189*795d594fSAndroid Build Coastguard Worker     Impl1 impl1 = new Impl1();
190*795d594fSAndroid Build Coastguard Worker 
191*795d594fSAndroid Build Coastguard Worker     result = (String) interfaceOneMethod().invokeExact((Interface1) impl1);
192*795d594fSAndroid Build Coastguard Worker     assertEquals("Impl1.methodOne", result);
193*795d594fSAndroid Build Coastguard Worker 
194*795d594fSAndroid Build Coastguard Worker     Impl2 impl2 = new Impl2();
195*795d594fSAndroid Build Coastguard Worker 
196*795d594fSAndroid Build Coastguard Worker     result = (String) interfaceTwoMethod().invokeExact((Interface2) impl2);
197*795d594fSAndroid Build Coastguard Worker     assertEquals("Impl2.methodTwo", result);
198*795d594fSAndroid Build Coastguard Worker 
199*795d594fSAndroid Build Coastguard Worker     result = (String) interfaceOneMethod().invokeExact((Interface1) impl2);
200*795d594fSAndroid Build Coastguard Worker     assertEquals("Impl2.methodOne", result);
201*795d594fSAndroid Build Coastguard Worker 
202*795d594fSAndroid Build Coastguard Worker     Impl3 impl3 = new Impl3();
203*795d594fSAndroid Build Coastguard Worker 
204*795d594fSAndroid Build Coastguard Worker     result = (String) interfaceThreeMethod().invokeExact((Interface3) impl3);
205*795d594fSAndroid Build Coastguard Worker     assertEquals("Impl3.methodThree", result);
206*795d594fSAndroid Build Coastguard Worker 
207*795d594fSAndroid Build Coastguard Worker     result = (String) interfaceTwoMethod().invokeExact((Interface2) impl3);
208*795d594fSAndroid Build Coastguard Worker     assertEquals("Impl3.methodTwo", result);
209*795d594fSAndroid Build Coastguard Worker 
210*795d594fSAndroid Build Coastguard Worker     result = (String) interfaceOneMethod().invokeExact((Interface1) impl3);
211*795d594fSAndroid Build Coastguard Worker     assertEquals("Impl3.methodOne", result);
212*795d594fSAndroid Build Coastguard Worker 
213*795d594fSAndroid Build Coastguard Worker     Impl4 impl4 = new Impl4();
214*795d594fSAndroid Build Coastguard Worker 
215*795d594fSAndroid Build Coastguard Worker     result = (String) interfaceFourMethod().invokeExact((Interface4) impl4);
216*795d594fSAndroid Build Coastguard Worker     assertEquals("Impl4.methodFour", result);
217*795d594fSAndroid Build Coastguard Worker 
218*795d594fSAndroid Build Coastguard Worker     result = (String) interfaceThreeMethod().invokeExact((Interface3) impl4);
219*795d594fSAndroid Build Coastguard Worker     assertEquals("Impl4.methodThree", result);
220*795d594fSAndroid Build Coastguard Worker 
221*795d594fSAndroid Build Coastguard Worker     result = (String) interfaceTwoMethod().invokeExact((Interface2) impl4);
222*795d594fSAndroid Build Coastguard Worker     assertEquals("Impl4.methodTwo", result);
223*795d594fSAndroid Build Coastguard Worker 
224*795d594fSAndroid Build Coastguard Worker     result = (String) interfaceOneMethod().invokeExact((Interface1) impl4);
225*795d594fSAndroid Build Coastguard Worker     assertEquals("Impl4.methodOne", result);
226*795d594fSAndroid Build Coastguard Worker 
227*795d594fSAndroid Build Coastguard Worker     FooAndFooConflictImpl conflictImpl = new FooAndFooConflictImpl();
228*795d594fSAndroid Build Coastguard Worker 
229*795d594fSAndroid Build Coastguard Worker     result = (String) fooDefault().invokeExact((Foo) conflictImpl);
230*795d594fSAndroid Build Coastguard Worker     assertEquals("DefaultMethodConflictImpl.defaultToOverride", result);
231*795d594fSAndroid Build Coastguard Worker 
232*795d594fSAndroid Build Coastguard Worker     FooAndFooConflict fooAndFooConflict = new FooAndFooConflict() {
233*795d594fSAndroid Build Coastguard Worker       public String nonDefault() {
234*795d594fSAndroid Build Coastguard Worker         throw new UnsupportedOperationException();
235*795d594fSAndroid Build Coastguard Worker       }
236*795d594fSAndroid Build Coastguard Worker     };
237*795d594fSAndroid Build Coastguard Worker 
238*795d594fSAndroid Build Coastguard Worker     // TODO(b/297147201): The RI throws AbsractMethodError in these cases, just like plain
239*795d594fSAndroid Build Coastguard Worker     // fooAndFooConflict.defaultToOverride() call. So RI's invokeExact follows "equivalent of a
240*795d594fSAndroid Build Coastguard Worker     // particular bytecode behavior". ART throws ICCE in both cases, so current implementation of
241*795d594fSAndroid Build Coastguard Worker     // invokeExact does not break "equivalent ..." part of the javadoc.
242*795d594fSAndroid Build Coastguard Worker     // Need to check what the spec says about the error thrown when a conflicting default method is
243*795d594fSAndroid Build Coastguard Worker     // attempted to be called.
244*795d594fSAndroid Build Coastguard Worker     try {
245*795d594fSAndroid Build Coastguard Worker       String ignored = (String) fooAndFooConflictDefault().invokeExact(fooAndFooConflict);
246*795d594fSAndroid Build Coastguard Worker       unreachable("Non-overridden default conflict method");
247*795d594fSAndroid Build Coastguard Worker     } catch (IncompatibleClassChangeError expected) {}
248*795d594fSAndroid Build Coastguard Worker 
249*795d594fSAndroid Build Coastguard Worker     try {
250*795d594fSAndroid Build Coastguard Worker       String ignored = (String) fooDefault().invokeExact((Foo) fooAndFooConflict);
251*795d594fSAndroid Build Coastguard Worker       unreachable("Non-overridden default conflict method");
252*795d594fSAndroid Build Coastguard Worker     } catch (IncompatibleClassChangeError expected) {}
253*795d594fSAndroid Build Coastguard Worker 
254*795d594fSAndroid Build Coastguard Worker     BaseInterface baseClassImpl = new BaseClassImpl();
255*795d594fSAndroid Build Coastguard Worker     try {
256*795d594fSAndroid Build Coastguard Worker       String ignored = (String) baseInterface().invokeExact(baseClassImpl);
257*795d594fSAndroid Build Coastguard Worker       unreachable("Calling unimplemented interface method");
258*795d594fSAndroid Build Coastguard Worker     } catch (AbstractMethodError expected) {}
259*795d594fSAndroid Build Coastguard Worker   }
260*795d594fSAndroid Build Coastguard Worker 
$noinline$abstractClass()261*795d594fSAndroid Build Coastguard Worker   private void $noinline$abstractClass() throws Throwable {
262*795d594fSAndroid Build Coastguard Worker     FooBarImpl instance = new FooBarImpl();
263*795d594fSAndroid Build Coastguard Worker 
264*795d594fSAndroid Build Coastguard Worker     String result = null;
265*795d594fSAndroid Build Coastguard Worker     result = (String) fooBarDefinedInAbstract().invokeExact((FooBar) instance);
266*795d594fSAndroid Build Coastguard Worker     assertEquals("FooBar.definedInAbstract", result);
267*795d594fSAndroid Build Coastguard Worker 
268*795d594fSAndroid Build Coastguard Worker     result = (String) fooBarImplDefinedInAbstract().invokeExact(instance);
269*795d594fSAndroid Build Coastguard Worker     assertEquals("FooBar.definedInAbstract", result);
270*795d594fSAndroid Build Coastguard Worker 
271*795d594fSAndroid Build Coastguard Worker     FooBar fooBar = new FooBar() {
272*795d594fSAndroid Build Coastguard Worker       @Override
273*795d594fSAndroid Build Coastguard Worker       public String nonDefault() {
274*795d594fSAndroid Build Coastguard Worker         return "anonymous.nonDefault";
275*795d594fSAndroid Build Coastguard Worker       }
276*795d594fSAndroid Build Coastguard Worker     };
277*795d594fSAndroid Build Coastguard Worker 
278*795d594fSAndroid Build Coastguard Worker     result = (String) fooBarDefinedInAbstract().invokeExact(fooBar);
279*795d594fSAndroid Build Coastguard Worker     assertEquals("FooBar.definedInAbstract", result);
280*795d594fSAndroid Build Coastguard Worker 
281*795d594fSAndroid Build Coastguard Worker     result = (String) fooBarNonDefault().invokeExact(fooBar);
282*795d594fSAndroid Build Coastguard Worker     assertEquals("anonymous.nonDefault", result);
283*795d594fSAndroid Build Coastguard Worker   }
284*795d594fSAndroid Build Coastguard Worker 
assertEquals(Object expected, Object actual)285*795d594fSAndroid Build Coastguard Worker   static void assertEquals(Object expected, Object actual) {
286*795d594fSAndroid Build Coastguard Worker     if (!Objects.equals(expected, actual)) {
287*795d594fSAndroid Build Coastguard Worker       throw new AssertionError("Expected: " + expected + ", got: " + actual);
288*795d594fSAndroid Build Coastguard Worker     }
289*795d594fSAndroid Build Coastguard Worker   }
290*795d594fSAndroid Build Coastguard Worker 
assertEquals(int expected, int actual)291*795d594fSAndroid Build Coastguard Worker   private static void assertEquals(int expected, int actual) {
292*795d594fSAndroid Build Coastguard Worker     if (expected != actual) {
293*795d594fSAndroid Build Coastguard Worker       throw new AssertionError("Expected: " + expected + ", got: " + actual);
294*795d594fSAndroid Build Coastguard Worker     }
295*795d594fSAndroid Build Coastguard Worker   }
296*795d594fSAndroid Build Coastguard Worker 
assertEquals(long expected, long actual)297*795d594fSAndroid Build Coastguard Worker   private static void assertEquals(long expected, long actual) {
298*795d594fSAndroid Build Coastguard Worker     if (expected != actual) {
299*795d594fSAndroid Build Coastguard Worker       throw new AssertionError("Expected: " + expected + ", got: " + actual);
300*795d594fSAndroid Build Coastguard Worker     }
301*795d594fSAndroid Build Coastguard Worker   }
302*795d594fSAndroid Build Coastguard Worker 
assertEquals(double expected, double actual)303*795d594fSAndroid Build Coastguard Worker   private static void assertEquals(double expected, double actual) {
304*795d594fSAndroid Build Coastguard Worker     if (expected != actual) {
305*795d594fSAndroid Build Coastguard Worker       throw new AssertionError("Expected: " + expected + ", got: " + actual);
306*795d594fSAndroid Build Coastguard Worker     }
307*795d594fSAndroid Build Coastguard Worker   }
308*795d594fSAndroid Build Coastguard Worker 
unreachable(String msg)309*795d594fSAndroid Build Coastguard Worker   static void unreachable(String msg) {
310*795d594fSAndroid Build Coastguard Worker     throw new AssertionError("Unexpectedly reached this point, but shouldn't: " + msg);
311*795d594fSAndroid Build Coastguard Worker   }
312*795d594fSAndroid Build Coastguard Worker 
optionalGet()313*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle optionalGet();
314*795d594fSAndroid Build Coastguard Worker 
voidMethod()315*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle voidMethod();
returnInt()316*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle returnInt();
returnDouble()317*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle returnDouble();
interfaceDefaultMethod()318*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle interfaceDefaultMethod();
overwrittenInterfaceDefaultMethod()319*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle overwrittenInterfaceDefaultMethod();
exceptionThrowingMethod()320*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle exceptionThrowingMethod();
staticMethod()321*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle staticMethod();
322*795d594fSAndroid Build Coastguard Worker 
sumI()323*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sumI();
sum2I()324*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum2I();
sum3I()325*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum3I();
sum4I()326*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum4I();
sum5I()327*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum5I();
sum6I()328*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum6I();
sum7I()329*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum7I();
sum8I()330*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum8I();
sum9I()331*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum9I();
sum10I()332*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum10I();
sumIJ()333*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sumIJ();
sum2IJ()334*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum2IJ();
sum3IJ()335*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum3IJ();
sum4IJ()336*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum4IJ();
sum5IJ()337*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle sum5IJ();
338*795d594fSAndroid Build Coastguard Worker 
fooNonDefault()339*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle fooNonDefault();
fooBarImplNonDefault()340*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle fooBarImplNonDefault();
barDefault()341*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle barDefault();
fooDefault()342*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle fooDefault();
fooBarImplDefault()343*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle fooBarImplDefault();
fooNonOverriddenDefault()344*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle fooNonOverriddenDefault();
barNonOverriddenDefault()345*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle barNonOverriddenDefault();
toStringDefinedInAnInterface()346*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle toStringDefinedInAnInterface();
347*795d594fSAndroid Build Coastguard Worker 
interfaceOneMethod()348*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle interfaceOneMethod();
interfaceTwoMethod()349*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle interfaceTwoMethod();
interfaceThreeMethod()350*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle interfaceThreeMethod();
interfaceFourMethod()351*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle interfaceFourMethod();
352*795d594fSAndroid Build Coastguard Worker 
fooBarDefinedInAbstract()353*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle fooBarDefinedInAbstract();
fooBarImplDefinedInAbstract()354*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle fooBarImplDefinedInAbstract();
fooBarNonDefault()355*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle fooBarNonDefault();
fooAndFooConflictDefault()356*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle fooAndFooConflictDefault();
baseInterface()357*795d594fSAndroid Build Coastguard Worker   public abstract MethodHandle baseInterface();
358*795d594fSAndroid Build Coastguard Worker }
359