xref: /aosp_15_r20/art/test/542-inline-trycatch/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2014 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 public class Main {
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker   // The following tests make sure that we inline methods used inside try and catch
20*795d594fSAndroid Build Coastguard Worker   // blocks, provided they meet other inlining criteria. To do that, we rely on
21*795d594fSAndroid Build Coastguard Worker   // the compiler recognizing and enforcing the $inline$ and $noinline$ markers.
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker   // We expect a single block to always be inlined.
24*795d594fSAndroid Build Coastguard Worker 
$inline$SingleBlock(String str)25*795d594fSAndroid Build Coastguard Worker   private static int $inline$SingleBlock(String str) throws NumberFormatException {
26*795d594fSAndroid Build Coastguard Worker     return Integer.parseInt(str);
27*795d594fSAndroid Build Coastguard Worker   }
28*795d594fSAndroid Build Coastguard Worker 
29*795d594fSAndroid Build Coastguard Worker   // We expect a "simple" method with multiple blocks to always be inlined.
30*795d594fSAndroid Build Coastguard Worker 
$inline$MultipleBlocks(String str, boolean is_hex)31*795d594fSAndroid Build Coastguard Worker   private static int $inline$MultipleBlocks(String str, boolean is_hex)
32*795d594fSAndroid Build Coastguard Worker       throws NumberFormatException {
33*795d594fSAndroid Build Coastguard Worker     return is_hex ? Integer.parseInt(str, 16) : Integer.parseInt(str);
34*795d594fSAndroid Build Coastguard Worker   }
35*795d594fSAndroid Build Coastguard Worker 
testSingleBlockFromTry()36*795d594fSAndroid Build Coastguard Worker   public static void testSingleBlockFromTry() {
37*795d594fSAndroid Build Coastguard Worker     int val = 0;
38*795d594fSAndroid Build Coastguard Worker 
39*795d594fSAndroid Build Coastguard Worker     try {
40*795d594fSAndroid Build Coastguard Worker       val = $inline$SingleBlock("42");
41*795d594fSAndroid Build Coastguard Worker     } catch (NumberFormatException ex) {
42*795d594fSAndroid Build Coastguard Worker       unreachable();
43*795d594fSAndroid Build Coastguard Worker     }
44*795d594fSAndroid Build Coastguard Worker     assertEquals(42, val);
45*795d594fSAndroid Build Coastguard Worker 
46*795d594fSAndroid Build Coastguard Worker     try {
47*795d594fSAndroid Build Coastguard Worker       $inline$SingleBlock("xyz");
48*795d594fSAndroid Build Coastguard Worker       unreachable();
49*795d594fSAndroid Build Coastguard Worker     } catch (NumberFormatException ex) {}
50*795d594fSAndroid Build Coastguard Worker   }
51*795d594fSAndroid Build Coastguard Worker 
testSingleBlockFromCatch()52*795d594fSAndroid Build Coastguard Worker   public static void testSingleBlockFromCatch() {
53*795d594fSAndroid Build Coastguard Worker     int val = 0;
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker     try {
56*795d594fSAndroid Build Coastguard Worker       throwException();
57*795d594fSAndroid Build Coastguard Worker     } catch (Exception ex) {
58*795d594fSAndroid Build Coastguard Worker       val = $inline$SingleBlock("42");
59*795d594fSAndroid Build Coastguard Worker     }
60*795d594fSAndroid Build Coastguard Worker     assertEquals(42, val);
61*795d594fSAndroid Build Coastguard Worker   }
62*795d594fSAndroid Build Coastguard Worker 
testMultipleBlocksFromTry()63*795d594fSAndroid Build Coastguard Worker   public static void testMultipleBlocksFromTry() {
64*795d594fSAndroid Build Coastguard Worker     int val = 0;
65*795d594fSAndroid Build Coastguard Worker 
66*795d594fSAndroid Build Coastguard Worker     try {
67*795d594fSAndroid Build Coastguard Worker       val = $inline$MultipleBlocks("42", false);
68*795d594fSAndroid Build Coastguard Worker     } catch (NumberFormatException ex) {
69*795d594fSAndroid Build Coastguard Worker       unreachable();
70*795d594fSAndroid Build Coastguard Worker     }
71*795d594fSAndroid Build Coastguard Worker     assertEquals(42, val);
72*795d594fSAndroid Build Coastguard Worker 
73*795d594fSAndroid Build Coastguard Worker     try {
74*795d594fSAndroid Build Coastguard Worker       val = $inline$MultipleBlocks("20", true);
75*795d594fSAndroid Build Coastguard Worker     } catch (NumberFormatException ex) {
76*795d594fSAndroid Build Coastguard Worker       unreachable();
77*795d594fSAndroid Build Coastguard Worker     }
78*795d594fSAndroid Build Coastguard Worker     assertEquals(32, val);
79*795d594fSAndroid Build Coastguard Worker 
80*795d594fSAndroid Build Coastguard Worker     try {
81*795d594fSAndroid Build Coastguard Worker       $inline$MultipleBlocks("xyz", false);
82*795d594fSAndroid Build Coastguard Worker       unreachable();
83*795d594fSAndroid Build Coastguard Worker     } catch (NumberFormatException ex) {}
84*795d594fSAndroid Build Coastguard Worker 
85*795d594fSAndroid Build Coastguard Worker     try {
86*795d594fSAndroid Build Coastguard Worker       $inline$MultipleBlocks("xyz", true);
87*795d594fSAndroid Build Coastguard Worker       unreachable();
88*795d594fSAndroid Build Coastguard Worker     } catch (NumberFormatException ex) {}
89*795d594fSAndroid Build Coastguard Worker   }
90*795d594fSAndroid Build Coastguard Worker 
testMultipleBlocksFromCatch()91*795d594fSAndroid Build Coastguard Worker   public static void testMultipleBlocksFromCatch() {
92*795d594fSAndroid Build Coastguard Worker     int val = 0;
93*795d594fSAndroid Build Coastguard Worker 
94*795d594fSAndroid Build Coastguard Worker     try {
95*795d594fSAndroid Build Coastguard Worker       throwException();
96*795d594fSAndroid Build Coastguard Worker     } catch (Exception ex) {
97*795d594fSAndroid Build Coastguard Worker       val = $inline$MultipleBlocks("42", false);
98*795d594fSAndroid Build Coastguard Worker     }
99*795d594fSAndroid Build Coastguard Worker     assertEquals(42, val);
100*795d594fSAndroid Build Coastguard Worker 
101*795d594fSAndroid Build Coastguard Worker     try {
102*795d594fSAndroid Build Coastguard Worker       throwException();
103*795d594fSAndroid Build Coastguard Worker     } catch (Exception ex) {
104*795d594fSAndroid Build Coastguard Worker       val = $inline$MultipleBlocks("20", true);
105*795d594fSAndroid Build Coastguard Worker     }
106*795d594fSAndroid Build Coastguard Worker     assertEquals(32, val);
107*795d594fSAndroid Build Coastguard Worker   }
108*795d594fSAndroid Build Coastguard Worker 
main(String[] args)109*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
110*795d594fSAndroid Build Coastguard Worker     testSingleBlockFromTry();
111*795d594fSAndroid Build Coastguard Worker     testSingleBlockFromCatch();
112*795d594fSAndroid Build Coastguard Worker     testMultipleBlocksFromTry();
113*795d594fSAndroid Build Coastguard Worker     testMultipleBlocksFromCatch();
114*795d594fSAndroid Build Coastguard Worker   }
115*795d594fSAndroid Build Coastguard Worker 
assertEquals(int expected, int actual)116*795d594fSAndroid Build Coastguard Worker   private static void assertEquals(int expected, int actual) {
117*795d594fSAndroid Build Coastguard Worker     if (expected != actual) {
118*795d594fSAndroid Build Coastguard Worker       throw new AssertionError("Wrong result: " + expected + " != " + actual);
119*795d594fSAndroid Build Coastguard Worker     }
120*795d594fSAndroid Build Coastguard Worker   }
121*795d594fSAndroid Build Coastguard Worker 
unreachable()122*795d594fSAndroid Build Coastguard Worker   private static void unreachable() {
123*795d594fSAndroid Build Coastguard Worker     throw new Error("Unreachable");
124*795d594fSAndroid Build Coastguard Worker   }
125*795d594fSAndroid Build Coastguard Worker 
throwException()126*795d594fSAndroid Build Coastguard Worker   private static void throwException() throws Exception {
127*795d594fSAndroid Build Coastguard Worker     throw new Exception();
128*795d594fSAndroid Build Coastguard Worker   }
129*795d594fSAndroid Build Coastguard Worker }
130