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