Home | History | Annotate | Download | only in 670-bitstring-type-check
      1 #!/bin/bash
      2 #
      3 # Copyright (C) 2018 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #     http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 
     17 # Stop if something fails.
     18 set -e
     19 
     20 # Write out the source file.
     21 
     22 mkdir src
     23 cat >src/Main.java <<EOF
     24 /*
     25  * Copyright (C) 2018 The Android Open Source Project
     26  *
     27  * Licensed under the Apache License, Version 2.0 (the "License");
     28  * you may not use this file except in compliance with the License.
     29  * You may obtain a copy of the License at
     30  *
     31  *      http://www.apache.org/licenses/LICENSE-2.0
     32  *
     33  * Unless required by applicable law or agreed to in writing, software
     34  * distributed under the License is distributed on an "AS IS" BASIS,
     35  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     36  * See the License for the specific language governing permissions and
     37  * limitations under the License.
     38  */
     39 
     40 EOF
     41 
     42 for i in {0..8192}; do echo "class Level1Class$i { }" >>src/Main.java; done
     43 for i in {0..1024}; do echo "class Level2Class$i extends Level1Class0 { }" >>src/Main.java; done
     44 
     45 cat >>src/Main.java <<EOF
     46 class Level3Class0 extends Level2Class0 { }
     47 class Level4Class0 extends Level3Class0 { }
     48 class Level5Class0 extends Level4Class0 { }
     49 class Level6Class0 extends Level5Class0 { }
     50 class Level7Class0 extends Level6Class0 { }
     51 class Level8Class0 extends Level7Class0 { }
     52 class Level9Class0 extends Level8Class0 { }
     53 
     54 public class Main {
     55   public static void main(String[] args) throws Exception {
     56     // 8193 classes at level 1 make sure we shall have an overflow if there are 13 or
     57     // less bits for the level 1 character. 1025 classes at level 2 similarly guarantees
     58     // an overflow if the number of bits for level 2 character is 10 or less. To test
     59     // type checks also for the depth overflow, we provide a hierarchy 9 levels deep.
     60 
     61     // Make sure the bitstrings are initialized.
     62     for (int i = 0; i <= 8192; ++i) {
     63       Class.forName("Level1Class" + i).newInstance();
     64     }
     65     for (int i = 0; i <= 1024; ++i) {
     66       Class.forName("Level2Class" + i).newInstance();
     67     }
     68 
     69     // Note: Using a different class for tests so that verification of Main.main() does
     70     // not try to resolve classes used by the tests. This guarantees uninitialized type
     71     // check bitstrings when we enter Main.main() and start initializing them above.
     72     Helper.testInstanceOf();
     73     Helper.testCheckCast();
     74   }
     75 }
     76 
     77 class Helper {
     78   public static void testInstanceOf() throws Exception {
     79     for (int i = 1; i <= 9; ++i) {
     80       Object o = createInstance("Level" + i + "Class0");
     81       assertTrue(o instanceof Level1Class0);
     82       if (o instanceof Level2Class0) {
     83         assertFalse(i < 2);
     84       } else {
     85         assertTrue(i < 2);
     86       }
     87       if (o instanceof Level3Class0) {
     88         assertFalse(i < 3);
     89       } else {
     90         assertTrue(i < 3);
     91       }
     92       if (o instanceof Level4Class0) {
     93         assertFalse(i < 4);
     94       } else {
     95         assertTrue(i < 4);
     96       }
     97       if (o instanceof Level5Class0) {
     98         assertFalse(i < 5);
     99       } else {
    100         assertTrue(i < 5);
    101       }
    102       if (o instanceof Level6Class0) {
    103         assertFalse(i < 6);
    104       } else {
    105         assertTrue(i < 6);
    106       }
    107       if (o instanceof Level7Class0) {
    108         assertFalse(i < 7);
    109       } else {
    110         assertTrue(i < 7);
    111       }
    112       if (o instanceof Level8Class0) {
    113         assertFalse(i < 8);
    114       } else {
    115         assertTrue(i < 8);
    116       }
    117       if (o instanceof Level9Class0) {
    118         assertFalse(i < 9);
    119       } else {
    120         assertTrue(i < 9);
    121       }
    122     }
    123 
    124     assertTrue(createInstance("Level1Class8192") instanceof Level1Class8192);
    125     assertFalse(createInstance("Level1Class8192") instanceof Level1Class0);
    126     assertTrue(createInstance("Level2Class1024") instanceof Level2Class1024);
    127     assertTrue(createInstance("Level2Class1024") instanceof Level1Class0);
    128     assertFalse(createInstance("Level2Class1024") instanceof Level2Class0);
    129   }
    130 
    131   public static void testCheckCast() throws Exception {
    132     for (int i = 1; i <= 9; ++i) {
    133       Object o = createInstance("Level" + i + "Class0");
    134       Level1Class0 l1c0 = (Level1Class0) o;
    135       try {
    136         Level2Class0 l2c0 = (Level2Class0) o;
    137         assertFalse(i < 2);
    138       } catch (ClassCastException cce) {
    139         assertTrue(i < 2);
    140       }
    141       try {
    142         Level3Class0 l3c0 = (Level3Class0) o;
    143         assertFalse(i < 3);
    144       } catch (ClassCastException cce) {
    145         assertTrue(i < 3);
    146       }
    147       try {
    148         Level4Class0 l4c0 = (Level4Class0) o;
    149         assertFalse(i < 4);
    150       } catch (ClassCastException cce) {
    151         assertTrue(i < 4);
    152       }
    153       try {
    154         Level5Class0 l5c0 = (Level5Class0) o;
    155         assertFalse(i < 5);
    156       } catch (ClassCastException cce) {
    157         assertTrue(i < 5);
    158       }
    159       try {
    160         Level6Class0 l6c0 = (Level6Class0) o;
    161         assertFalse(i < 6);
    162       } catch (ClassCastException cce) {
    163         assertTrue(i < 6);
    164       }
    165       try {
    166         Level7Class0 l7c0 = (Level7Class0) o;
    167         assertFalse(i < 7);
    168       } catch (ClassCastException cce) {
    169         assertTrue(i < 7);
    170       }
    171       try {
    172         Level8Class0 l8c0 = (Level8Class0) o;
    173         assertFalse(i < 8);
    174       } catch (ClassCastException cce) {
    175         assertTrue(i < 8);
    176       }
    177       try {
    178         Level9Class0 l9c0 = (Level9Class0) o;
    179         assertFalse(i < 9);
    180       } catch (ClassCastException cce) {
    181         assertTrue(i < 9);
    182       }
    183     }
    184 
    185     Level1Class8192 l1c8192 = (Level1Class8192) createInstance("Level1Class8192");
    186     try {
    187       Level1Class0 l1c0 = (Level1Class0) createInstance("Level1Class8192");
    188       throw new AssertionError("Unexpected");
    189     } catch (ClassCastException expected) {}
    190     Level2Class1024 l2c1024 = (Level2Class1024) createInstance("Level2Class1024");
    191     Level1Class0 l1c0 = (Level1Class0) createInstance("Level2Class1024");
    192     try {
    193       Level2Class0 l2c0 = (Level2Class0) createInstance("Level2Class1024");
    194       throw new AssertionError("Unexpected");
    195     } catch (ClassCastException expected) {}
    196   }
    197 
    198   public static Object createInstance(String className) throws Exception {
    199     return Class.forName(className).newInstance();
    200   }
    201 
    202   public static void assertTrue(boolean value) throws Exception {
    203     if (!value) {
    204       throw new AssertionError();
    205     }
    206   }
    207 
    208   public static void assertFalse(boolean value) throws Exception {
    209     if (value) {
    210       throw new AssertionError();
    211     }
    212   }
    213 }
    214 EOF
    215 
    216 ./default-build "$@"
    217