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