1/* 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/** 25 * JDK-8061391 - Checks that the optimistic builtin for concat is semantically 26 * correct. 27 * 28 * @test 29 * @run 30 */ 31 32var maxJavaInt = 0x7fffffff; 33 34var ia = [1, 2, 3, 4]; 35var la = [maxJavaInt + 1000, maxJavaInt + 2000, maxJavaInt + 3000, maxJavaInt + 4000]; 36var da = [1.1, 2.2, 3.3, 4.4]; 37var oa = ["one", "two", "three", "four"]; 38 39var aa = [ia, la, da, oa]; 40 41function concats() { 42 print("shared callsite"); 43 44 print(ia); 45 print(la); 46 print(da); 47 print(oa); 48 print(aa); 49 50 for (var i = 0; i < aa.length; i++) { 51 print(aa[i].concat(aa[i][0])); 52 for (var j = 0; j < aa.length ; j++) { 53 print(aa[i].concat(aa[j])); 54 } 55 } 56} 57 58function concats_inline() { 59 print("separate callsites"); 60 61 print(ia); 62 print(la); 63 print(da); 64 print(oa); 65 print(aa); 66 67 print(aa[0].concat(aa[0])); 68 print(aa[0].concat(aa[1])); 69 print(aa[0].concat(aa[2])); 70 print(aa[0].concat(aa[3])); 71 print(aa[0].concat(aa[0][0])); 72 73 print(aa[1].concat(aa[0])); 74 print(aa[1].concat(aa[1])); 75 print(aa[1].concat(aa[2])); 76 print(aa[1].concat(aa[3])); 77 print(aa[1].concat(aa[1][0])); 78 79 print(aa[2].concat(aa[0])); 80 print(aa[2].concat(aa[1])); 81 print(aa[2].concat(aa[2])); 82 print(aa[2].concat(aa[3])); 83 print(aa[2].concat(aa[2][0])); 84 85 print(aa[3].concat(aa[0])); 86 print(aa[3].concat(aa[1])); 87 print(aa[3].concat(aa[2])); 88 print(aa[3].concat(aa[3])); 89 print(aa[3].concat(aa[3][0])); 90} 91 92concats(); 93concats_inline(); 94 95print(); 96var oldia = ia.slice(0); //clone ia 97print("oldia = " + oldia); 98ia[10] = "sparse"; 99print("oldia = " + oldia); 100 101print(); 102print("Redoing with sparse arrays"); 103 104concats(); 105concats_inline(); 106 107ia = oldia; 108print("Restored ia = " + ia); 109 110function concat_expand() { 111 print("concat type expansion"); 112 print(ia.concat(la)); 113 print(ia.concat(da)); 114 print(ia.concat(oa)); 115 print(la.concat(ia)); 116 print(la.concat(da)); 117 print(la.concat(oa)); 118 print(da.concat(ia)); 119 print(da.concat(la)); 120 print(da.concat(oa)); 121} 122 123print(); 124concat_expand(); 125 126print(); 127 128function concat_varargs() { 129 print("concat varargs"); 130 print(ia.concat(la)); //fast 131 print(ia.concat(la, da, oa)); //slow 132 var slow = ia.concat(1, maxJavaInt * 2, 4711.17, function() { print("hello, world") }); //slow 133 print(slow); 134 return slow; 135} 136 137var slow = concat_varargs(); 138 139print(); 140print("sanity checks"); 141slow.map( 142 function(elem) { 143 if (elem instanceof Function) { 144 elem(); 145 } else { 146 print((typeof elem) + " = " + elem); 147 } 148 }); 149 150print(ia.concat({key: "value"})); 151print(ia.concat({key: "value"}, {key2: "value2"})); 152