176e6adb99db915381da89615f303b3b190c547b1Orion Hodson/* 276e6adb99db915381da89615f303b3b190c547b1Orion Hodson * Copyright (C) 2017 The Android Open Source Project 376e6adb99db915381da89615f303b3b190c547b1Orion Hodson * 476e6adb99db915381da89615f303b3b190c547b1Orion Hodson * Licensed under the Apache License, Version 2.0 (the "License"); 576e6adb99db915381da89615f303b3b190c547b1Orion Hodson * you may not use this file except in compliance with the License. 676e6adb99db915381da89615f303b3b190c547b1Orion Hodson * You may obtain a copy of the License at 776e6adb99db915381da89615f303b3b190c547b1Orion Hodson * 876e6adb99db915381da89615f303b3b190c547b1Orion Hodson * http://www.apache.org/licenses/LICENSE-2.0 976e6adb99db915381da89615f303b3b190c547b1Orion Hodson * 1076e6adb99db915381da89615f303b3b190c547b1Orion Hodson * Unless required by applicable law or agreed to in writing, software 1176e6adb99db915381da89615f303b3b190c547b1Orion Hodson * distributed under the License is distributed on an "AS IS" BASIS, 1276e6adb99db915381da89615f303b3b190c547b1Orion Hodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1376e6adb99db915381da89615f303b3b190c547b1Orion Hodson * See the License for the specific language governing permissions and 1476e6adb99db915381da89615f303b3b190c547b1Orion Hodson * limitations under the License. 1576e6adb99db915381da89615f303b3b190c547b1Orion Hodson */ 1676e6adb99db915381da89615f303b3b190c547b1Orion Hodson 1776e6adb99db915381da89615f303b3b190c547b1Orion Hodsonimport java.lang.invoke.CallSite; 1876e6adb99db915381da89615f303b3b190c547b1Orion Hodsonimport java.lang.invoke.MethodType; 1976e6adb99db915381da89615f303b3b190c547b1Orion Hodsonimport java.lang.invoke.MutableCallSite; 2076e6adb99db915381da89615f303b3b190c547b1Orion Hodson 2176e6adb99db915381da89615f303b3b190c547b1Orion Hodsonpublic class Main extends TestBase { 2276e6adb99db915381da89615f303b3b190c547b1Orion Hodson 2376e6adb99db915381da89615f303b3b190c547b1Orion Hodson private static void TestUninitializedCallSite() throws Throwable { 2476e6adb99db915381da89615f303b3b190c547b1Orion Hodson CallSite callSite = new MutableCallSite(MethodType.methodType(int.class)); 2576e6adb99db915381da89615f303b3b190c547b1Orion Hodson try { 2676e6adb99db915381da89615f303b3b190c547b1Orion Hodson callSite.getTarget().invoke(); 2776e6adb99db915381da89615f303b3b190c547b1Orion Hodson fail(); 2876e6adb99db915381da89615f303b3b190c547b1Orion Hodson } catch (IllegalStateException e) { 2976e6adb99db915381da89615f303b3b190c547b1Orion Hodson System.out.println("Caught exception from uninitialized call site"); 3076e6adb99db915381da89615f303b3b190c547b1Orion Hodson } 3176e6adb99db915381da89615f303b3b190c547b1Orion Hodson 3276e6adb99db915381da89615f303b3b190c547b1Orion Hodson callSite = new MutableCallSite(MethodType.methodType(String.class, int.class, char.class)); 3376e6adb99db915381da89615f303b3b190c547b1Orion Hodson try { 3476e6adb99db915381da89615f303b3b190c547b1Orion Hodson callSite.getTarget().invoke(1535, 'd'); 3576e6adb99db915381da89615f303b3b190c547b1Orion Hodson fail(); 3676e6adb99db915381da89615f303b3b190c547b1Orion Hodson } catch (IllegalStateException e) { 3776e6adb99db915381da89615f303b3b190c547b1Orion Hodson System.out.println("Caught exception from uninitialized call site"); 3876e6adb99db915381da89615f303b3b190c547b1Orion Hodson } 3976e6adb99db915381da89615f303b3b190c547b1Orion Hodson } 4076e6adb99db915381da89615f303b3b190c547b1Orion Hodson 4176e6adb99db915381da89615f303b3b190c547b1Orion Hodson private static void TestLinkerMethodMultipleArgumentTypes() throws Throwable { 4276e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMultipleArgumentTypes.test(33, 67); 4376e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMultipleArgumentTypes.test(-10000, 1000); 4476e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMultipleArgumentTypes.test(-1000, 10000); 4576e6adb99db915381da89615f303b3b190c547b1Orion Hodson } 4676e6adb99db915381da89615f303b3b190c547b1Orion Hodson 4776e6adb99db915381da89615f303b3b190c547b1Orion Hodson private static void TestLinkerMethodMinimalArguments() throws Throwable { 4876e6adb99db915381da89615f303b3b190c547b1Orion Hodson try { 4976e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMinimalArguments.test( 5076e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMinimalArguments.FAILURE_TYPE_LINKER_METHOD_RETURNS_NULL, 5176e6adb99db915381da89615f303b3b190c547b1Orion Hodson 10, 5276e6adb99db915381da89615f303b3b190c547b1Orion Hodson 10); 5376e6adb99db915381da89615f303b3b190c547b1Orion Hodson assertNotReached(); 5476e6adb99db915381da89615f303b3b190c547b1Orion Hodson } catch (BootstrapMethodError e) { 5576e6adb99db915381da89615f303b3b190c547b1Orion Hodson assertEquals(e.getCause().getClass(), ClassCastException.class); 5676e6adb99db915381da89615f303b3b190c547b1Orion Hodson } 5776e6adb99db915381da89615f303b3b190c547b1Orion Hodson 5876e6adb99db915381da89615f303b3b190c547b1Orion Hodson try { 5976e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMinimalArguments.test( 6076e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMinimalArguments.FAILURE_TYPE_LINKER_METHOD_THROWS, 10, 11); 6176e6adb99db915381da89615f303b3b190c547b1Orion Hodson assertNotReached(); 6276e6adb99db915381da89615f303b3b190c547b1Orion Hodson } catch (BootstrapMethodError e) { 6376e6adb99db915381da89615f303b3b190c547b1Orion Hodson assertEquals(e.getCause().getClass(), InstantiationException.class); 6476e6adb99db915381da89615f303b3b190c547b1Orion Hodson } 6576e6adb99db915381da89615f303b3b190c547b1Orion Hodson 6676e6adb99db915381da89615f303b3b190c547b1Orion Hodson try { 6776e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMinimalArguments.test( 6876e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMinimalArguments.FAILURE_TYPE_TARGET_METHOD_THROWS, 10, 12); 6976e6adb99db915381da89615f303b3b190c547b1Orion Hodson assertNotReached(); 7076e6adb99db915381da89615f303b3b190c547b1Orion Hodson } catch (ArithmeticException e) { 7176e6adb99db915381da89615f303b3b190c547b1Orion Hodson } 7276e6adb99db915381da89615f303b3b190c547b1Orion Hodson 7376e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMinimalArguments.test( 7476e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMinimalArguments.FAILURE_TYPE_NONE, 10, 13); 7576e6adb99db915381da89615f303b3b190c547b1Orion Hodson } 7676e6adb99db915381da89615f303b3b190c547b1Orion Hodson 7776e6adb99db915381da89615f303b3b190c547b1Orion Hodson private static void TestInvokeCustomWithConcurrentThreads() throws Throwable { 7876e6adb99db915381da89615f303b3b190c547b1Orion Hodson // This is a concurrency test that attempts to run invoke-custom on the same 7976e6adb99db915381da89615f303b3b190c547b1Orion Hodson // call site. 8076e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestInvokeCustomWithConcurrentThreads.test(); 8176e6adb99db915381da89615f303b3b190c547b1Orion Hodson } 8276e6adb99db915381da89615f303b3b190c547b1Orion Hodson 8376e6adb99db915381da89615f303b3b190c547b1Orion Hodson public static void main(String[] args) throws Throwable { 8476e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestUninitializedCallSite(); 8576e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMinimalArguments(); 8676e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestLinkerMethodMultipleArgumentTypes(); 8736bce3b6b923cef56c760a8d20ced06b719eb723Orion Hodson TestLinkerUnrelatedBSM.test(); 8876e6adb99db915381da89615f303b3b190c547b1Orion Hodson TestInvokeCustomWithConcurrentThreads(); 894c213cbf29048bb3df0065c17e82084a4afafc85Orion Hodson TestInvocationKinds.test(); 9076e6adb99db915381da89615f303b3b190c547b1Orion Hodson } 9176e6adb99db915381da89615f303b3b190c547b1Orion Hodson} 92