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