blob: 5f068f1b0911e4e75b2d6dae6c048d0e1f3bb7f9 [file] [log] [blame]
Nicolas Geoffray85c7bab2015-09-18 13:40:46 +00001/*
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
17public class Main {
18
19 static Object exactCheck = new ExactCheck();
20 static Object abstractCheckImpl = new AbstractCheckImpl();
21 static Object interfaceCheckImpl = new InterfaceCheckImpl();
22 static Object normalCheck = new NormalCheck();
23 static Object regularObject = new Object();
24 static Object objectArray = new Object[2];
25 static Object intArray = new int[2];
26 static Object doubleArray = new double[2];
27 static Object exactArray = new ExactCheck[2];
28 static Object normalArray = new NormalCheck[2];
29
30 static Object field;
31
32 public static void main(String[] args) {
33 checkInstanceOfNonTryCatch();
34 // We also check for a method with try/catch because the compiler then makes a slow
35 // path unconditionally save its live registers.
36 checkInstanceOfTryCatch();
37
38 checkCheckCast();
39 }
40
41 public static void checkInstanceOfNonTryCatch() {
42 check(true, exactCheck instanceof ExactCheck);
43 check(false, regularObject instanceof ExactCheck);
44
45 check(true, abstractCheckImpl instanceof AbstractCheck);
46 check(false, regularObject instanceof AbstractCheck);
47
48 check(true, interfaceCheckImpl instanceof InterfaceCheck);
49 check(false, regularObject instanceof InterfaceCheck);
50
51 check(true, normalCheck instanceof NormalCheck);
52 check(true, exactCheck instanceof NormalCheck);
53 check(false, regularObject instanceof NormalCheck);
54
55 check(false, regularObject instanceof int[]);
56 check(false, objectArray instanceof int[]);
57 check(true, intArray instanceof int[]);
58 check(false, doubleArray instanceof int[]);
59
60 check(false, regularObject instanceof ExactCheck[]);
61 check(false, objectArray instanceof ExactCheck[]);
62 check(false, doubleArray instanceof ExactCheck[]);
63 check(true, exactArray instanceof ExactCheck[]);
64 check(false, normalArray instanceof ExactCheck[]);
65
66 check(false, regularObject instanceof NormalCheck[]);
67 check(false, objectArray instanceof NormalCheck[]);
68 check(false, doubleArray instanceof NormalCheck[]);
69 check(true, exactArray instanceof NormalCheck[]);
70 check(true, normalArray instanceof NormalCheck[]);
71
72 check(false, regularObject instanceof Object[]);
73 check(true, objectArray instanceof Object[]);
74 check(false, doubleArray instanceof Object[]);
75 check(true, exactArray instanceof Object[]);
76 check(true, normalArray instanceof Object[]);
77 }
78
79 public static void checkInstanceOfTryCatch() {
80 try {
81 check(true, exactCheck instanceof ExactCheck);
82 check(false, regularObject instanceof ExactCheck);
83
84 check(true, abstractCheckImpl instanceof AbstractCheck);
85 check(false, regularObject instanceof AbstractCheck);
86
87 check(true, interfaceCheckImpl instanceof InterfaceCheck);
88 check(false, regularObject instanceof InterfaceCheck);
89
90 check(true, normalCheck instanceof NormalCheck);
91 check(true, exactCheck instanceof NormalCheck);
92 check(false, regularObject instanceof NormalCheck);
93
94 check(false, regularObject instanceof int[]);
95 check(false, objectArray instanceof int[]);
96 check(true, intArray instanceof int[]);
97 check(false, doubleArray instanceof int[]);
98
99 check(false, regularObject instanceof ExactCheck[]);
100 check(false, objectArray instanceof ExactCheck[]);
101 check(false, doubleArray instanceof ExactCheck[]);
102 check(true, exactArray instanceof ExactCheck[]);
103 check(false, normalArray instanceof ExactCheck[]);
104
105 check(false, regularObject instanceof NormalCheck[]);
106 check(false, objectArray instanceof NormalCheck[]);
107 check(false, doubleArray instanceof NormalCheck[]);
108 check(true, exactArray instanceof NormalCheck[]);
109 check(true, normalArray instanceof NormalCheck[]);
110
111 check(false, regularObject instanceof Object[]);
112 check(true, objectArray instanceof Object[]);
113 check(false, doubleArray instanceof Object[]);
114 check(true, exactArray instanceof Object[]);
115 check(true, normalArray instanceof Object[]);
116 } catch (Throwable t) {
117 throw new Error("Unreachable");
118 }
119 }
120
121 public static void check(boolean expected, boolean actual) {
122 if (actual != expected) {
123 throw new Error("Expected " + expected + ", got " + actual);
124 }
125 }
126
127 public static void checkCheckCast() {
128 // Exact check.
129 field = (ExactCheck)exactCheck;
130 try {
131 field = (ExactCheck)regularObject;
132 throw new Error("Can't reach here");
133 } catch (ClassCastException ignore) {}
134
135 // Abstract check.
136 field = (AbstractCheck)abstractCheckImpl;
137 try {
138 field = (AbstractCheck)regularObject;
139 throw new Error("Can't reach here");
140 } catch (ClassCastException ignore) {}
141
142 // Interface check.
143 field = (InterfaceCheck)interfaceCheckImpl;
144 try {
145 field = (InterfaceCheck)regularObject;
146 throw new Error("Can't reach here");
147 } catch (ClassCastException ignore) {}
148
149 // Normal check.
150 field = (NormalCheck)normalCheck;
151 field = (NormalCheck)exactCheck;
152 try {
153 field = (NormalCheck)regularObject;
154 throw new Error("Can't reach here");
155 } catch (ClassCastException ignore) {}
156
157 // Primitive array check.
158 try {
159 field = (int[])regularObject;
160 throw new Error("Can't reach here");
161 } catch (ClassCastException ignore) {}
162
163 try {
164 field = (int[])objectArray;
165 throw new Error("Can't reach here");
166 } catch (ClassCastException ignore) {}
167
168 field = (int[])intArray;
169 try {
170 field = (int[])doubleArray;
171 throw new Error("Can't reach here");
172 } catch (ClassCastException ignore) {}
173
174 // Array with final component type check.
175 try {
176 field = (ExactCheck[])regularObject;
177 throw new Error("Can't reach here");
178 } catch (ClassCastException ignore) {}
179
180 try {
181 field = (ExactCheck[])objectArray;
182 throw new Error("Can't reach here");
183 } catch (ClassCastException ignore) {}
184
185 try {
186 field = (ExactCheck[])doubleArray;
187 throw new Error("Can't reach here");
188 } catch (ClassCastException ignore) {}
189
190 field = (ExactCheck[])exactArray;
191 try {
192 field = (ExactCheck[])normalArray;
193 throw new Error("Can't reach here");
194 } catch (ClassCastException ignore) {}
195
196 // Array with non final component type check.
197 try {
198 field = (NormalCheck[])regularObject;
199 throw new Error("Can't reach here");
200 } catch (ClassCastException ignore) {}
201
202 try {
203 field = (NormalCheck[])objectArray;
204 throw new Error("Can't reach here");
205 } catch (ClassCastException ignore) {}
206
207 try {
208 field = (NormalCheck[])doubleArray;
209 throw new Error("Can't reach here");
210 } catch (ClassCastException ignore) {}
211
212 field = (NormalCheck[])exactArray;
213 field = (NormalCheck[])normalArray;
214
215 // Object[] check.
216 try{
217 field = (Object[])regularObject;
218 throw new Error("Can't reach here");
219 } catch (ClassCastException ignore) {}
220
221 field = (Object[])objectArray;
222 try {
223 field = (Object[])doubleArray;
224 throw new Error("Can't reach here");
225 } catch (ClassCastException ignore) {}
226
227 field = (Object[])exactArray;
228 field = (Object[])normalArray;
229 }
230}
231
232class NormalCheck {
233}
234
235final class ExactCheck extends NormalCheck {
236}
237
238abstract class AbstractCheck {
239}
240
241class AbstractCheckImpl extends AbstractCheck {
242}
243
244interface InterfaceCheck {
245}
246
247class InterfaceCheckImpl implements InterfaceCheck {
248}