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