1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met:
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions of source code must retain the above copyright
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       notice, this list of conditions and the following disclaimer.
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions in binary form must reproduce the above
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       copyright notice, this list of conditions and the following
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       disclaimer in the documentation and/or other materials provided
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       with the distribution.
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Neither the name of Google Inc. nor the names of its
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       contributors may be used to endorse or promote products derived
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       from this software without specific prior written permission.
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --allow-natives-syntax --expose-gc
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --noalways-opt
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar elements_kind = {
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fast_smi_only            :  'fast smi only elements',
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fast                     :  'fast elements',
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fast_double              :  'fast double elements',
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  dictionary               :  'dictionary elements',
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_byte            :  'external byte elements',
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_unsigned_byte   :  'external unsigned byte elements',
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_short           :  'external short elements',
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_unsigned_short  :  'external unsigned short elements',
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_int             :  'external int elements',
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_unsigned_int    :  'external unsigned int elements',
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_float           :  'external float elements',
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_double          :  'external double elements',
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_pixel           :  'external pixel elements'
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction getKind(obj) {
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFastSmiElements(obj)) return elements_kind.fast_smi_only;
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFastObjectElements(obj)) return elements_kind.fast;
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFastDoubleElements(obj)) return elements_kind.fast_double;
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasDictionaryElements(obj)) return elements_kind.dictionary;
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction isHoley(obj) {
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFastHoleyElements(obj)) return true;
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return false;
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction assertKind(expected, obj, name_opt) {
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(expected, getKind(obj), name_opt);
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction assertHoley(obj, name_opt) {
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(true, isHoley(obj), name_opt);
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction assertNotHoley(obj, name_opt) {
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(false, isHoley(obj), name_opt);
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = [];
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertNotHoley(obj);
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = [1, 2, 3];
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertNotHoley(obj);
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = new Array();
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertNotHoley(obj);
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = new Array(0);
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertNotHoley(obj);
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = new Array(2);
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertHoley(obj);
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = new Array(1,2,3);
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertNotHoley(obj);
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = new Array(1, "hi", 2, undefined);
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertNotHoley(obj);
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction fastliteralcase(literal, value) {
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  literal[0] = value;
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return literal;
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction get_standard_literal() {
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var literal = [1, 2, 3];
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return literal;
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case: [1,2,3] as allocation site
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = fastliteralcase(get_standard_literal(), 1);
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = fastliteralcase(get_standard_literal(), 1.5);
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = fastliteralcase(get_standard_literal(), 2);
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The test below is in a loop because arrays that live
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// at global scope without the chance of being recreated
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// don't have allocation site information attached.
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (i = 0; i < 2; i++) {
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = fastliteralcase([5, 3, 2], 1.5);
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj);
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = fastliteralcase([3, 6, 2], 1.5);
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj);
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Note: thanks to pessimistic transition store stubs, we'll attempt
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // to transition to the most general elements kind seen at a particular
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // store site. So, the elements kind will be double.
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = fastliteralcase([2, 6, 3], 2);
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj);
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Verify that we will not pretransition the double->fast path.
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = fastliteralcase(get_standard_literal(), "elliot");
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = fastliteralcase(get_standard_literal(), 3);
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Make sure this works in crankshafted code too.
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %OptimizeFunctionOnNextCall(get_standard_literal);
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochget_standard_literal();
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = get_standard_literal();
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction fastliteralcase_smifast(value) {
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var literal = [1, 2, 3, 4];
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  literal[0] = value;
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return literal;
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = fastliteralcase_smifast(1);
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = fastliteralcase_smifast("carter");
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = fastliteralcase_smifast(2);
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case: make sure transitions from packed to holey are tracked
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction fastliteralcase_smiholey(index, value) {
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var literal = [1, 2, 3, 4];
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  literal[index] = value;
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return literal;
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = fastliteralcase_smiholey(5, 1);
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertHoley(obj);
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = fastliteralcase_smiholey(0, 1);
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertHoley(obj);
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction newarraycase_smidouble(value) {
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new Array();
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = value;
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return a;
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case: new Array() as allocation site, smi->double
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_smidouble(1);
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_smidouble(1.5);
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_smidouble(2);
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction newarraycase_smiobj(value) {
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new Array();
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = value;
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return a;
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case: new Array() as allocation site, smi->fast
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_smiobj(1);
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_smiobj("gloria");
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_smiobj(2);
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction newarraycase_length_smidouble(value) {
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new Array(3);
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = value;
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return a;
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case: new Array(length) as allocation site
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_length_smidouble(1);
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_length_smidouble(1.5);
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_length_smidouble(2);
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Try to continue the transition to fast object.
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(mvstanton): re-enable commented out code when
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// FLAG_pretenuring_call_new is turned on in the build.
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_length_smidouble("coates");
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_length_smidouble(2);
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// assertKind(elements_kind.fast, obj);
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction newarraycase_length_smiobj(value) {
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new Array(3);
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = value;
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return a;
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case: new Array(<length>) as allocation site, smi->fast
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_length_smiobj(1);
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_length_smiobj("gloria");
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_length_smiobj(2);
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction newarraycase_list_smidouble(value) {
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new Array(1, 2, 3);
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = value;
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return a;
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_list_smidouble(1);
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_list_smidouble(1.5);
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_list_smidouble(2);
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction newarraycase_list_smiobj(value) {
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new Array(4, 5, 6);
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = value;
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return a;
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_list_smiobj(1);
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, obj);
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_list_smiobj("coates");
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_list_smiobj(2);
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, obj);
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case: array constructor calls with out of date feedback.
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The boilerplate should incorporate all feedback, but the input array
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// should be minimally transitioned based on immediate need.
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function() {
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function foo(i) {
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // We have two cases, one for literals one for constructed arrays.
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var a = (i == 0)
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? [1, 2, 3]
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : new Array(1, 2, 3);
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return a;
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 0; i < 2; i++) {
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    a = foo(i);
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    b = foo(i);
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    b[5] = 1;  // boilerplate goes holey
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertHoley(foo(i));
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    a[0] = 3.5;  // boilerplate goes holey double
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertKind(elements_kind.fast_double, a);
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertNotHoley(a);
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    c = foo(i);
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertKind(elements_kind.fast_double, c);
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertHoley(c);
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction newarraycase_onearg(len, value) {
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new Array(len);
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = value;
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return a;
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_onearg(5, 3.5);
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_onearg(10, 5);
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochobj = newarraycase_onearg(0, 5);
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, obj);
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Verify that cross context calls work
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar realmA = Realm.current();
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar realmB = Realm.create();
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(0, realmA);
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(1, realmB);
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction instanceof_check(type) {
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(new type() instanceof type);
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(new type(5) instanceof type);
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(new type(1,2,3) instanceof type);
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction instanceof_check2(type) {
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(new type() instanceof type);
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(new type(5) instanceof type);
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(new type(1,2,3) instanceof type);
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar realmBArray = Realm.eval(realmB, "Array");
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinstanceof_check(Array);
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinstanceof_check(realmBArray);
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// instanceof_check2 is here because the call site goes through a state.
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Since instanceof_check(Array) was first called with the current context
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Array function, it went from (uninit->Array) then (Array->megamorphic).
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// We'll get a different state traversal if we start with realmBArray.
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// It'll go (uninit->realmBArray) then (realmBArray->megamorphic). Recognize
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// that state "Array" implies an AllocationSite is present, and code is
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// configured to use it.
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinstanceof_check2(realmBArray);
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinstanceof_check2(Array);
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %OptimizeFunctionOnNextCall(instanceof_check);
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// No de-opt will occur because HCallNewArray wasn't selected, on account of
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// the call site not being monomorphic to Array.
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinstanceof_check(Array);
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertOptimized(instanceof_check);
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinstanceof_check(realmBArray);
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertOptimized(instanceof_check);
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Try to optimize again, but first clear all type feedback, and allow it
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// to be monomorphic on first call. Only after crankshafting do we introduce
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// realmBArray. This should deopt the method.
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %DeoptimizeFunction(instanceof_check);
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %ClearFunctionTypeFeedback(instanceof_check);
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinstanceof_check(Array);
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinstanceof_check(Array);
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %OptimizeFunctionOnNextCall(instanceof_check);
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinstanceof_check(Array);
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertOptimized(instanceof_check);
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinstanceof_check(realmBArray);
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertUnoptimized(instanceof_check);
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case: make sure nested arrays benefit from allocation site feedback as
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// well.
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function() {
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure we handle nested arrays
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function get_nested_literal() {
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var literal = [[1,2,3,4], [2], [3]];
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return literal;
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_nested_literal();
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, obj);
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj[0][0] = 3.5;
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj[2][0] = "hello";
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_nested_literal();
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj[0]);
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_smi_only, obj[1]);
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, obj[2]);
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // A more complex nested literal case.
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function get_deep_nested_literal() {
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var literal = [[1], [[2], "hello"], 3, [4]];
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return literal;
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_deep_nested_literal();
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_smi_only, obj[1][0]);
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj[0][0] = 3.5;
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj[1][0][0] = "goodbye";
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj[0]);
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, obj[1][0]);
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_deep_nested_literal();
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj[0]);
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, obj[1][0]);
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Perform a gc because without it the test below can experience an
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// allocation failure at an inconvenient point. Allocation mementos get
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// cleared on gc, and they can't deliver elements kind feedback when that
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// happens.
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochgc();
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Make sure object literals with array fields benefit from the type feedback
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// that allocation mementos provide.
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function() {
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // A literal in an object
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function get_object_literal() {
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var literal = {
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      array: [1,2,3],
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      data: 3.5
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    };
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return literal;
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_object_literal();
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_smi_only, obj.array);
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj.array[1] = 3.5;
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj.array);
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_object_literal();
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj.array);
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function get_nested_object_literal() {
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var literal = {
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      array: [[1],[2],[3]],
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      data: 3.5
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    };
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return literal;
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_nested_object_literal();
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, obj.array);
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_smi_only, obj.array[1]);
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj.array[1][0] = 3.5;
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj.array[1]);
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_nested_object_literal();
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj.array[1]);
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %OptimizeFunctionOnNextCall(get_nested_object_literal);
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  get_nested_object_literal();
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_nested_object_literal();
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj.array[1]);
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure we handle nested arrays
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function get_nested_literal() {
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var literal = [[1,2,3,4], [2], [3]];
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return literal;
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_nested_literal();
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, obj);
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj[0][0] = 3.5;
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj[2][0] = "hello";
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_nested_literal();
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj[0]);
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_smi_only, obj[1]);
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, obj[2]);
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // A more complex nested literal case.
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function get_deep_nested_literal() {
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var literal = [[1], [[2], "hello"], 3, [4]];
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return literal;
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_deep_nested_literal();
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_smi_only, obj[1][0]);
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj[0][0] = 3.5;
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj[1][0][0] = "goodbye";
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj[0]);
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, obj[1][0]);
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  obj = get_deep_nested_literal();
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, obj[0]);
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, obj[1][0]);
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
470