JDK-8061391.js revision 1073:06c06c8443fd
1251839Sbapt/*
2255852Sdteske * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
3251839Sbapt * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4251839Sbapt *
5251839Sbapt * This code is free software; you can redistribute it and/or modify it
6251839Sbapt * under the terms of the GNU General Public License version 2 only, as
7251839Sbapt * published by the Free Software Foundation.
8251839Sbapt *
9251839Sbapt * This code is distributed in the hope that it will be useful, but WITHOUT
10251839Sbapt * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11251839Sbapt * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12251839Sbapt * version 2 for more details (a copy is included in the LICENSE file that
13251839Sbapt * accompanied this code).
14251839Sbapt *
15251839Sbapt * You should have received a copy of the GNU General Public License version
16251839Sbapt * 2 along with this work; if not, write to the Free Software Foundation,
17251839Sbapt * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18251839Sbapt *
19251839Sbapt * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20251839Sbapt * or visit www.oracle.com if you need additional information or have any
21251839Sbapt * questions.
22251839Sbapt */
23251839Sbapt
24251839Sbapt/**
25251839Sbapt * JDK-8061391 - Checks that the optimistic builtin for concat is semantically
26251839Sbapt * correct.
27251839Sbapt *
28251839Sbapt * @test
29251839Sbapt * @run
30251839Sbapt */
31251839Sbapt
32251839Sbaptvar maxJavaInt = 0x7fffffff;
33251839Sbapt
34251839Sbaptvar ia = [1, 2, 3, 4];
35251839Sbaptvar la = [maxJavaInt + 1000, maxJavaInt + 2000, maxJavaInt + 3000, maxJavaInt + 4000];
36251839Sbaptvar da = [1.1, 2.2, 3.3, 4.4];
37251839Sbaptvar oa = ["one", "two", "three", "four"];
38251839Sbapt
39251839Sbaptvar aa = [ia, la, da, oa];
40251839Sbapt
41251839Sbaptfunction concats() {
42251839Sbapt    print("shared callsite");
43251839Sbapt
44251839Sbapt    print(ia);
45251839Sbapt    print(la);
46251839Sbapt    print(da);
47251839Sbapt    print(oa);
48251839Sbapt    print(aa);
49251839Sbapt
50251839Sbapt    for (var i = 0; i < aa.length; i++) {
51251839Sbapt	print(aa[i].concat(aa[i][0]));
52251839Sbapt	for (var j = 0; j < aa.length ; j++) {
53251839Sbapt	    print(aa[i].concat(aa[j]));
54251839Sbapt	}
55251839Sbapt    }
56251839Sbapt}
57251839Sbapt
58251839Sbaptfunction concats_inline() {
59251839Sbapt    print("separate callsites");
60251839Sbapt
61251839Sbapt    print(ia);
62251839Sbapt    print(la);
63251839Sbapt    print(da);
64251839Sbapt    print(oa);
65251839Sbapt    print(aa);
66251839Sbapt
67251839Sbapt    print(aa[0].concat(aa[0]));
68251839Sbapt    print(aa[0].concat(aa[1]));
69251839Sbapt    print(aa[0].concat(aa[2]));
70251839Sbapt    print(aa[0].concat(aa[3]));
71251839Sbapt    print(aa[0].concat(aa[0][0]));
72251839Sbapt
73251839Sbapt    print(aa[1].concat(aa[0]));
74251839Sbapt    print(aa[1].concat(aa[1]));
75251839Sbapt    print(aa[1].concat(aa[2]));
76251839Sbapt    print(aa[1].concat(aa[3]));
77251839Sbapt    print(aa[1].concat(aa[1][0]));
78251839Sbapt
79251839Sbapt    print(aa[2].concat(aa[0]));
80251839Sbapt    print(aa[2].concat(aa[1]));
81251839Sbapt    print(aa[2].concat(aa[2]));
82251839Sbapt    print(aa[2].concat(aa[3]));
83251839Sbapt    print(aa[2].concat(aa[2][0]));
84251839Sbapt
85251839Sbapt    print(aa[3].concat(aa[0]));
86251839Sbapt    print(aa[3].concat(aa[1]));
87251839Sbapt    print(aa[3].concat(aa[2]));
88251839Sbapt    print(aa[3].concat(aa[3]));
89251839Sbapt    print(aa[3].concat(aa[3][0]));
90251839Sbapt}
91251839Sbapt
92251839Sbaptconcats();
93251839Sbaptconcats_inline();
94251839Sbapt
95251839Sbaptprint();
96251839Sbaptvar oldia = ia.slice(0); //clone ia
97251839Sbaptprint("oldia = " + oldia);
98251839Sbaptia[10] = "sparse";
99251839Sbaptprint("oldia = " + oldia);
100251839Sbapt
101251839Sbaptprint();
102251839Sbaptprint("Redoing with sparse arrays");
103251839Sbapt
104251839Sbaptconcats();
105251839Sbaptconcats_inline();
106251839Sbapt
107251839Sbaptia = oldia;
108251839Sbaptprint("Restored ia = " + ia);
109251839Sbapt
110251839Sbaptfunction concat_expand() {
111251839Sbapt    print("concat type expansion");
112251839Sbapt    print(ia.concat(la));
113251839Sbapt    print(ia.concat(da));
114251839Sbapt    print(ia.concat(oa));
115251839Sbapt    print(la.concat(ia));
116251839Sbapt    print(la.concat(da));
117251839Sbapt    print(la.concat(oa));
118251839Sbapt    print(da.concat(ia));
119251839Sbapt    print(da.concat(la));
120251839Sbapt    print(da.concat(oa));
121251839Sbapt}
122251839Sbapt
123251839Sbaptprint();
124251839Sbaptconcat_expand();
125251839Sbapt
126251839Sbaptprint();
127251839Sbapt
128251839Sbaptfunction concat_varargs() {
129251839Sbapt    print("concat varargs");
130251839Sbapt    print(ia.concat(la)); //fast
131251839Sbapt    print(ia.concat(la, da, oa)); //slow
132251839Sbapt    var slow = ia.concat(1, maxJavaInt * 2, 4711.17, function() { print("hello, world") }); //slow
133251839Sbapt    print(slow);
134251839Sbapt    return slow;
135251839Sbapt}
136251839Sbapt
137251839Sbaptvar slow = concat_varargs();
138251839Sbapt
139251839Sbaptprint();
140251839Sbaptprint("sanity checks");
141251839Sbaptslow.map(
142251839Sbapt	 function(elem) {
143251839Sbapt	     if (elem instanceof Function) {
144251839Sbapt		 elem();
145251839Sbapt	     } else {
146251839Sbapt		 print((typeof elem) + " = " + elem);
147251839Sbapt	     }
148251839Sbapt	 });
149251839Sbapt
150251839Sbaptprint(ia.concat({key: "value"}));
151251839Sbaptprint(ia.concat({key: "value"}, {key2: "value2"}));
152251839Sbapt