1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 // Note that $opt$ is a marker for the optimizing compiler to ensure 18 // it does compile the method. 19 20 public class Main { 21 public static void main(String[] args) { 22 Error error = null; 23 try { 24 $opt$TestInvokeStatic(); 25 } catch (Error e) { 26 error = e; 27 } 28 System.out.println(error); 29 30 $opt$TestInvokeNew(); 31 32 int result = $opt$TestInvokeIntParameter(42); 33 if (result != 42) { 34 throw new Error("Different value returned: " + result); 35 } 36 37 38 $opt$TestInvokeObjectParameter(new Object()); 39 40 Object a = new Object(); 41 Object b = $opt$TestInvokeObjectParameter(a); 42 if (a != b) { 43 throw new Error("Different object returned " + a + " " + b); 44 } 45 46 result = $opt$TestInvokeWith2Parameters(10, 9); 47 if (result != 1) { 48 throw new Error("Unexpected result: " + result); 49 } 50 51 result = $opt$TestInvokeWith3Parameters(10, 9, 1); 52 if (result != 0) { 53 throw new Error("Unexpected result: " + result); 54 } 55 56 result = $opt$TestInvokeWith5Parameters(10000, 1000, 100, 10, 1); 57 if (result != 8889) { 58 throw new Error("Unexpected result: " + result); 59 } 60 61 result = $opt$TestInvokeWith7Parameters(100, 6, 5, 4, 3, 2, 1); 62 if (result != 79) { 63 throw new Error("Unexpected result: " + result); 64 } 65 66 Main m = new Main(); 67 if (m.$opt$TestThisParameter(m) != m) { 68 throw new Error("Unexpected value returned"); 69 } 70 71 if (m.$opt$TestOtherParameter(new Main()) == m) { 72 throw new Error("Unexpected value returned"); 73 } 74 75 if (m.$opt$TestReturnNewObject(m) == m) { 76 throw new Error("Unexpected value returned"); 77 } 78 79 // Loop enough iterations to hope for a crash if no write barrier 80 // is emitted. 81 for (int j = 0; j < 3; j++) { 82 Main m1 = new Main(); 83 $opt$SetFieldInOldObject(m1); 84 for (int i = 0; i < 1000; ++i) { 85 Object o = new byte[1024]; 86 } 87 } 88 89 // Test that we do NPE checks on invokedirect. 90 Exception exception = null; 91 try { 92 invokePrivate(); 93 } catch (NullPointerException e) { 94 exception = e; 95 } 96 97 if (exception == null) { 98 throw new Error("Missing NullPointerException"); 99 } 100 } 101 102 public static void invokePrivate() { 103 Main m = null; 104 m.privateMethod(); 105 } 106 107 private void privateMethod() { 108 Object o = new Object(); 109 } 110 111 static int $opt$TestInvokeIntParameter(int param) { 112 return param; 113 } 114 115 static Object $opt$TestInvokeObjectParameter(Object a) { 116 forceGCStaticMethod(); 117 return a; 118 } 119 120 static int $opt$TestInvokeWith2Parameters(int a, int b) { 121 return a - b; 122 } 123 124 static int $opt$TestInvokeWith3Parameters(int a, int b, int c) { 125 return a - b - c; 126 } 127 128 static int $opt$TestInvokeWith5Parameters(int a, int b, int c, int d, int e) { 129 return a - b - c - d - e; 130 } 131 132 static int $opt$TestInvokeWith7Parameters(int a, int b, int c, int d, int e, int f, int g) { 133 return a - b - c - d - e - f - g; 134 } 135 136 Object $opt$TestThisParameter(Object other) { 137 forceGCStaticMethod(); 138 return other; 139 } 140 141 Object $opt$TestOtherParameter(Object other) { 142 forceGCStaticMethod(); 143 return other; 144 } 145 146 Object $opt$TestReturnNewObject(Object other) { 147 Object o = new Object(); 148 forceGCStaticMethod(); 149 return o; 150 } 151 152 public static void $opt$TestInvokeStatic() { 153 printStaticMethod(); 154 printStaticMethodWith2Args(1, 2); 155 printStaticMethodWith5Args(1, 2, 3, 4, 5); 156 printStaticMethodWith7Args(1, 2, 3, 4, 5, 6, 7); 157 forceGCStaticMethod(); 158 throwStaticMethod(); 159 } 160 161 public static void $opt$TestInvokeNew() { 162 Object o = new Object(); 163 forceGCStaticMethod(); 164 printStaticMethodWithObjectArg(o); 165 forceGCStaticMethod(); 166 } 167 168 public static void printStaticMethod() { 169 System.out.println("In static method"); 170 } 171 172 public static void printStaticMethodWith2Args(int a, int b) { 173 System.out.println("In static method with 2 args " + a + " " + b); 174 } 175 176 public static void printStaticMethodWith5Args(int a, int b, int c, int d, int e) { 177 System.out.println("In static method with 5 args " 178 + a + " " + b + " " + c + " " + d + " " + e); 179 } 180 181 public static void printStaticMethodWith7Args(int a, int b, int c, int d, int e, int f, int g) { 182 System.out.println("In static method with 7 args " 183 + a + " " + b + " " + c + " " + d + " " + e + " " + f + " " + g); 184 } 185 186 public static void printStaticMethodWithObjectArg(Object a) { 187 System.out.println("In static method with object arg " + a.getClass()); 188 } 189 190 public static void forceGCStaticMethod() { 191 Runtime.getRuntime().gc(); 192 Runtime.getRuntime().gc(); 193 Runtime.getRuntime().gc(); 194 Runtime.getRuntime().gc(); 195 Runtime.getRuntime().gc(); 196 Runtime.getRuntime().gc(); 197 System.out.println("Forced GC"); 198 } 199 200 public static void throwStaticMethod() { 201 throw new Error("Error"); 202 } 203 204 public static void $opt$SetFieldInOldObject(Main m) { 205 m.o = new Main(); 206 } 207 208 Object o; 209 } 210