1 /*
2  * Copyright (C) 2015 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 public class Main {
18   public static boolean doThrow = false;
19 
20   private Object objectField;
21   private int intField;
22   private float floatField;
23   private long longField;
24   private double doubleField;
25   private byte byteField;
26   private boolean booleanField;
27   private char charField;
28   private short shortField;
29 
30   private volatile Object volatileObjectField;
31   private volatile int volatileIntField;
32   private volatile float volatileFloatField;
33   private volatile long volatileLongField;
34   private volatile double volatileDoubleField;
35   private volatile byte volatileByteField;
36   private volatile boolean volatileBooleanField;
37   private volatile char volatileCharField;
38   private volatile short volatileShortField;
39 
$opt$noinline$setObjectField(Main m)40   public static void $opt$noinline$setObjectField(Main m) {
41     if (doThrow) { throw new Error(); }
42     m.objectField = null;
43   }
44 
$opt$noinline$setIntField(Main m)45   public static void $opt$noinline$setIntField(Main m) {
46     if (doThrow) { throw new Error(); }
47     m.intField = 0;
48   }
49 
$opt$noinline$setFloatField(Main m)50   public static void $opt$noinline$setFloatField(Main m) {
51     if (doThrow) { throw new Error(); }
52     m.floatField = 0;
53   }
54 
$opt$noinline$setLongField(Main m)55   public static void $opt$noinline$setLongField(Main m) {
56     if (doThrow) { throw new Error(); }
57     m.longField = 0;
58   }
59 
$opt$noinline$setDoubleField(Main m)60   public static void $opt$noinline$setDoubleField(Main m) {
61     if (doThrow) { throw new Error(); }
62     m.doubleField = 0;
63   }
64 
$opt$noinline$setByteField(Main m)65   public static void $opt$noinline$setByteField(Main m) {
66     if (doThrow) { throw new Error(); }
67     m.byteField = 0;
68   }
69 
$opt$noinline$setBooleanField(Main m)70   public static void $opt$noinline$setBooleanField(Main m) {
71     if (doThrow) { throw new Error(); }
72     m.booleanField = false;
73   }
74 
$opt$noinline$setCharField(Main m)75   public static void $opt$noinline$setCharField(Main m) {
76     if (doThrow) { throw new Error(); }
77     m.charField = 0;
78   }
79 
$opt$noinline$setShortField(Main m)80   public static void $opt$noinline$setShortField(Main m) {
81     if (doThrow) { throw new Error(); }
82     m.shortField = 0;
83   }
84 
$opt$noinline$getObjectField(Main m)85   public static Object $opt$noinline$getObjectField(Main m) {
86     if (doThrow) { throw new Error(); }
87     return m.objectField;
88   }
89 
$opt$noinline$getIntField(Main m)90   public static int $opt$noinline$getIntField(Main m) {
91     if (doThrow) { throw new Error(); }
92     return m.intField;
93   }
94 
$opt$noinline$getFloatField(Main m)95   public static float $opt$noinline$getFloatField(Main m) {
96     if (doThrow) { throw new Error(); }
97     return m.floatField;
98   }
99 
$opt$noinline$getLongField(Main m)100   public static long $opt$noinline$getLongField(Main m) {
101     if (doThrow) { throw new Error(); }
102     return m.longField;
103   }
104 
$opt$noinline$getDoubleField(Main m)105   public static double $opt$noinline$getDoubleField(Main m) {
106     if (doThrow) { throw new Error(); }
107     return m.doubleField;
108   }
109 
$opt$noinline$getByteField(Main m)110   public static byte $opt$noinline$getByteField(Main m) {
111     if (doThrow) { throw new Error(); }
112     return m.byteField;
113   }
114 
$opt$noinline$getBooleanField(Main m)115   public static boolean $opt$noinline$getBooleanField(Main m) {
116     if (doThrow) { throw new Error(); }
117     return m.booleanField;
118   }
119 
$opt$noinline$getCharField(Main m)120   public static char $opt$noinline$getCharField(Main m) {
121     if (doThrow) { throw new Error(); }
122     return m.charField;
123   }
124 
$opt$noinline$getShortField(Main m)125   public static short $opt$noinline$getShortField(Main m) {
126     if (doThrow) { throw new Error(); }
127     return m.shortField;
128   }
129 
$opt$noinline$setVolatileObjectField(Main m)130   public static void $opt$noinline$setVolatileObjectField(Main m) {
131     if (doThrow) { throw new Error(); }
132     m.volatileObjectField = null;
133   }
134 
$opt$noinline$setVolatileIntField(Main m)135   public static void $opt$noinline$setVolatileIntField(Main m) {
136     if (doThrow) { throw new Error(); }
137     m.volatileIntField = 0;
138   }
139 
$opt$noinline$setVolatileFloatField(Main m)140   public static void $opt$noinline$setVolatileFloatField(Main m) {
141     if (doThrow) { throw new Error(); }
142     m.volatileFloatField = 0;
143   }
144 
$opt$noinline$setVolatileLongField(Main m)145   public static void $opt$noinline$setVolatileLongField(Main m) {
146     if (doThrow) { throw new Error(); }
147     m.volatileLongField = 0;
148   }
149 
$opt$noinline$setVolatileDoubleField(Main m)150   public static void $opt$noinline$setVolatileDoubleField(Main m) {
151     if (doThrow) { throw new Error(); }
152     m.volatileDoubleField = 0;
153   }
154 
$opt$noinline$setVolatileByteField(Main m)155   public static void $opt$noinline$setVolatileByteField(Main m) {
156     if (doThrow) { throw new Error(); }
157     m.volatileByteField = 0;
158   }
159 
$opt$noinline$setVolatileBooleanField(Main m)160   public static void $opt$noinline$setVolatileBooleanField(Main m) {
161     if (doThrow) { throw new Error(); }
162     m.volatileBooleanField = false;
163   }
164 
$opt$noinline$setVolatileCharField(Main m)165   public static void $opt$noinline$setVolatileCharField(Main m) {
166     if (doThrow) { throw new Error(); }
167     m.volatileCharField = 0;
168   }
169 
$opt$noinline$setVolatileShortField(Main m)170   public static void $opt$noinline$setVolatileShortField(Main m) {
171     if (doThrow) { throw new Error(); }
172     m.volatileShortField = 0;
173   }
174 
$opt$noinline$getVolatileObjectField(Main m)175   public static Object $opt$noinline$getVolatileObjectField(Main m) {
176     if (doThrow) { throw new Error(); }
177     return m.volatileObjectField;
178   }
179 
$opt$noinline$getVolatileIntField(Main m)180   public static int $opt$noinline$getVolatileIntField(Main m) {
181     if (doThrow) { throw new Error(); }
182     return m.volatileIntField;
183   }
184 
$opt$noinline$getVolatileFloatField(Main m)185   public static float $opt$noinline$getVolatileFloatField(Main m) {
186     if (doThrow) { throw new Error(); }
187     return m.volatileFloatField;
188   }
189 
$opt$noinline$getVolatileLongField(Main m)190   public static long $opt$noinline$getVolatileLongField(Main m) {
191     if (doThrow) { throw new Error(); }
192     return m.volatileLongField;
193   }
194 
$opt$noinline$getVolatileDoubleField(Main m)195   public static double $opt$noinline$getVolatileDoubleField(Main m) {
196     if (doThrow) { throw new Error(); }
197     return m.volatileDoubleField;
198   }
199 
$opt$noinline$getVolatileByteField(Main m)200   public static byte $opt$noinline$getVolatileByteField(Main m) {
201     if (doThrow) { throw new Error(); }
202     return m.volatileByteField;
203   }
204 
$opt$noinline$getVolatileBooleanField(Main m)205   public static boolean $opt$noinline$getVolatileBooleanField(Main m) {
206     if (doThrow) { throw new Error(); }
207     return m.volatileBooleanField;
208   }
209 
$opt$noinline$getVolatileCharField(Main m)210   public static char $opt$noinline$getVolatileCharField(Main m) {
211     if (doThrow) { throw new Error(); }
212     return m.volatileCharField;
213   }
214 
$opt$noinline$getVolatileShortField(Main m)215   public static short $opt$noinline$getVolatileShortField(Main m) {
216     if (doThrow) { throw new Error(); }
217     return m.volatileShortField;
218   }
219 
$opt$noinline$setObjectElement(Object[] a)220   public static void $opt$noinline$setObjectElement(Object[] a) {
221     if (doThrow) { throw new Error(); }
222     a[0] = null;
223   }
224 
$opt$noinline$setIntElement(int[] a)225   public static void $opt$noinline$setIntElement(int[] a) {
226     if (doThrow) { throw new Error(); }
227     a[0] = 0;
228   }
229 
$opt$noinline$setFloatElement(float[] a)230   public static void $opt$noinline$setFloatElement(float[] a) {
231     if (doThrow) { throw new Error(); }
232     a[0] = 0;
233   }
234 
$opt$noinline$setLongElement(long[] a)235   public static void $opt$noinline$setLongElement(long[] a) {
236     if (doThrow) { throw new Error(); }
237     a[0] = 0;
238   }
239 
$opt$noinline$setDoubleElement(double[] a)240   public static void $opt$noinline$setDoubleElement(double[] a) {
241     if (doThrow) { throw new Error(); }
242     a[0] = 0;
243   }
244 
$opt$noinline$setByteElement(byte[] a)245   public static void $opt$noinline$setByteElement(byte[] a) {
246     if (doThrow) { throw new Error(); }
247     a[0] = 0;
248   }
249 
$opt$noinline$setBooleanElement(boolean[] a)250   public static void $opt$noinline$setBooleanElement(boolean[] a) {
251     if (doThrow) { throw new Error(); }
252     a[0] = false;
253   }
254 
$opt$noinline$setCharElement(char[] a)255   public static void $opt$noinline$setCharElement(char[] a) {
256     if (doThrow) { throw new Error(); }
257     a[0] = 0;
258   }
259 
$opt$noinline$setShortElement(short[] a)260   public static void $opt$noinline$setShortElement(short[] a) {
261     if (doThrow) { throw new Error(); }
262     a[0] = 0;
263   }
264 
$opt$noinline$getObjectElement(Object[] a)265   public static Object $opt$noinline$getObjectElement(Object[] a) {
266     if (doThrow) { throw new Error(); }
267     return a[0];
268   }
269 
$opt$noinline$getIntElement(int[] a)270   public static int $opt$noinline$getIntElement(int[] a) {
271     if (doThrow) { throw new Error(); }
272     return a[0];
273   }
274 
$opt$noinline$getFloatElement(float[] a)275   public static float $opt$noinline$getFloatElement(float[] a) {
276     if (doThrow) { throw new Error(); }
277     return a[0];
278   }
279 
$opt$noinline$getLongElement(long[] a)280   public static long $opt$noinline$getLongElement(long[] a) {
281     if (doThrow) { throw new Error(); }
282     return a[0];
283   }
284 
$opt$noinline$getDoubleElement(double[] a)285   public static double $opt$noinline$getDoubleElement(double[] a) {
286     if (doThrow) { throw new Error(); }
287     return a[0];
288   }
289 
$opt$noinline$getByteElement(byte[] a)290   public static byte $opt$noinline$getByteElement(byte[] a) {
291     if (doThrow) { throw new Error(); }
292     return a[0];
293   }
294 
$opt$noinline$getBooleanElement(boolean[] a)295   public static boolean $opt$noinline$getBooleanElement(boolean[] a) {
296     if (doThrow) { throw new Error(); }
297     return a[0];
298   }
299 
$opt$noinline$getCharElement(char[] a)300   public static char $opt$noinline$getCharElement(char[] a) {
301     if (doThrow) { throw new Error(); }
302     return a[0];
303   }
304 
$opt$noinline$getShortElement(short[] a)305   public static short $opt$noinline$getShortElement(short[] a) {
306     if (doThrow) { throw new Error(); }
307     return a[0];
308   }
309 
main(String[] args)310   public static void main(String[] args) {
311     int methodLine = 42;
312     int thisLine = 312;
313     try {
314       $opt$noinline$setObjectField(null);
315       throw new RuntimeException("Failed to throw NullPointerException.");
316     } catch (NullPointerException npe) {
317       check(npe, thisLine += 2, methodLine, "$opt$noinline$setObjectField");
318     }
319     try {
320       $opt$noinline$setIntField(null);
321       throw new RuntimeException("Failed to throw NullPointerException.");
322     } catch (NullPointerException npe) {
323       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setIntField");
324     }
325     try {
326       $opt$noinline$setFloatField(null);
327       throw new RuntimeException("Failed to throw NullPointerException.");
328     } catch (NullPointerException npe) {
329       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setFloatField");
330     }
331     try {
332       $opt$noinline$setLongField(null);
333       throw new RuntimeException("Failed to throw NullPointerException.");
334     } catch (NullPointerException npe) {
335       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setLongField");
336     }
337     try {
338       $opt$noinline$setDoubleField(null);
339       throw new RuntimeException("Failed to throw NullPointerException.");
340     } catch (NullPointerException npe) {
341       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setDoubleField");
342     }
343     try {
344       $opt$noinline$setByteField(null);
345       throw new RuntimeException("Failed to throw NullPointerException.");
346     } catch (NullPointerException npe) {
347       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setByteField");
348     }
349     try {
350       $opt$noinline$setBooleanField(null);
351       throw new RuntimeException("Failed to throw NullPointerException.");
352     } catch (NullPointerException npe) {
353       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setBooleanField");
354     }
355     try {
356       $opt$noinline$setCharField(null);
357       throw new RuntimeException("Failed to throw NullPointerException.");
358     } catch (NullPointerException npe) {
359       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setCharField");
360     }
361     try {
362       $opt$noinline$setShortField(null);
363       throw new RuntimeException("Failed to throw NullPointerException.");
364     } catch (NullPointerException npe) {
365       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setShortField");
366     }
367     try {
368       $opt$noinline$getObjectField(null);
369       throw new RuntimeException("Failed to throw NullPointerException.");
370     } catch (NullPointerException npe) {
371       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getObjectField");
372     }
373     try {
374       $opt$noinline$getIntField(null);
375       throw new RuntimeException("Failed to throw NullPointerException.");
376     } catch (NullPointerException npe) {
377       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getIntField");
378     }
379     try {
380       $opt$noinline$getFloatField(null);
381       throw new RuntimeException("Failed to throw NullPointerException.");
382     } catch (NullPointerException npe) {
383       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getFloatField");
384     }
385     try {
386       $opt$noinline$getLongField(null);
387       throw new RuntimeException("Failed to throw NullPointerException.");
388     } catch (NullPointerException npe) {
389       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getLongField");
390     }
391     try {
392       $opt$noinline$getDoubleField(null);
393       throw new RuntimeException("Failed to throw NullPointerException.");
394     } catch (NullPointerException npe) {
395       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getDoubleField");
396     }
397     try {
398       $opt$noinline$getByteField(null);
399       throw new RuntimeException("Failed to throw NullPointerException.");
400     } catch (NullPointerException npe) {
401       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getByteField");
402     }
403     try {
404       $opt$noinline$getBooleanField(null);
405       throw new RuntimeException("Failed to throw NullPointerException.");
406     } catch (NullPointerException npe) {
407       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getBooleanField");
408     }
409     try {
410       $opt$noinline$getCharField(null);
411       throw new RuntimeException("Failed to throw NullPointerException.");
412     } catch (NullPointerException npe) {
413       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getCharField");
414     }
415     try {
416       $opt$noinline$getShortField(null);
417       throw new RuntimeException("Failed to throw NullPointerException.");
418     } catch (NullPointerException npe) {
419       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getShortField");
420     }
421     try {
422       $opt$noinline$setVolatileObjectField(null);
423       throw new RuntimeException("Failed to throw NullPointerException.");
424     } catch (NullPointerException npe) {
425       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setVolatileObjectField");
426     }
427     try {
428       $opt$noinline$setVolatileIntField(null);
429       throw new RuntimeException("Failed to throw NullPointerException.");
430     } catch (NullPointerException npe) {
431       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setVolatileIntField");
432     }
433     try {
434       $opt$noinline$setVolatileFloatField(null);
435       throw new RuntimeException("Failed to throw NullPointerException.");
436     } catch (NullPointerException npe) {
437       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setVolatileFloatField");
438     }
439     try {
440       $opt$noinline$setVolatileLongField(null);
441       throw new RuntimeException("Failed to throw NullPointerException.");
442     } catch (NullPointerException npe) {
443       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setVolatileLongField");
444     }
445     try {
446       $opt$noinline$setVolatileDoubleField(null);
447       throw new RuntimeException("Failed to throw NullPointerException.");
448     } catch (NullPointerException npe) {
449       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setVolatileDoubleField");
450     }
451     try {
452       $opt$noinline$setVolatileByteField(null);
453       throw new RuntimeException("Failed to throw NullPointerException.");
454     } catch (NullPointerException npe) {
455       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setVolatileByteField");
456     }
457     try {
458       $opt$noinline$setVolatileBooleanField(null);
459       throw new RuntimeException("Failed to throw NullPointerException.");
460     } catch (NullPointerException npe) {
461       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setVolatileBooleanField");
462     }
463     try {
464       $opt$noinline$setVolatileCharField(null);
465       throw new RuntimeException("Failed to throw NullPointerException.");
466     } catch (NullPointerException npe) {
467       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setVolatileCharField");
468     }
469     try {
470       $opt$noinline$setVolatileShortField(null);
471       throw new RuntimeException("Failed to throw NullPointerException.");
472     } catch (NullPointerException npe) {
473       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setVolatileShortField");
474     }
475     try {
476       $opt$noinline$getVolatileObjectField(null);
477       throw new RuntimeException("Failed to throw NullPointerException.");
478     } catch (NullPointerException npe) {
479       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getVolatileObjectField");
480     }
481     try {
482       $opt$noinline$getVolatileIntField(null);
483       throw new RuntimeException("Failed to throw NullPointerException.");
484     } catch (NullPointerException npe) {
485       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getVolatileIntField");
486     }
487     try {
488       $opt$noinline$getVolatileFloatField(null);
489       throw new RuntimeException("Failed to throw NullPointerException.");
490     } catch (NullPointerException npe) {
491       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getVolatileFloatField");
492     }
493     try {
494       $opt$noinline$getVolatileLongField(null);
495       throw new RuntimeException("Failed to throw NullPointerException.");
496     } catch (NullPointerException npe) {
497       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getVolatileLongField");
498     }
499     try {
500       $opt$noinline$getVolatileDoubleField(null);
501       throw new RuntimeException("Failed to throw NullPointerException.");
502     } catch (NullPointerException npe) {
503       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getVolatileDoubleField");
504     }
505     try {
506       $opt$noinline$getVolatileByteField(null);
507       throw new RuntimeException("Failed to throw NullPointerException.");
508     } catch (NullPointerException npe) {
509       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getVolatileByteField");
510     }
511     try {
512       $opt$noinline$getVolatileBooleanField(null);
513       throw new RuntimeException("Failed to throw NullPointerException.");
514     } catch (NullPointerException npe) {
515       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getVolatileBooleanField");
516     }
517     try {
518       $opt$noinline$getVolatileCharField(null);
519       throw new RuntimeException("Failed to throw NullPointerException.");
520     } catch (NullPointerException npe) {
521       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getVolatileCharField");
522     }
523     try {
524       $opt$noinline$getVolatileShortField(null);
525       throw new RuntimeException("Failed to throw NullPointerException.");
526     } catch (NullPointerException npe) {
527       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getVolatileShortField");
528     }
529     try {
530       $opt$noinline$setObjectElement(null);
531       throw new RuntimeException("Failed to throw NullPointerException.");
532     } catch (NullPointerException npe) {
533       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setObjectElement");
534     }
535     try {
536       $opt$noinline$setIntElement(null);
537       throw new RuntimeException("Failed to throw NullPointerException.");
538     } catch (NullPointerException npe) {
539       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setIntElement");
540     }
541     try {
542       $opt$noinline$setFloatElement(null);
543       throw new RuntimeException("Failed to throw NullPointerException.");
544     } catch (NullPointerException npe) {
545       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setFloatElement");
546     }
547     try {
548       $opt$noinline$setLongElement(null);
549       throw new RuntimeException("Failed to throw NullPointerException.");
550     } catch (NullPointerException npe) {
551       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setLongElement");
552     }
553     try {
554       $opt$noinline$setDoubleElement(null);
555       throw new RuntimeException("Failed to throw NullPointerException.");
556     } catch (NullPointerException npe) {
557       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setDoubleElement");
558     }
559     try {
560       $opt$noinline$setByteElement(null);
561       throw new RuntimeException("Failed to throw NullPointerException.");
562     } catch (NullPointerException npe) {
563       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setByteElement");
564     }
565     try {
566       $opt$noinline$setBooleanElement(null);
567       throw new RuntimeException("Failed to throw NullPointerException.");
568     } catch (NullPointerException npe) {
569       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setBooleanElement");
570     }
571     try {
572       $opt$noinline$setCharElement(null);
573       throw new RuntimeException("Failed to throw NullPointerException.");
574     } catch (NullPointerException npe) {
575       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setCharElement");
576     }
577     try {
578       $opt$noinline$setShortElement(null);
579       throw new RuntimeException("Failed to throw NullPointerException.");
580     } catch (NullPointerException npe) {
581       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$setShortElement");
582     }
583     try {
584       $opt$noinline$getObjectElement(null);
585       throw new RuntimeException("Failed to throw NullPointerException.");
586     } catch (NullPointerException npe) {
587       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getObjectElement");
588     }
589     try {
590       $opt$noinline$getIntElement(null);
591       throw new RuntimeException("Failed to throw NullPointerException.");
592     } catch (NullPointerException npe) {
593       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getIntElement");
594     }
595     try {
596       $opt$noinline$getFloatElement(null);
597       throw new RuntimeException("Failed to throw NullPointerException.");
598     } catch (NullPointerException npe) {
599       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getFloatElement");
600     }
601     try {
602       $opt$noinline$getLongElement(null);
603       throw new RuntimeException("Failed to throw NullPointerException.");
604     } catch (NullPointerException npe) {
605       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getLongElement");
606     }
607     try {
608       $opt$noinline$getDoubleElement(null);
609       throw new RuntimeException("Failed to throw NullPointerException.");
610     } catch (NullPointerException npe) {
611       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getDoubleElement");
612     }
613     try {
614       $opt$noinline$getByteElement(null);
615       throw new RuntimeException("Failed to throw NullPointerException.");
616     } catch (NullPointerException npe) {
617       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getByteElement");
618     }
619     try {
620       $opt$noinline$getBooleanElement(null);
621       throw new RuntimeException("Failed to throw NullPointerException.");
622     } catch (NullPointerException npe) {
623       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getBooleanElement");
624     }
625     try {
626       $opt$noinline$getCharElement(null);
627       throw new RuntimeException("Failed to throw NullPointerException.");
628     } catch (NullPointerException npe) {
629       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getCharElement");
630     }
631     try {
632       $opt$noinline$getShortElement(null);
633       throw new RuntimeException("Failed to throw NullPointerException.");
634     } catch (NullPointerException npe) {
635       check(npe, thisLine += 6, methodLine += 5, "$opt$noinline$getShortElement");
636     }
637 
638     $opt$noinline$testRegisterRetrieval();
639   }
640 
$opt$noinline$testRegisterRetrieval()641   static void $opt$noinline$testRegisterRetrieval() {
642     Main[] array = $noinline$PrepareArray();
643     int i0 = 0;
644     int i1 = 1;
645     int i2 = 2;
646     int i3 = 3;
647     int i4 = 4;
648     int i5 = 5;
649     int i6 = 6;
650     int i7 = 7;
651     int i8 = 8;
652     int i9 = 9;
653     int i10 = 10;
654     int i11 = 11;
655     int i12 = 12;
656     int i13 = 13;
657     int i14 = 14;
658     int i15 = 15;
659     long l0 = 20L;
660     long l1 = 21L;
661     long l2 = 22L;
662     long l3 = 23L;
663     long l4 = 24L;
664     long l5 = 25L;
665     long l6 = 26L;
666     long l7 = 27L;
667     long l8 = 28L;
668     long l9 = 29L;
669     long l10 = 30L;
670     long l11 = 31L;
671     long l12 = 32L;
672     long l13 = 33L;
673     long l14 = 34L;
674     long l15 = 35L;
675     float f0 = 40.0f;
676     float f1 = 41.0f;
677     float f2 = 42.0f;
678     float f3 = 43.0f;
679     float f4 = 44.0f;
680     float f5 = 45.0f;
681     float f6 = 46.0f;
682     float f7 = 47.0f;
683     float f8 = 48.0f;
684     float f9 = 49.0f;
685     float f10 = 50.0f;
686     float f11 = 51.0f;
687     float f12 = 52.0f;
688     float f13 = 53.0f;
689     float f14 = 54.0f;
690     float f15 = 55.0f;
691     double d0 = 60.0;
692     double d1 = 61.0;
693     double d2 = 62.0;
694     double d3 = 63.0;
695     double d4 = 64.0;
696     double d5 = 65.0;
697     double d6 = 66.0;
698     double d7 = 67.0;
699     double d8 = 68.0;
700     double d9 = 69.0;
701     double d10 = 70.0;
702     double d11 = 71.0;
703     double d12 = 72.0;
704     double d13 = 73.0;
705     double d14 = 74.0;
706     double d15 = 75.0;
707     int addInt = -1;
708     long addLong = -2L;
709     float addFloat = -3.0f;
710     double addDouble = -4.0;
711     Main m = null;
712     int i = 0;
713     try {
714       for (i = 0; i < array.length; ++i) {
715         m = array[i];
716         // We have 16 ints, 16 longs, 16 floats, 16 doubles and a few helper variables here,
717         // none of them anonymous. Hopefully, all available physical registers will be allocated
718         // to these variables, so that when `m.intField` throws NPE during the third iteration,
719         // we will fully test retrieval of values from all physical registers.
720         addInt = m.intField;
721         addLong = m.longField;
722         addFloat = m.floatField;
723         addDouble = m.doubleField;
724         i0 += i1;
725         i1 += i2;
726         i2 += i3;
727         i3 += i4;
728         i4 += i5;
729         i5 += i6;
730         i6 += i7;
731         i7 += i8;
732         i8 += i9;
733         i9 += i10;
734         i10 += i11;
735         i11 += i12;
736         i12 += i13;
737         i13 += i14;
738         i14 += i15;
739         i15 += addInt;
740         l0 += l1;
741         l1 += l2;
742         l2 += l3;
743         l3 += l4;
744         l4 += l5;
745         l5 += l6;
746         l6 += l7;
747         l7 += l8;
748         l8 += l9;
749         l9 += l10;
750         l10 += l11;
751         l11 += l12;
752         l12 += l13;
753         l13 += l14;
754         l14 += l15;
755         l15 += addLong;
756         f0 += f1;
757         f1 += f2;
758         f2 += f3;
759         f3 += f4;
760         f4 += f5;
761         f5 += f6;
762         f6 += f7;
763         f7 += f8;
764         f8 += f9;
765         f9 += f10;
766         f10 += f11;
767         f11 += f12;
768         f12 += f13;
769         f13 += f14;
770         f14 += f15;
771         f15 += addFloat;
772         d0 += d1;
773         d1 += d2;
774         d2 += d3;
775         d3 += d4;
776         d4 += d5;
777         d5 += d6;
778         d6 += d7;
779         d7 += d8;
780         d8 += d9;
781         d9 += d10;
782         d10 += d11;
783         d11 += d12;
784         d12 += d13;
785         d13 += d14;
786         d14 += d15;
787         d15 += addDouble;
788       }
789     } catch (NullPointerException npe) {
790       System.out.println("i0=" + i0);
791       System.out.println("i1=" + i1);
792       System.out.println("i2=" + i2);
793       System.out.println("i3=" + i3);
794       System.out.println("i4=" + i4);
795       System.out.println("i5=" + i5);
796       System.out.println("i6=" + i6);
797       System.out.println("i7=" + i7);
798       System.out.println("i8=" + i8);
799       System.out.println("i9=" + i9);
800       System.out.println("i10=" + i10);
801       System.out.println("i11=" + i11);
802       System.out.println("i12=" + i12);
803       System.out.println("i13=" + i13);
804       System.out.println("i14=" + i14);
805       System.out.println("i15=" + i15);
806       System.out.println("l0=" + l0);
807       System.out.println("l1=" + l1);
808       System.out.println("l2=" + l2);
809       System.out.println("l3=" + l3);
810       System.out.println("l4=" + l4);
811       System.out.println("l5=" + l5);
812       System.out.println("l6=" + l6);
813       System.out.println("l7=" + l7);
814       System.out.println("l8=" + l8);
815       System.out.println("l9=" + l9);
816       System.out.println("l10=" + l10);
817       System.out.println("l11=" + l11);
818       System.out.println("l12=" + l12);
819       System.out.println("l13=" + l13);
820       System.out.println("l14=" + l14);
821       System.out.println("l15=" + l15);
822       System.out.println("f0=" + f0);
823       System.out.println("f1=" + f1);
824       System.out.println("f2=" + f2);
825       System.out.println("f3=" + f3);
826       System.out.println("f4=" + f4);
827       System.out.println("f5=" + f5);
828       System.out.println("f6=" + f6);
829       System.out.println("f7=" + f7);
830       System.out.println("f8=" + f8);
831       System.out.println("f9=" + f9);
832       System.out.println("f10=" + f10);
833       System.out.println("f11=" + f11);
834       System.out.println("f12=" + f12);
835       System.out.println("f13=" + f13);
836       System.out.println("f14=" + f14);
837       System.out.println("f15=" + f15);
838       System.out.println("d0=" + d0);
839       System.out.println("d1=" + d1);
840       System.out.println("d2=" + d2);
841       System.out.println("d3=" + d3);
842       System.out.println("d4=" + d4);
843       System.out.println("d5=" + d5);
844       System.out.println("d6=" + d6);
845       System.out.println("d7=" + d7);
846       System.out.println("d8=" + d8);
847       System.out.println("d9=" + d9);
848       System.out.println("d10=" + d10);
849       System.out.println("d11=" + d11);
850       System.out.println("d12=" + d12);
851       System.out.println("d13=" + d13);
852       System.out.println("d14=" + d14);
853       System.out.println("d15=" + d15);
854       System.out.println("addInt=" + addInt);
855       System.out.println("addLong=" + addLong);
856       System.out.println("addFloat=" + addFloat);
857       System.out.println("addDouble=" + addDouble);
858       System.out.println("m=" + m);
859       System.out.println("i=" + i);
860     }
861   }
862 
$noinline$PrepareArray()863   static Main[] $noinline$PrepareArray() {
864     if (doThrow) { throw new Error(); }
865     Main[] array = new Main[] { new Main(), new Main(), null, new Main() };
866     array[1].intField = 42;
867     array[1].longField = 111L;
868     array[1].floatField = 0.5f;
869     array[1].doubleField = 0.125;
870     return array;
871   }
872 
check(NullPointerException npe, int mainLine, int methodLine, String methodName)873   static void check(NullPointerException npe, int mainLine, int methodLine, String methodName) {
874     System.out.println(methodName);
875     StackTraceElement[] trace = npe.getStackTrace();
876     checkElement(trace[0], "Main", methodName, "Main.java", methodLine);
877     checkElement(trace[1], "Main", "main", "Main.java", mainLine);
878   }
879 
checkElement(StackTraceElement element, String declaringClass, String methodName, String fileName, int lineNumber)880   static void checkElement(StackTraceElement element,
881                            String declaringClass, String methodName,
882                            String fileName, int lineNumber) {
883     assertEquals(declaringClass, element.getClassName());
884     assertEquals(methodName, element.getMethodName());
885     assertEquals(fileName, element.getFileName());
886     assertEquals(lineNumber, element.getLineNumber());
887   }
888 
assertEquals(Object expected, Object actual)889   static void assertEquals(Object expected, Object actual) {
890     if (!expected.equals(actual)) {
891       String msg = "Expected \"" + expected + "\" but got \"" + actual + "\"";
892       throw new AssertionError(msg);
893     }
894   }
895 
assertEquals(int expected, int actual)896   static void assertEquals(int expected, int actual) {
897     if (expected != actual) {
898       throw new AssertionError("Expected " + expected + " got " + actual);
899     }
900   }
901 
902 }
903