12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2007 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.Type;
185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/**
205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Throw a few things at the verifier, all of which are expected to pass.
215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaopublic class Main {
235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    static public void main(String[] args) {
245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        tryBlah(1);
255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("Zorch.");
27ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers        System.out.println("10 == " + instanceOfTest(10));
285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /*
315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Make sure the verifier is handling type merge of arrays of
325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * references correctly.
335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    static Object[] arrayCheck1(int wanted) {
355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        String[] arrayOne;
365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Integer[] arrayTwo;
375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        arrayOne = new String[1];
395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        arrayTwo = new Integer[1];
405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        switch (wanted) {
425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 0:     return arrayOne;
435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 1:     return arrayTwo;
445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            default:    return null;
455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    static Object arrayCheck1b(int wanted) {
495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        String[] arrayOne;
505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Integer[] arrayTwo;
515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        int[] arrayThree;
525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        arrayOne = new String[1];
545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        arrayTwo = new Integer[1];
555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        arrayThree = new int[1];
565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        switch (wanted) {
585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 0:     return arrayOne;
595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 1:     return arrayTwo;
605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 2:     return arrayThree;
615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            default:    return null;
625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    static Object[] arrayCheck2(int wanted) {
665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        String[][] arrayOne;
675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        String[][] arrayTwo;
685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Integer[][] arrayThree;
695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        arrayOne = new String[1][];
715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        arrayTwo = new String[1][];
725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        arrayThree = new Integer[1][];
735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        switch (wanted) {
755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 0:     return arrayOne;
765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 1:     return arrayTwo;
775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 2:     return arrayThree;
785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            default:    return null;
795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    static Object[] arrayCheck3(int wanted) {
835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        String[][] arrayTwo;
845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        String[][][][] arrayFour;
855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        arrayTwo = new String[1][];
875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        arrayFour = new String[1][][][];
885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        switch (wanted) {
905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 0:     return arrayTwo;
915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 1:     return arrayFour;
925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            default:    return null;
935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /*
975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Check return type merge.
985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    private Type[] typeTest() {
1005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        if(this == null) {
1015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            return (Class<?>[])null;
1025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
1035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        return (Type[])null;
1045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
1055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /*
1085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Exercise the blahs.
1095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
1105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    static void tryBlah(int num) {
1115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        BlahFeature feature = null;     // interface ref
1125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        switch (num) {
1145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            case 1:
1155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                feature = new BlahOne();
1165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                break;
1175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            default:
1185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                feature = new BlahTwo();
1195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                break;
1205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
1215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        feature.doStuff();
1235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
124ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers
125ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers    static int instanceOfTest(Integer x) {
126ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers      Object y = x;
127ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers      if (y instanceof String) {
128ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers        // Bug: 15808277
129ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers        // Non-sensical instance-of to check merging after the branch doesn't result in a verifier
130ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers        // error.
131ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers        ((String)y).charAt(0);
132ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers      }
133ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers      return x.intValue();
134ebbdd87cbb57e45da341fbf7325406e982810c10Ian Rogers    }
1355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
136