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