xref: /aosp_15_r20/art/test/106-exceptions2/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker class Main {
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker     public int ifoo;
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker     /* Test requires visual inspection of object code to verify */
noThrow(Main nonNullA, Main nonNullB, Main nonNullC)22*795d594fSAndroid Build Coastguard Worker     int noThrow(Main nonNullA,
23*795d594fSAndroid Build Coastguard Worker                 Main nonNullB,
24*795d594fSAndroid Build Coastguard Worker                 Main nonNullC) {
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker         // "this" check should be eliminated on both IGET/IPUT
27*795d594fSAndroid Build Coastguard Worker         ifoo++;
28*795d594fSAndroid Build Coastguard Worker 
29*795d594fSAndroid Build Coastguard Worker        // "this" check should be eliminated on both IGET/IPUT
30*795d594fSAndroid Build Coastguard Worker        if (ifoo != 321) {
31*795d594fSAndroid Build Coastguard Worker            // Check not eliminated
32*795d594fSAndroid Build Coastguard Worker            nonNullA.ifoo = 12;
33*795d594fSAndroid Build Coastguard Worker            // Check not eliminated
34*795d594fSAndroid Build Coastguard Worker            nonNullB.ifoo = 21;
35*795d594fSAndroid Build Coastguard Worker        } else {
36*795d594fSAndroid Build Coastguard Worker            // Check not eliminated
37*795d594fSAndroid Build Coastguard Worker            nonNullA.ifoo = 12;
38*795d594fSAndroid Build Coastguard Worker        }
39*795d594fSAndroid Build Coastguard Worker 
40*795d594fSAndroid Build Coastguard Worker        // Check eliminated
41*795d594fSAndroid Build Coastguard Worker        nonNullA.ifoo = 13;
42*795d594fSAndroid Build Coastguard Worker 
43*795d594fSAndroid Build Coastguard Worker        // Check not eliminated
44*795d594fSAndroid Build Coastguard Worker        nonNullB.ifoo = 21;
45*795d594fSAndroid Build Coastguard Worker 
46*795d594fSAndroid Build Coastguard Worker        nonNullC = nonNullB;
47*795d594fSAndroid Build Coastguard Worker 
48*795d594fSAndroid Build Coastguard Worker        // Check eliminated
49*795d594fSAndroid Build Coastguard Worker        nonNullC.ifoo = 32;
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker       // All null checks eliminated
52*795d594fSAndroid Build Coastguard Worker       return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo;
53*795d594fSAndroid Build Coastguard Worker     }
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker     /* Test to ensure we don't remove necessary null checks */
checkThrow(Main nonNullA, Main nonNullB, Main nonNullC, Main nullA, Main nullB, Main nullC)56*795d594fSAndroid Build Coastguard Worker     int checkThrow(Main nonNullA,
57*795d594fSAndroid Build Coastguard Worker                    Main nonNullB,
58*795d594fSAndroid Build Coastguard Worker                    Main nonNullC,
59*795d594fSAndroid Build Coastguard Worker                    Main nullA,
60*795d594fSAndroid Build Coastguard Worker                    Main nullB,
61*795d594fSAndroid Build Coastguard Worker                    Main nullC) {
62*795d594fSAndroid Build Coastguard Worker 
63*795d594fSAndroid Build Coastguard Worker         // "this" check should be eliminated on both IGET/IPUT
64*795d594fSAndroid Build Coastguard Worker         ifoo++;
65*795d594fSAndroid Build Coastguard Worker 
66*795d594fSAndroid Build Coastguard Worker        try {
67*795d594fSAndroid Build Coastguard Worker            nullA.ifoo = 12;
68*795d594fSAndroid Build Coastguard Worker            // Should not be reached
69*795d594fSAndroid Build Coastguard Worker            return -1;
70*795d594fSAndroid Build Coastguard Worker        } catch (NullPointerException npe) {
71*795d594fSAndroid Build Coastguard Worker            ifoo++;
72*795d594fSAndroid Build Coastguard Worker        }
73*795d594fSAndroid Build Coastguard Worker        try {
74*795d594fSAndroid Build Coastguard Worker            nullB.ifoo = 13;
75*795d594fSAndroid Build Coastguard Worker            // Should not be reached
76*795d594fSAndroid Build Coastguard Worker            return -2;
77*795d594fSAndroid Build Coastguard Worker        } catch (NullPointerException npe) {
78*795d594fSAndroid Build Coastguard Worker            ifoo++;
79*795d594fSAndroid Build Coastguard Worker        }
80*795d594fSAndroid Build Coastguard Worker        try {
81*795d594fSAndroid Build Coastguard Worker            nullC.ifoo = 14;
82*795d594fSAndroid Build Coastguard Worker            // Should not be reached
83*795d594fSAndroid Build Coastguard Worker            return -3;
84*795d594fSAndroid Build Coastguard Worker        } catch (NullPointerException npe) {
85*795d594fSAndroid Build Coastguard Worker            ifoo++;
86*795d594fSAndroid Build Coastguard Worker        }
87*795d594fSAndroid Build Coastguard Worker 
88*795d594fSAndroid Build Coastguard Worker        // "this" check should be eliminated
89*795d594fSAndroid Build Coastguard Worker        if (ifoo != 321) {
90*795d594fSAndroid Build Coastguard Worker            // Check not eliminated
91*795d594fSAndroid Build Coastguard Worker            nonNullA.ifoo = 12;
92*795d594fSAndroid Build Coastguard Worker            // Check not eliminated
93*795d594fSAndroid Build Coastguard Worker            nonNullB.ifoo = 21;
94*795d594fSAndroid Build Coastguard Worker            // Should throw here
95*795d594fSAndroid Build Coastguard Worker            try {
96*795d594fSAndroid Build Coastguard Worker                nullA.ifoo = 11;
97*795d594fSAndroid Build Coastguard Worker                return -4;
98*795d594fSAndroid Build Coastguard Worker            } catch (NullPointerException npe) {
99*795d594fSAndroid Build Coastguard Worker            }
100*795d594fSAndroid Build Coastguard Worker        } else {
101*795d594fSAndroid Build Coastguard Worker            // Check not eliminated
102*795d594fSAndroid Build Coastguard Worker            nonNullA.ifoo = 12;
103*795d594fSAndroid Build Coastguard Worker            // Should throw here
104*795d594fSAndroid Build Coastguard Worker            try {
105*795d594fSAndroid Build Coastguard Worker                nullA.ifoo = 11;
106*795d594fSAndroid Build Coastguard Worker                return -5;
107*795d594fSAndroid Build Coastguard Worker            } catch (NullPointerException npe) {
108*795d594fSAndroid Build Coastguard Worker            }
109*795d594fSAndroid Build Coastguard Worker        }
110*795d594fSAndroid Build Coastguard Worker 
111*795d594fSAndroid Build Coastguard Worker        // Check not eliminated
112*795d594fSAndroid Build Coastguard Worker        nonNullA.ifoo = 13;
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker        // Check not eliminated
115*795d594fSAndroid Build Coastguard Worker        nonNullB.ifoo = 21;
116*795d594fSAndroid Build Coastguard Worker 
117*795d594fSAndroid Build Coastguard Worker        nonNullC = nonNullB;
118*795d594fSAndroid Build Coastguard Worker 
119*795d594fSAndroid Build Coastguard Worker        // Check eliminated
120*795d594fSAndroid Build Coastguard Worker        nonNullC.ifoo = 32;
121*795d594fSAndroid Build Coastguard Worker 
122*795d594fSAndroid Build Coastguard Worker        // Should throw here
123*795d594fSAndroid Build Coastguard Worker        try {
124*795d594fSAndroid Build Coastguard Worker            nullA.ifoo = 13;
125*795d594fSAndroid Build Coastguard Worker            return -6;
126*795d594fSAndroid Build Coastguard Worker        } catch (NullPointerException npe) {
127*795d594fSAndroid Build Coastguard Worker        }
128*795d594fSAndroid Build Coastguard Worker 
129*795d594fSAndroid Build Coastguard Worker       return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo;
130*795d594fSAndroid Build Coastguard Worker     }
131*795d594fSAndroid Build Coastguard Worker 
132*795d594fSAndroid Build Coastguard Worker 
nullCheckTestNoThrow(int x)133*795d594fSAndroid Build Coastguard Worker     static int nullCheckTestNoThrow(int x) {
134*795d594fSAndroid Build Coastguard Worker         Main base = new Main();
135*795d594fSAndroid Build Coastguard Worker         Main a = new Main();
136*795d594fSAndroid Build Coastguard Worker         Main b = new Main();
137*795d594fSAndroid Build Coastguard Worker         Main c = new Main();
138*795d594fSAndroid Build Coastguard Worker         base.ifoo = x;
139*795d594fSAndroid Build Coastguard Worker         return base.noThrow(a,b,c);
140*795d594fSAndroid Build Coastguard Worker     }
141*795d594fSAndroid Build Coastguard Worker 
nullCheckTestThrow(int x)142*795d594fSAndroid Build Coastguard Worker     static int nullCheckTestThrow(int x) {
143*795d594fSAndroid Build Coastguard Worker         Main base = new Main();
144*795d594fSAndroid Build Coastguard Worker         Main a = new Main();
145*795d594fSAndroid Build Coastguard Worker         Main b = new Main();
146*795d594fSAndroid Build Coastguard Worker         Main c = new Main();
147*795d594fSAndroid Build Coastguard Worker         Main d = null;
148*795d594fSAndroid Build Coastguard Worker         Main e = null;
149*795d594fSAndroid Build Coastguard Worker         Main f = null;
150*795d594fSAndroid Build Coastguard Worker         base.ifoo = x;
151*795d594fSAndroid Build Coastguard Worker         return base.checkThrow(a,b,c,d,e,f);
152*795d594fSAndroid Build Coastguard Worker     }
153*795d594fSAndroid Build Coastguard Worker 
154*795d594fSAndroid Build Coastguard Worker 
throwImplicitAIOBE(int[] array, int index)155*795d594fSAndroid Build Coastguard Worker     static void throwImplicitAIOBE(int[] array, int index) {
156*795d594fSAndroid Build Coastguard Worker       array[index] = 0;
157*795d594fSAndroid Build Coastguard Worker     }
158*795d594fSAndroid Build Coastguard Worker 
checkAIOBE()159*795d594fSAndroid Build Coastguard Worker     static int checkAIOBE() {
160*795d594fSAndroid Build Coastguard Worker       int[] array = new int[10];
161*795d594fSAndroid Build Coastguard Worker       int res;
162*795d594fSAndroid Build Coastguard Worker       try {
163*795d594fSAndroid Build Coastguard Worker         throwImplicitAIOBE(array, 11);
164*795d594fSAndroid Build Coastguard Worker         res = 123;
165*795d594fSAndroid Build Coastguard Worker       } catch (NullPointerException npe) {
166*795d594fSAndroid Build Coastguard Worker         res = 768;
167*795d594fSAndroid Build Coastguard Worker       } catch (ArrayIndexOutOfBoundsException e) {
168*795d594fSAndroid Build Coastguard Worker         res = 456;
169*795d594fSAndroid Build Coastguard Worker       }
170*795d594fSAndroid Build Coastguard Worker       try {
171*795d594fSAndroid Build Coastguard Worker         throwImplicitAIOBE(array, -1);
172*795d594fSAndroid Build Coastguard Worker         res += 123;
173*795d594fSAndroid Build Coastguard Worker       } catch (NullPointerException npe) {
174*795d594fSAndroid Build Coastguard Worker         res += 768;
175*795d594fSAndroid Build Coastguard Worker       } catch (ArrayIndexOutOfBoundsException e) {
176*795d594fSAndroid Build Coastguard Worker         res += 456;
177*795d594fSAndroid Build Coastguard Worker       }
178*795d594fSAndroid Build Coastguard Worker       return res;
179*795d594fSAndroid Build Coastguard Worker     }
180*795d594fSAndroid Build Coastguard Worker 
throwImplicitDivZero(int x, int y)181*795d594fSAndroid Build Coastguard Worker     static int throwImplicitDivZero(int x, int y) {
182*795d594fSAndroid Build Coastguard Worker       return x / y;
183*795d594fSAndroid Build Coastguard Worker     }
184*795d594fSAndroid Build Coastguard Worker 
checkDivZero()185*795d594fSAndroid Build Coastguard Worker     static int checkDivZero() {
186*795d594fSAndroid Build Coastguard Worker       try {
187*795d594fSAndroid Build Coastguard Worker         throwImplicitDivZero(100, 0);
188*795d594fSAndroid Build Coastguard Worker         return 123;
189*795d594fSAndroid Build Coastguard Worker       } catch (NullPointerException npe) {
190*795d594fSAndroid Build Coastguard Worker         return 768;
191*795d594fSAndroid Build Coastguard Worker       } catch (ArrayIndexOutOfBoundsException e) {
192*795d594fSAndroid Build Coastguard Worker         return 987;
193*795d594fSAndroid Build Coastguard Worker       } catch (ArithmeticException e) {
194*795d594fSAndroid Build Coastguard Worker         return 456;
195*795d594fSAndroid Build Coastguard Worker       }
196*795d594fSAndroid Build Coastguard Worker     }
197*795d594fSAndroid Build Coastguard Worker 
main(String[] args)198*795d594fSAndroid Build Coastguard Worker     public static void main(String[] args) {
199*795d594fSAndroid Build Coastguard Worker         boolean failure = false;
200*795d594fSAndroid Build Coastguard Worker         int res;
201*795d594fSAndroid Build Coastguard Worker 
202*795d594fSAndroid Build Coastguard Worker         res = nullCheckTestNoThrow(1976);
203*795d594fSAndroid Build Coastguard Worker         if (res == 2054) {
204*795d594fSAndroid Build Coastguard Worker             System.out.println("nullCheckTestNoThrow PASSED");
205*795d594fSAndroid Build Coastguard Worker         } else {
206*795d594fSAndroid Build Coastguard Worker             System.out.println("nullCheckTestNoThrow FAILED: " + res);
207*795d594fSAndroid Build Coastguard Worker             failure = true;
208*795d594fSAndroid Build Coastguard Worker         }
209*795d594fSAndroid Build Coastguard Worker 
210*795d594fSAndroid Build Coastguard Worker         res = nullCheckTestThrow(1976);
211*795d594fSAndroid Build Coastguard Worker         if (res == 2057) {
212*795d594fSAndroid Build Coastguard Worker             System.out.println("nullCheckTestThrow PASSED");
213*795d594fSAndroid Build Coastguard Worker         } else {
214*795d594fSAndroid Build Coastguard Worker             System.out.println("nullCheckTestThrow FAILED: " + res);
215*795d594fSAndroid Build Coastguard Worker             failure = true;
216*795d594fSAndroid Build Coastguard Worker         }
217*795d594fSAndroid Build Coastguard Worker 
218*795d594fSAndroid Build Coastguard Worker         res = checkAIOBE();
219*795d594fSAndroid Build Coastguard Worker         if (res == 912) {
220*795d594fSAndroid Build Coastguard Worker           System.out.println("checkAIOBE PASSED");
221*795d594fSAndroid Build Coastguard Worker         } else {
222*795d594fSAndroid Build Coastguard Worker           System.out.println("checkAIOBE FAILED: " + res);
223*795d594fSAndroid Build Coastguard Worker           failure = true;
224*795d594fSAndroid Build Coastguard Worker         }
225*795d594fSAndroid Build Coastguard Worker 
226*795d594fSAndroid Build Coastguard Worker         res = checkDivZero();
227*795d594fSAndroid Build Coastguard Worker         if (res == 456) {
228*795d594fSAndroid Build Coastguard Worker           System.out.println("checkDivZero PASSED");
229*795d594fSAndroid Build Coastguard Worker         } else {
230*795d594fSAndroid Build Coastguard Worker           System.out.println("checkDivZero FAILED: " + res);
231*795d594fSAndroid Build Coastguard Worker           failure = true;
232*795d594fSAndroid Build Coastguard Worker         }
233*795d594fSAndroid Build Coastguard Worker         System.exit(failure ? 1 : 0);
234*795d594fSAndroid Build Coastguard Worker     }
235*795d594fSAndroid Build Coastguard Worker }
236