1 /* 2 * Copyright (C) 2011 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 class Main { 18 19 public int ifoo; 20 21 /* Test requires visual inspection of object code to verify */ 22 int noThrow(Main nonNullA, 23 Main nonNullB, 24 Main nonNullC) { 25 26 // "this" check should be eliminated on both IGET/IPUT 27 ifoo++; 28 29 // "this" check should be eliminated on both IGET/IPUT 30 if (ifoo != 321) { 31 // Check not eliminated 32 nonNullA.ifoo = 12; 33 // Check not eliminated 34 nonNullB.ifoo = 21; 35 } else { 36 // Check not eliminated 37 nonNullA.ifoo = 12; 38 } 39 40 // Check eliminated 41 nonNullA.ifoo = 13; 42 43 // Check not eliminated 44 nonNullB.ifoo = 21; 45 46 nonNullC = nonNullB; 47 48 // Check eliminated 49 nonNullC.ifoo = 32; 50 51 // All null checks eliminated 52 return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo; 53 } 54 55 /* Test to ensure we don't remove necessary null checks */ 56 int checkThrow(Main nonNullA, 57 Main nonNullB, 58 Main nonNullC, 59 Main nullA, 60 Main nullB, 61 Main nullC) { 62 63 // "this" check should be eliminated on both IGET/IPUT 64 ifoo++; 65 66 try { 67 nullA.ifoo = 12; 68 // Should not be reached 69 return -1; 70 } catch (NullPointerException npe) { 71 ifoo++; 72 } 73 try { 74 nullB.ifoo = 13; 75 // Should not be reached 76 return -2; 77 } catch (NullPointerException npe) { 78 ifoo++; 79 } 80 try { 81 nullC.ifoo = 14; 82 // Should not be reached 83 return -3; 84 } catch (NullPointerException npe) { 85 ifoo++; 86 } 87 88 // "this" check should be eliminated 89 if (ifoo != 321) { 90 // Check not eliminated 91 nonNullA.ifoo = 12; 92 // Check not eliminated 93 nonNullB.ifoo = 21; 94 // Should throw here 95 try { 96 nullA.ifoo = 11; 97 return -4; 98 } catch (NullPointerException npe) { 99 } 100 } else { 101 // Check not eliminated 102 nonNullA.ifoo = 12; 103 // Should throw here 104 try { 105 nullA.ifoo = 11; 106 return -5; 107 } catch (NullPointerException npe) { 108 } 109 } 110 111 // Check not eliminated 112 nonNullA.ifoo = 13; 113 114 // Check not eliminated 115 nonNullB.ifoo = 21; 116 117 nonNullC = nonNullB; 118 119 // Check eliminated 120 nonNullC.ifoo = 32; 121 122 // Should throw here 123 try { 124 nullA.ifoo = 13; 125 return -6; 126 } catch (NullPointerException npe) { 127 } 128 129 return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo; 130 } 131 132 133 static int nullCheckTestNoThrow(int x) { 134 Main base = new Main(); 135 Main a = new Main(); 136 Main b = new Main(); 137 Main c = new Main(); 138 base.ifoo = x; 139 return base.noThrow(a,b,c); 140 } 141 142 static int nullCheckTestThrow(int x) { 143 Main base = new Main(); 144 Main a = new Main(); 145 Main b = new Main(); 146 Main c = new Main(); 147 Main d = null; 148 Main e = null; 149 Main f = null; 150 base.ifoo = x; 151 return base.checkThrow(a,b,c,d,e,f); 152 } 153 154 155 static void throwImplicitAIOBE(int[] array, int index) { 156 array[index] = 0; 157 } 158 159 static int checkAIOBE() { 160 int[] array = new int[10]; 161 int res; 162 try { 163 throwImplicitAIOBE(array, 11); 164 res = 123; 165 } catch (NullPointerException npe) { 166 res = 768; 167 } catch (ArrayIndexOutOfBoundsException e) { 168 res = 456; 169 } 170 try { 171 throwImplicitAIOBE(array, -1); 172 res += 123; 173 } catch (NullPointerException npe) { 174 res += 768; 175 } catch (ArrayIndexOutOfBoundsException e) { 176 res += 456; 177 } 178 return res; 179 } 180 181 static int throwImplicitDivZero(int x, int y) { 182 return x / y; 183 } 184 185 static int checkDivZero() { 186 try { 187 throwImplicitDivZero(100, 0); 188 return 123; 189 } catch (NullPointerException npe) { 190 return 768; 191 } catch (ArrayIndexOutOfBoundsException e) { 192 return 987; 193 } catch (ArithmeticException e) { 194 return 456; 195 } 196 } 197 198 public static void main(String[] args) { 199 boolean failure = false; 200 int res; 201 202 res = nullCheckTestNoThrow(1976); 203 if (res == 2054) { 204 System.out.println("nullCheckTestNoThrow PASSED"); 205 } else { 206 System.out.println("nullCheckTestNoThrow FAILED: " + res); 207 failure = true; 208 } 209 210 res = nullCheckTestThrow(1976); 211 if (res == 2057) { 212 System.out.println("nullCheckTestThrow PASSED"); 213 } else { 214 System.out.println("nullCheckTestThrow FAILED: " + res); 215 failure = true; 216 } 217 218 res = checkAIOBE(); 219 if (res == 912) { 220 System.out.println("checkAIOBE PASSED"); 221 } else { 222 System.out.println("checkAIOBE FAILED: " + res); 223 failure = true; 224 } 225 226 res = checkDivZero(); 227 if (res == 456) { 228 System.out.println("checkDivZero PASSED"); 229 } else { 230 System.out.println("checkDivZero FAILED: " + res); 231 failure = true; 232 } 233 System.exit(failure ? 1 : 0); 234 } 235 } 236