lagergren@1071: /* lagergren@1071: * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. lagergren@1071: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. lagergren@1071: * lagergren@1071: * This code is free software; you can redistribute it and/or modify it lagergren@1071: * under the terms of the GNU General Public License version 2 only, as lagergren@1071: * published by the Free Software Foundation. lagergren@1071: * lagergren@1071: * This code is distributed in the hope that it will be useful, but WITHOUT lagergren@1071: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or lagergren@1071: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License lagergren@1071: * version 2 for more details (a copy is included in the LICENSE file that lagergren@1071: * accompanied this code). lagergren@1071: * lagergren@1071: * You should have received a copy of the GNU General Public License version lagergren@1071: * 2 along with this work; if not, write to the Free Software Foundation, lagergren@1071: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. lagergren@1071: * lagergren@1071: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA lagergren@1071: * or visit www.oracle.com if you need additional information or have any lagergren@1071: * questions. lagergren@1071: */ lagergren@1071: lagergren@1071: /** lagergren@1071: * JDK-8061391 - Checks that the optimistic builtin for concat is semantically lagergren@1071: * correct. lagergren@1071: * lagergren@1071: * @test lagergren@1071: * @run lagergren@1071: */ lagergren@1071: lagergren@1071: var maxJavaInt = 0x7fffffff; lagergren@1071: lagergren@1071: var ia = [1, 2, 3, 4]; lagergren@1071: var la = [maxJavaInt + 1000, maxJavaInt + 2000, maxJavaInt + 3000, maxJavaInt + 4000]; lagergren@1071: var da = [1.1, 2.2, 3.3, 4.4]; lagergren@1071: var oa = ["one", "two", "three", "four"]; lagergren@1071: lagergren@1071: var aa = [ia, la, da, oa]; lagergren@1071: lagergren@1071: function concats() { lagergren@1071: print("shared callsite"); lagergren@1071: lagergren@1071: print(ia); lagergren@1071: print(la); lagergren@1071: print(da); lagergren@1071: print(oa); lagergren@1071: print(aa); lagergren@1071: lagergren@1071: for (var i = 0; i < aa.length; i++) { lagergren@1071: print(aa[i].concat(aa[i][0])); lagergren@1071: for (var j = 0; j < aa.length ; j++) { lagergren@1071: print(aa[i].concat(aa[j])); lagergren@1071: } lagergren@1071: } lagergren@1071: } lagergren@1071: lagergren@1071: function concats_inline() { lagergren@1071: print("separate callsites"); lagergren@1071: lagergren@1071: print(ia); lagergren@1071: print(la); lagergren@1071: print(da); lagergren@1071: print(oa); lagergren@1071: print(aa); lagergren@1071: lagergren@1071: print(aa[0].concat(aa[0])); lagergren@1071: print(aa[0].concat(aa[1])); lagergren@1071: print(aa[0].concat(aa[2])); lagergren@1071: print(aa[0].concat(aa[3])); lagergren@1071: print(aa[0].concat(aa[0][0])); lagergren@1071: lagergren@1071: print(aa[1].concat(aa[0])); lagergren@1071: print(aa[1].concat(aa[1])); lagergren@1071: print(aa[1].concat(aa[2])); lagergren@1071: print(aa[1].concat(aa[3])); lagergren@1071: print(aa[1].concat(aa[1][0])); lagergren@1071: lagergren@1071: print(aa[2].concat(aa[0])); lagergren@1071: print(aa[2].concat(aa[1])); lagergren@1071: print(aa[2].concat(aa[2])); lagergren@1071: print(aa[2].concat(aa[3])); lagergren@1071: print(aa[2].concat(aa[2][0])); lagergren@1071: lagergren@1071: print(aa[3].concat(aa[0])); lagergren@1071: print(aa[3].concat(aa[1])); lagergren@1071: print(aa[3].concat(aa[2])); lagergren@1071: print(aa[3].concat(aa[3])); lagergren@1071: print(aa[3].concat(aa[3][0])); lagergren@1071: } lagergren@1071: lagergren@1071: concats(); lagergren@1071: concats_inline(); lagergren@1071: lagergren@1071: print(); lagergren@1071: var oldia = ia.slice(0); //clone ia lagergren@1071: print("oldia = " + oldia); lagergren@1071: ia[10] = "sparse"; lagergren@1071: print("oldia = " + oldia); lagergren@1071: lagergren@1071: print(); lagergren@1071: print("Redoing with sparse arrays"); lagergren@1071: lagergren@1071: concats(); lagergren@1071: concats_inline(); lagergren@1071: lagergren@1071: ia = oldia; lagergren@1071: print("Restored ia = " + ia); lagergren@1071: lagergren@1071: function concat_expand() { lagergren@1071: print("concat type expansion"); lagergren@1071: print(ia.concat(la)); lagergren@1071: print(ia.concat(da)); lagergren@1071: print(ia.concat(oa)); lagergren@1071: print(la.concat(ia)); lagergren@1071: print(la.concat(da)); lagergren@1071: print(la.concat(oa)); lagergren@1071: print(da.concat(ia)); lagergren@1071: print(da.concat(la)); lagergren@1071: print(da.concat(oa)); lagergren@1071: } lagergren@1071: lagergren@1071: print(); lagergren@1071: concat_expand(); lagergren@1071: lagergren@1071: print(); lagergren@1071: lagergren@1071: function concat_varargs() { lagergren@1071: print("concat varargs"); lagergren@1071: print(ia.concat(la)); //fast lagergren@1071: print(ia.concat(la, da, oa)); //slow lagergren@1071: var slow = ia.concat(1, maxJavaInt * 2, 4711.17, function() { print("hello, world") }); //slow lagergren@1071: print(slow); lagergren@1071: return slow; lagergren@1071: } lagergren@1071: lagergren@1071: var slow = concat_varargs(); lagergren@1071: lagergren@1071: print(); lagergren@1071: print("sanity checks"); lagergren@1071: slow.map( lagergren@1071: function(elem) { lagergren@1071: if (elem instanceof Function) { lagergren@1071: elem(); lagergren@1071: } else { lagergren@1071: print((typeof elem) + " = " + elem); lagergren@1071: } lagergren@1071: }); lagergren@1071: lagergren@1071: print(ia.concat({key: "value"})); lagergren@1071: print(ia.concat({key: "value"}, {key2: "value2"}));