1c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson/* 2c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * Copyright (C) 2016 The Android Open Source Project 3c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * 4c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * Licensed under the Apache License, Version 2.0 (the "License"); 5c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * you may not use this file except in compliance with the License. 6c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * You may obtain a copy of the License at 7c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * 8c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * http://www.apache.org/licenses/LICENSE-2.0 9c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * 10c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * Unless required by applicable law or agreed to in writing, software 11c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * distributed under the License is distributed on an "AS IS" BASIS, 12c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * See the License for the specific language governing permissions and 14c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson * limitations under the License. 15c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson */ 16c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 17c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodsonimport com.android.jack.annotations.CalledByInvokeCustom; 18c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodsonimport com.android.jack.annotations.Constant; 19c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodsonimport com.android.jack.annotations.LinkerMethodHandle; 20c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodsonimport com.android.jack.annotations.MethodHandleKind; 21c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 22c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodsonimport java.lang.invoke.CallSite; 23c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodsonimport java.lang.invoke.ConstantCallSite; 24c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodsonimport java.lang.invoke.MethodHandle; 25c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodsonimport java.lang.invoke.MethodHandles; 26c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodsonimport java.lang.invoke.MethodType; 27c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 28c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodsonpublic class TestLinkerMethodMultipleArgumentTypes { 29c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 30c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson private static int bootstrapRunCount = 0; 31c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 32c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson @CalledByInvokeCustom( 33c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson invokeMethodHandle = @LinkerMethodHandle(kind = MethodHandleKind.INVOKE_STATIC, 34c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson enclosingType = TestLinkerMethodMultipleArgumentTypes.class, 35c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson name = "linkerMethod", 36c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson argumentTypes = {MethodHandles.Lookup.class, String.class, MethodType.class, 37c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson boolean.class, byte.class, char.class, short.class, int.class, 38c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson float.class, double.class, String.class, Class.class, long.class}), 39c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson methodHandleExtraArgs = {@Constant(booleanValue = true), @Constant(byteValue = 1), 40c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson @Constant(charValue = 'a'), @Constant(shortValue = 1024), 41c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson @Constant(intValue = 1), @Constant(floatValue = 11.1f), 42c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson @Constant(doubleValue = 2.2), @Constant(stringValue = "Hello"), 43c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson @Constant(classValue = TestLinkerMethodMultipleArgumentTypes.class), 44c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson @Constant(longValue = 123456789L)}, 45c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson name = "add", 46c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson returnType = int.class, 47c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson argumentTypes = {int.class, int.class}) 48c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson private static int add(int a, int b) { 49c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson return a + b; 50c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 51c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 52c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson @SuppressWarnings("unused") 53c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson private static CallSite linkerMethod(MethodHandles.Lookup caller, String name, 54c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson MethodType methodType, boolean v1, byte v2, char v3, 55c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson short v4, int v5, float v6, double v7, 56c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson String v8, Class<?> v9, long v10) throws Throwable { 57c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson System.out.println("Linking " + name + " " + methodType); 58c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertTrue(v1); 59c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertEquals(1, v2); 60c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertEquals('a', v3); 61c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertEquals(1024, v4); 62c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertEquals(1, v5); 63c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertEquals(11.1f, v6); 64c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertEquals(2.2, v7); 65c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertEquals("Hello", v8); 66c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertEquals(TestLinkerMethodMultipleArgumentTypes.class, v9); 67c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertEquals(123456789L, v10); 68c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson MethodHandle mh_add = 69c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson caller.findStatic(TestLinkerMethodMultipleArgumentTypes.class, name, methodType); 70c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson return new ConstantCallSite(mh_add); 71c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 72c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 73c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public int GetBootstrapRunCount() { 74c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson return bootstrapRunCount; 75c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 76c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 77c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void test(int x, int y) throws Throwable { 78c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson assertEquals(x + y, add(x, y)); 79c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson System.out.println(x + y); 80c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 81c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 82c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void assertTrue(boolean value) { 83c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (!value) { 84c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson throw new AssertionError("assertTrue value: " + value); 85c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 86c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 87c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 88c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void assertEquals(byte b1, byte b2) { 89c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (b1 == b2) { return; } 90c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson throw new AssertionError("assertEquals b1: " + b1 + ", b2: " + b2); 91c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 92c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 93c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void assertEquals(char c1, char c2) { 94c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (c1 == c2) { return; } 95c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson throw new AssertionError("assertEquals c1: " + c1 + ", c2: " + c2); 96c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 97c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 98c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void assertEquals(short s1, short s2) { 99c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (s1 == s2) { return; } 100c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson throw new AssertionError("assertEquals s1: " + s1 + ", s2: " + s2); 101c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 102c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 103c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void assertEquals(int i1, int i2) { 104c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (i1 == i2) { return; } 105c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson throw new AssertionError("assertEquals i1: " + i1 + ", i2: " + i2); 106c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 107c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 108c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void assertEquals(long l1, long l2) { 109c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (l1 == l2) { return; } 110c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson throw new AssertionError("assertEquals l1: " + l1 + ", l2: " + l2); 111c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 112c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 113c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void assertEquals(float f1, float f2) { 114c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (f1 == f2) { return; } 115c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson throw new AssertionError("assertEquals f1: " + f1 + ", f2: " + f2); 116c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 117c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 118c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void assertEquals(double d1, double d2) { 119c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (d1 == d2) { return; } 120c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson throw new AssertionError("assertEquals d1: " + d1 + ", d2: " + d2); 121c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 122c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 123c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void assertEquals(Object o, Object p) { 124c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (o == p) { return; } 125c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (o != null && p != null && o.equals(p)) { return; } 126c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson throw new AssertionError("assertEquals: o1: " + o + ", o2: " + p); 127c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 128c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 129c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson public static void assertEquals(String s1, String s2) { 130c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (s1 == s2) { 131c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson return; 132c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 133c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 134c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson if (s1 != null && s2 != null && s1.equals(s2)) { 135c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson return; 136c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 137c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson 138c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson throw new AssertionError("assertEquals s1: " + s1 + ", s2: " + s2); 139c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 140c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson} 141