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