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