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 { main(String[] args)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 // Test that we do NPE checks on array length. 98 exception = null; 99 try { 100 $opt$ArrayLengthOfNull(null); 101 } catch (NullPointerException e) { 102 exception = e; 103 } 104 105 if (exception == null) { 106 throw new Error("Missing NullPointerException"); 107 } 108 109 result = $opt$InvokeVirtualMethod(); 110 if (result != 42) { 111 throw new Error("Unexpected result: " + result); 112 } 113 114 String s = $opt$StringInit(); 115 if (!s.equals("hello world")) { 116 throw new Error("Unexpected string: " + s); 117 } 118 } 119 invokePrivate()120 public static void invokePrivate() { 121 Main m = null; 122 m.privateMethod(); 123 } 124 privateMethod()125 private void privateMethod() { 126 Object o = new Object(); 127 } 128 $opt$TestInvokeIntParameter(int param)129 static int $opt$TestInvokeIntParameter(int param) { 130 return param; 131 } 132 $opt$TestInvokeObjectParameter(Object a)133 static Object $opt$TestInvokeObjectParameter(Object a) { 134 forceGCStaticMethod(); 135 return a; 136 } 137 $opt$TestInvokeWith2Parameters(int a, int b)138 static int $opt$TestInvokeWith2Parameters(int a, int b) { 139 return a - b; 140 } 141 $opt$TestInvokeWith3Parameters(int a, int b, int c)142 static int $opt$TestInvokeWith3Parameters(int a, int b, int c) { 143 return a - b - c; 144 } 145 $opt$TestInvokeWith5Parameters(int a, int b, int c, int d, int e)146 static int $opt$TestInvokeWith5Parameters(int a, int b, int c, int d, int e) { 147 return a - b - c - d - e; 148 } 149 $opt$TestInvokeWith7Parameters(int a, int b, int c, int d, int e, int f, int g)150 static int $opt$TestInvokeWith7Parameters(int a, int b, int c, int d, int e, int f, int g) { 151 return a - b - c - d - e - f - g; 152 } 153 $opt$TestThisParameter(Object other)154 Object $opt$TestThisParameter(Object other) { 155 forceGCStaticMethod(); 156 return other; 157 } 158 $opt$TestOtherParameter(Object other)159 Object $opt$TestOtherParameter(Object other) { 160 forceGCStaticMethod(); 161 return other; 162 } 163 $opt$TestReturnNewObject(Object other)164 Object $opt$TestReturnNewObject(Object other) { 165 Object o = new Object(); 166 forceGCStaticMethod(); 167 return o; 168 } 169 $opt$TestInvokeStatic()170 public static void $opt$TestInvokeStatic() { 171 printStaticMethod(); 172 printStaticMethodWith2Args(1, 2); 173 printStaticMethodWith5Args(1, 2, 3, 4, 5); 174 printStaticMethodWith7Args(1, 2, 3, 4, 5, 6, 7); 175 forceGCStaticMethod(); 176 throwStaticMethod(); 177 } 178 $opt$TestInvokeNew()179 public static void $opt$TestInvokeNew() { 180 Object o = new Object(); 181 forceGCStaticMethod(); 182 printStaticMethodWithObjectArg(o); 183 forceGCStaticMethod(); 184 } 185 printStaticMethod()186 public static void printStaticMethod() { 187 System.out.println("In static method"); 188 } 189 printStaticMethodWith2Args(int a, int b)190 public static void printStaticMethodWith2Args(int a, int b) { 191 System.out.println("In static method with 2 args " + a + " " + b); 192 } 193 printStaticMethodWith5Args(int a, int b, int c, int d, int e)194 public static void printStaticMethodWith5Args(int a, int b, int c, int d, int e) { 195 System.out.println("In static method with 5 args " 196 + a + " " + b + " " + c + " " + d + " " + e); 197 } 198 printStaticMethodWith7Args(int a, int b, int c, int d, int e, int f, int g)199 public static void printStaticMethodWith7Args(int a, int b, int c, int d, int e, int f, int g) { 200 System.out.println("In static method with 7 args " 201 + a + " " + b + " " + c + " " + d + " " + e + " " + f + " " + g); 202 } 203 printStaticMethodWithObjectArg(Object a)204 public static void printStaticMethodWithObjectArg(Object a) { 205 System.out.println("In static method with object arg " + a.getClass()); 206 } 207 forceGCStaticMethod()208 public static void forceGCStaticMethod() { 209 Runtime.getRuntime().gc(); 210 Runtime.getRuntime().gc(); 211 Runtime.getRuntime().gc(); 212 Runtime.getRuntime().gc(); 213 Runtime.getRuntime().gc(); 214 Runtime.getRuntime().gc(); 215 System.out.println("Forced GC"); 216 } 217 throwStaticMethod()218 public static void throwStaticMethod() { 219 throw new Error("Error"); 220 } 221 $opt$SetFieldInOldObject(Main m)222 public static void $opt$SetFieldInOldObject(Main m) { 223 m.o = new Main(); 224 } 225 $opt$InvokeVirtualMethod()226 public static int $opt$InvokeVirtualMethod() { 227 return new Main().virtualMethod(); 228 } 229 virtualMethod()230 public int virtualMethod() { 231 return 42; 232 } 233 $opt$ArrayLengthOfNull(int[] array)234 public static int $opt$ArrayLengthOfNull(int[] array) { 235 return array.length; 236 } 237 $opt$StringInit()238 public static String $opt$StringInit() { 239 return new String("hello world"); 240 } 241 242 Object o; 243 } 244