xref: /aosp_15_r20/art/test/003-omnibus-opcodes/src/Classes.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2008 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 import java.io.Serializable;
18*795d594fSAndroid Build Coastguard Worker import java.util.Arrays;
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker /**
21*795d594fSAndroid Build Coastguard Worker  * Exercise some class-related instructions.
22*795d594fSAndroid Build Coastguard Worker  */
23*795d594fSAndroid Build Coastguard Worker public class Classes {
24*795d594fSAndroid Build Coastguard Worker     int mSome;
25*795d594fSAndroid Build Coastguard Worker 
subFunc(boolean wantSub)26*795d594fSAndroid Build Coastguard Worker     public void subFunc(boolean wantSub) {
27*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!wantSub);
28*795d594fSAndroid Build Coastguard Worker     }
29*795d594fSAndroid Build Coastguard Worker 
checkCast(Object thisRef, Object moreRef, Object nullRef)30*795d594fSAndroid Build Coastguard Worker     void checkCast(Object thisRef, Object moreRef, Object nullRef) {
31*795d594fSAndroid Build Coastguard Worker         System.out.println("Classes.checkCast");
32*795d594fSAndroid Build Coastguard Worker 
33*795d594fSAndroid Build Coastguard Worker         Classes classes;
34*795d594fSAndroid Build Coastguard Worker         MoreClasses more;
35*795d594fSAndroid Build Coastguard Worker 
36*795d594fSAndroid Build Coastguard Worker         classes = (Classes) thisRef;
37*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(thisRef instanceof Classes);
38*795d594fSAndroid Build Coastguard Worker         classes = (Classes) moreRef;
39*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(moreRef instanceof Classes);
40*795d594fSAndroid Build Coastguard Worker 
41*795d594fSAndroid Build Coastguard Worker         more = (MoreClasses) moreRef;
42*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(moreRef instanceof MoreClasses);
43*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(thisRef instanceof MoreClasses));
44*795d594fSAndroid Build Coastguard Worker 
45*795d594fSAndroid Build Coastguard Worker         try {
46*795d594fSAndroid Build Coastguard Worker             more = (MoreClasses) thisRef;
47*795d594fSAndroid Build Coastguard Worker             Main.assertTrue(false);
48*795d594fSAndroid Build Coastguard Worker         } catch (ClassCastException cce) {
49*795d594fSAndroid Build Coastguard Worker             //System.out.println("  class cast msg: " + cce.getMessage());
50*795d594fSAndroid Build Coastguard Worker             //Dalvik throws terser message than Hotspot VM
51*795d594fSAndroid Build Coastguard Worker             Main.assertTrue(cce.getMessage().regionMatches(false, 0, "Classes", 0, 7));
52*795d594fSAndroid Build Coastguard Worker         }
53*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(thisRef instanceof MoreClasses));
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker         /* hopefully these classes cause a resolve */
56*795d594fSAndroid Build Coastguard Worker         try {
57*795d594fSAndroid Build Coastguard Worker             java.math.RoundingMode mode = (java.math.RoundingMode) thisRef;
58*795d594fSAndroid Build Coastguard Worker             Main.assertTrue(false);
59*795d594fSAndroid Build Coastguard Worker         } catch (ClassCastException cce) {
60*795d594fSAndroid Build Coastguard Worker             //System.out.println("  class cast msg: " + cce.getMessage());
61*795d594fSAndroid Build Coastguard Worker             //Dalvik throws terser message than Hotspot VM
62*795d594fSAndroid Build Coastguard Worker             Main.assertTrue(cce.getMessage().regionMatches(false, 0, "Classes", 0, 7));
63*795d594fSAndroid Build Coastguard Worker         }
64*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(thisRef instanceof java.math.BigDecimal));
65*795d594fSAndroid Build Coastguard Worker 
66*795d594fSAndroid Build Coastguard Worker         /* try some stuff with a null reference */
67*795d594fSAndroid Build Coastguard Worker         classes = (Classes) nullRef;
68*795d594fSAndroid Build Coastguard Worker         classes = (MoreClasses) nullRef;
69*795d594fSAndroid Build Coastguard Worker         more = (MoreClasses) nullRef;
70*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(nullRef instanceof Classes));
71*795d594fSAndroid Build Coastguard Worker 
72*795d594fSAndroid Build Coastguard Worker     }
73*795d594fSAndroid Build Coastguard Worker 
74*795d594fSAndroid Build Coastguard Worker 
xTests(Object x)75*795d594fSAndroid Build Coastguard Worker     static void xTests(Object x) {
76*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  x instanceof Classes);
77*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(x instanceof MoreClasses));
78*795d594fSAndroid Build Coastguard Worker     }
yTests(Object y)79*795d594fSAndroid Build Coastguard Worker     static void yTests(Object y) {
80*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  y instanceof Classes);
81*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  y instanceof MoreClasses);
82*795d594fSAndroid Build Coastguard Worker     }
xarTests(Object xar)83*795d594fSAndroid Build Coastguard Worker     static void xarTests(Object xar) {
84*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  xar instanceof Object);
85*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(xar instanceof Classes));
86*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  xar instanceof Classes[]);
87*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(xar instanceof MoreClasses[]));
88*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  xar instanceof Object[]);
89*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(xar instanceof Object[][]));
90*795d594fSAndroid Build Coastguard Worker     }
yarTests(Object yar)91*795d594fSAndroid Build Coastguard Worker     static void yarTests(Object yar) {
92*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  yar instanceof Classes[]);
93*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  yar instanceof MoreClasses[]);
94*795d594fSAndroid Build Coastguard Worker     }
xarararTests(Object xararar)95*795d594fSAndroid Build Coastguard Worker     static void xarararTests(Object xararar) {
96*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  xararar instanceof Object);
97*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  xararar instanceof Object[]);
98*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(xararar instanceof Classes));
99*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(xararar instanceof Classes[]));
100*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(xararar instanceof Classes[][]));
101*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  xararar instanceof Classes[][][]);
102*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(xararar instanceof MoreClasses[][][]));
103*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  xararar instanceof Object[][][]);
104*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  xararar instanceof Serializable);
105*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  xararar instanceof Serializable[]);
106*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  xararar instanceof Serializable[][]);
107*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(xararar instanceof Serializable[][][]));
108*795d594fSAndroid Build Coastguard Worker     }
yarararTests(Object yararar)109*795d594fSAndroid Build Coastguard Worker     static void yarararTests(Object yararar) {
110*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  yararar instanceof Classes[][][]);
111*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  yararar instanceof MoreClasses[][][]);
112*795d594fSAndroid Build Coastguard Worker     }
iarTests(Object iar)113*795d594fSAndroid Build Coastguard Worker     static void iarTests(Object iar) {
114*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  iar instanceof Object);
115*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(iar instanceof Object[]));
116*795d594fSAndroid Build Coastguard Worker     }
iararTests(Object iarar)117*795d594fSAndroid Build Coastguard Worker     static void iararTests(Object iarar) {
118*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  iarar instanceof Object);
119*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(  iarar instanceof Object[]);
120*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(!(iarar instanceof Object[][]));
121*795d594fSAndroid Build Coastguard Worker     }
122*795d594fSAndroid Build Coastguard Worker 
123*795d594fSAndroid Build Coastguard Worker     /*
124*795d594fSAndroid Build Coastguard Worker      * Exercise filled-new-array and test instanceof on arrays.
125*795d594fSAndroid Build Coastguard Worker      *
126*795d594fSAndroid Build Coastguard Worker      * We call out instead of using "instanceof" directly to avoid
127*795d594fSAndroid Build Coastguard Worker      * compiler optimizations.
128*795d594fSAndroid Build Coastguard Worker      */
arrayInstance()129*795d594fSAndroid Build Coastguard Worker     static void arrayInstance() {
130*795d594fSAndroid Build Coastguard Worker         System.out.println("Classes.arrayInstance");
131*795d594fSAndroid Build Coastguard Worker 
132*795d594fSAndroid Build Coastguard Worker         Classes x = new Classes();
133*795d594fSAndroid Build Coastguard Worker         Classes[] xar = new Classes[1];
134*795d594fSAndroid Build Coastguard Worker         Classes[][] xarar = new Classes[1][1];
135*795d594fSAndroid Build Coastguard Worker         Classes[][][] xararar = new Classes[1][2][3];
136*795d594fSAndroid Build Coastguard Worker         MoreClasses y = new MoreClasses();
137*795d594fSAndroid Build Coastguard Worker         MoreClasses[] yar = new MoreClasses[3];
138*795d594fSAndroid Build Coastguard Worker         MoreClasses[][] yarar = new MoreClasses[2][3];
139*795d594fSAndroid Build Coastguard Worker         MoreClasses[][][] yararar = new MoreClasses[1][2][3];
140*795d594fSAndroid Build Coastguard Worker         int[] iar = new int[1];
141*795d594fSAndroid Build Coastguard Worker         int[][] iarar = new int[1][1];
142*795d594fSAndroid Build Coastguard Worker         Object test;
143*795d594fSAndroid Build Coastguard Worker 
144*795d594fSAndroid Build Coastguard Worker         xTests(x);
145*795d594fSAndroid Build Coastguard Worker         yTests(y);
146*795d594fSAndroid Build Coastguard Worker         xarTests(xar);
147*795d594fSAndroid Build Coastguard Worker         yarTests(yar);
148*795d594fSAndroid Build Coastguard Worker         xarararTests(xararar);
149*795d594fSAndroid Build Coastguard Worker         yarararTests(yararar);
150*795d594fSAndroid Build Coastguard Worker         iarTests(iar);
151*795d594fSAndroid Build Coastguard Worker         iararTests(iarar);
152*795d594fSAndroid Build Coastguard Worker 
153*795d594fSAndroid Build Coastguard Worker         yararar[0] = yarar;
154*795d594fSAndroid Build Coastguard Worker         yararar[0][0] = yar;
155*795d594fSAndroid Build Coastguard Worker         yararar[0][1] = yar;
156*795d594fSAndroid Build Coastguard Worker         yararar[0][0][0] = y;
157*795d594fSAndroid Build Coastguard Worker         yararar[0][0][1] = y;
158*795d594fSAndroid Build Coastguard Worker         yararar[0][0][2] = y;
159*795d594fSAndroid Build Coastguard Worker         yararar[0][1][0] = y;
160*795d594fSAndroid Build Coastguard Worker         yararar[0][1][1] = y;
161*795d594fSAndroid Build Coastguard Worker         yararar[0][1][2] = y;
162*795d594fSAndroid Build Coastguard Worker 
163*795d594fSAndroid Build Coastguard Worker         String strForm;
164*795d594fSAndroid Build Coastguard Worker 
165*795d594fSAndroid Build Coastguard Worker         String[][][][] multi1 = new String[2][3][2][1];
166*795d594fSAndroid Build Coastguard Worker         multi1[0] = new String[2][3][2];
167*795d594fSAndroid Build Coastguard Worker         multi1[0][1] = new String[3][2];
168*795d594fSAndroid Build Coastguard Worker         multi1[0][1][2] = new String[2];
169*795d594fSAndroid Build Coastguard Worker         multi1[0][1][2][1] = "HELLO-1";
170*795d594fSAndroid Build Coastguard Worker         strForm = Arrays.deepToString(multi1);
171*795d594fSAndroid Build Coastguard Worker 
172*795d594fSAndroid Build Coastguard Worker         String[][][][][] multi2 = new String[5][2][3][2][1];
173*795d594fSAndroid Build Coastguard Worker         multi2[0] = new String[5][2][3][2];
174*795d594fSAndroid Build Coastguard Worker         multi2[0][1] = new String[5][2][3];
175*795d594fSAndroid Build Coastguard Worker         multi2[0][1][2] = new String[5][2];
176*795d594fSAndroid Build Coastguard Worker         multi2[0][1][2][1] = new String[5];
177*795d594fSAndroid Build Coastguard Worker         multi2[0][1][2][1][4] = "HELLO-2";
178*795d594fSAndroid Build Coastguard Worker         strForm = Arrays.deepToString(multi2);
179*795d594fSAndroid Build Coastguard Worker 
180*795d594fSAndroid Build Coastguard Worker 
181*795d594fSAndroid Build Coastguard Worker         String[][][][][][] multi3 = new String[2][5][2][3][2][1];
182*795d594fSAndroid Build Coastguard Worker         multi3[0] = new String[2][][][][];
183*795d594fSAndroid Build Coastguard Worker         multi3[0][1] = new String[3][][][];
184*795d594fSAndroid Build Coastguard Worker         multi3[0][1][2] = new String[2][][];
185*795d594fSAndroid Build Coastguard Worker         multi3[0][1][2][1] = new String[5][];
186*795d594fSAndroid Build Coastguard Worker         multi3[0][1][2][1][4] = new String[2];
187*795d594fSAndroid Build Coastguard Worker         multi3[0][1][2][1][4][1] = "HELLO-3";
188*795d594fSAndroid Build Coastguard Worker         strForm = Arrays.deepToString(multi3);
189*795d594fSAndroid Build Coastguard Worker 
190*795d594fSAndroid Build Coastguard Worker         // build up pieces
191*795d594fSAndroid Build Coastguard Worker         String[][][][][][] multi4 = new String[1][][][][][];
192*795d594fSAndroid Build Coastguard Worker         multi4[0] = new String[2][][][][];
193*795d594fSAndroid Build Coastguard Worker         multi4[0][1] = new String[3][][][];
194*795d594fSAndroid Build Coastguard Worker         multi4[0][1][2] = new String[2][][];
195*795d594fSAndroid Build Coastguard Worker         multi4[0][1][2][1] = new String[5][];
196*795d594fSAndroid Build Coastguard Worker         multi4[0][1][2][1][4] = new String[2];
197*795d594fSAndroid Build Coastguard Worker         multi4[0][1][2][1][4][1] = "HELLO-4";
198*795d594fSAndroid Build Coastguard Worker         strForm = Arrays.deepToString(multi4);
199*795d594fSAndroid Build Coastguard Worker 
200*795d594fSAndroid Build Coastguard Worker         /* this is expected to fail; 1073921584 * 4 overflows 32 bits */
201*795d594fSAndroid Build Coastguard Worker         try {
202*795d594fSAndroid Build Coastguard Worker             String[][][][][] multiX = new String[5][2][3][2][1073921584];
203*795d594fSAndroid Build Coastguard Worker             Main.assertTrue(false);
204*795d594fSAndroid Build Coastguard Worker         } catch (Error e) {
205*795d594fSAndroid Build Coastguard Worker             //System.out.println("  Got expected failure: " + e);
206*795d594fSAndroid Build Coastguard Worker         }
207*795d594fSAndroid Build Coastguard Worker 
208*795d594fSAndroid Build Coastguard Worker     }
209*795d594fSAndroid Build Coastguard Worker 
run()210*795d594fSAndroid Build Coastguard Worker     public static void run() {
211*795d594fSAndroid Build Coastguard Worker         Classes classes = new Classes();
212*795d594fSAndroid Build Coastguard Worker         MoreClasses more = new MoreClasses();
213*795d594fSAndroid Build Coastguard Worker         classes.checkCast(classes, more, null);
214*795d594fSAndroid Build Coastguard Worker 
215*795d594fSAndroid Build Coastguard Worker         more.subFunc(true);
216*795d594fSAndroid Build Coastguard Worker         more.superFunc(false);
217*795d594fSAndroid Build Coastguard Worker         arrayInstance();
218*795d594fSAndroid Build Coastguard Worker     }
219*795d594fSAndroid Build Coastguard Worker }
220*795d594fSAndroid Build Coastguard Worker 
221*795d594fSAndroid Build Coastguard Worker class MoreClasses extends Classes {
222*795d594fSAndroid Build Coastguard Worker     int mMore;
223*795d594fSAndroid Build Coastguard Worker 
MoreClasses()224*795d594fSAndroid Build Coastguard Worker     public MoreClasses() {}
225*795d594fSAndroid Build Coastguard Worker 
subFunc(boolean wantSub)226*795d594fSAndroid Build Coastguard Worker     public void subFunc(boolean wantSub) {
227*795d594fSAndroid Build Coastguard Worker         Main.assertTrue(wantSub);
228*795d594fSAndroid Build Coastguard Worker     }
229*795d594fSAndroid Build Coastguard Worker 
superFunc(boolean wantSub)230*795d594fSAndroid Build Coastguard Worker     public void superFunc(boolean wantSub) {
231*795d594fSAndroid Build Coastguard Worker         super.subFunc(wantSub);
232*795d594fSAndroid Build Coastguard Worker     }
233*795d594fSAndroid Build Coastguard Worker }
234