13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without
33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are
43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met:
53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions of source code must retain the above copyright
73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       notice, this list of conditions and the following disclaimer.
83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions in binary form must reproduce the above
93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       copyright notice, this list of conditions and the following
103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       disclaimer in the documentation and/or other materials provided
113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       with the distribution.
123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Neither the name of Google Inc. nor the names of its
133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       contributors may be used to endorse or promote products derived
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       from this software without specific prior written permission.
153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --allow-natives-syntax --expose-gc --nostress-opt --typed-array-max_size_in-heap=2048
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar elements_kind = {
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fast_smi_only             :  'fast smi only elements',
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fast                      :  'fast elements',
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fast_double               :  'fast double elements',
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  dictionary                :  'dictionary elements',
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_int32            :  'external int8 elements',
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_uint8            :  'external uint8 elements',
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_int16            :  'external int16 elements',
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_uint16           :  'external uint16 elements',
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_int32            :  'external int32 elements',
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_uint32           :  'external uint32 elements',
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_float32          :  'external float32 elements',
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_float64          :  'external float64 elements',
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_uint8_clamped    :  'external uint8_clamped elements',
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fixed_int32               :  'fixed int8 elements',
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fixed_uint8               :  'fixed uint8 elements',
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fixed_int16               :  'fixed int16 elements',
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fixed_uint16              :  'fixed uint16 elements',
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fixed_int32               :  'fixed int32 elements',
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fixed_uint32              :  'fixed uint32 elements',
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fixed_float32             :  'fixed float32 elements',
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fixed_float64             :  'fixed float64 elements',
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fixed_uint8_clamped       :  'fixed uint8_clamped elements'
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction getKind(obj) {
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFastSmiElements(obj)) return elements_kind.fast_smi_only;
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFastObjectElements(obj)) return elements_kind.fast;
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (%HasFastDoubleElements(obj)) return elements_kind.fast_double;
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (%HasDictionaryElements(obj)) return elements_kind.dictionary;
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Every external kind is also an external array.
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasExternalInt8Elements(obj)) {
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.external_int8;
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasExternalUint8Elements(obj)) {
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.external_uint8;
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasExternalInt16Elements(obj)) {
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.external_int16;
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasExternalUint16Elements(obj)) {
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.external_uint16;
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasExternalInt32Elements(obj)) {
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.external_int32;
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasExternalUint32Elements(obj)) {
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.external_uint32;
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasExternalFloat32Elements(obj)) {
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.external_float32;
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasExternalFloat64Elements(obj)) {
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.external_float64;
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasExternalUint8ClampedElements(obj)) {
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.external_uint8_clamped;
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFixedInt8Elements(obj)) {
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.fixed_int8;
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFixedUint8Elements(obj)) {
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.fixed_uint8;
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFixedInt16Elements(obj)) {
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.fixed_int16;
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFixedUint16Elements(obj)) {
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.fixed_uint16;
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFixedInt32Elements(obj)) {
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.fixed_int32;
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFixedUint32Elements(obj)) {
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.fixed_uint32;
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFixedFloat32Elements(obj)) {
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.fixed_float32;
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFixedFloat64Elements(obj)) {
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.fixed_float64;
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%HasFixedUint8ClampedElements(obj)) {
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind.fixed_uint8_clamped;
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction assertKind(expected, obj, name_opt) {
1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals(expected, getKind(obj), name_opt);
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar me = {};
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.fast, me);
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochme.dance = 0xD15C0;
1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochme.drink = 0xC0C0A;
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.fast, me);
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar too = [1,2,3];
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, too);
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtoo.dance = 0xD15C0;
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtoo.drink = 0xC0C0A;
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, too);
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Make sure the element kind transitions from smi when a non-smi is stored.
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction test_wrapper() {
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var you = new Array();
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_smi_only, you);
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < 1337; i++) {
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var val = i;
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 1336) {
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      assertKind(elements_kind.fast_smi_only, you);
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      val = new Object();
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    you[i] = val;
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, you);
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var temp = [];
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  temp[0xDECAF] = 0;
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.dictionary, temp);
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var fast_double_array = new Array(0xDECAF);
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < 0xDECAF; i++) fast_double_array[i] = i / 2;
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, fast_double_array);
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fixed_int8,    new Int8Array(007));
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fixed_uint8,   new Uint8Array(007));
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fixed_int16,   new Int16Array(666));
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fixed_uint16,  new Uint16Array(42));
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fixed_int32,   new Int32Array(0xF));
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fixed_uint32,  new Uint32Array(23));
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fixed_float32, new Float32Array(7));
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fixed_float64, new Float64Array(0));
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fixed_uint8_clamped, new Uint8ClampedArray(512));
1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ab = new ArrayBuffer(128);
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.external_int8,    new Int8Array(ab));
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.external_uint8,   new Uint8Array(ab));
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.external_int16,   new Int16Array(ab));
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.external_uint16,  new Uint16Array(ab));
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.external_int32,   new Int32Array(ab));
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.external_uint32,  new Uint32Array(ab));
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.external_float32, new Float32Array(ab));
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.external_float64, new Float64Array(ab));
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.external_uint8_clamped, new Uint8ClampedArray(ab));
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Crankshaft support for smi-only array elements.
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function monomorphic(array) {
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertKind(elements_kind.fast_smi_only, array);
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0; i < 3; i++) {
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      array[i] = i + 10;
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertKind(elements_kind.fast_smi_only, array);
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0; i < 3; i++) {
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var a = array[i];
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      assertEquals(i + 10, a);
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var smi_only = new Array(1, 2, 3);
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_smi_only, smi_only);
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < 3; i++) monomorphic(smi_only);
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %OptimizeFunctionOnNextCall(monomorphic);
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  monomorphic(smi_only);
1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The test is called in a wrapper function to eliminate the transition learning
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// feedback of AllocationSites.
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtest_wrapper();
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%ClearFunctionTypeFeedback(test_wrapper);
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%NeverOptimizeFunction(construct_smis);
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This code exists to eliminate the learning influence of AllocationSites
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// on the following tests.
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar __sequence = 0;
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction make_array_string() {
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.__sequence = this.__sequence + 1;
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return "/* " + this.__sequence + " */  [0, 0, 0];"
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction make_array() {
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return eval(make_array_string());
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction construct_smis() {
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = make_array();
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = 0;  // Send the COW array map to the steak house.
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_smi_only, a);
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return a;
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %NeverOptimizeFunction(construct_doubles);
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction construct_doubles() {
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = construct_smis();
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = 1.5;
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, a);
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return a;
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %NeverOptimizeFunction(construct_objects);
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction construct_objects() {
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = construct_smis();
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = "one";
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, a);
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return a;
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test crankshafted transition SMI->DOUBLE.
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %NeverOptimizeFunction(convert_to_double);
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction convert_to_double(array) {
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array[1] = 2.5;
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, array);
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(2.5, array[1]);
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar smis = construct_smis();
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < 3; i++) convert_to_double(smis);
2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %OptimizeFunctionOnNextCall(convert_to_double);
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochsmis = construct_smis();
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconvert_to_double(smis);
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test crankshafted transitions SMI->FAST and DOUBLE->FAST.
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %NeverOptimizeFunction(convert_to_fast);
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction convert_to_fast(array) {
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array[1] = "two";
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast, array);
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals("two", array[1]);
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochsmis = construct_smis();
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < 3; i++) convert_to_fast(smis);
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar doubles = construct_doubles();
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < 3; i++) convert_to_fast(doubles);
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochsmis = construct_smis();
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdoubles = construct_doubles();
2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %OptimizeFunctionOnNextCall(convert_to_fast);
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconvert_to_fast(smis);
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconvert_to_fast(doubles);
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test transition chain SMI->DOUBLE->FAST (crankshafted function will
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// transition to FAST directly).
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %NeverOptimizeFunction(convert_mixed);
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction convert_mixed(array, value, kind) {
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array[1] = value;
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(kind, array);
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(value, array[1]);
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochsmis = construct_smis();
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < 3; i++) {
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  convert_mixed(smis, 1.5, elements_kind.fast_double);
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdoubles = construct_doubles();
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < 3; i++) {
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  convert_mixed(doubles, "three", elements_kind.fast);
2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconvert_mixed(construct_smis(), "three", elements_kind.fast);
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconvert_mixed(construct_doubles(), "three", elements_kind.fast);
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %OptimizeFunctionOnNextCall(convert_mixed);
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochsmis = construct_smis();
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdoubles = construct_doubles();
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconvert_mixed(smis, 1, elements_kind.fast);
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconvert_mixed(doubles, 1, elements_kind.fast);
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(%HaveSameMap(smis, doubles));
2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Crankshaft support for smi-only elements in dynamic array literals.
2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction get(foo) { return foo; }  // Used to generate dynamic values.
2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction crankshaft_test() {
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a1 = [get(1), get(2), get(3)];
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_smi_only, a1);
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var a2 = new Array(get(1), get(2), get(3));
2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertKind(elements_kind.fast_smi_only, a2);
2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var b = [get(1), get(2), get("three")];
2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertKind(elements_kind.fast, b);
2993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var c = [get(1), get(2), get(3.5)];
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertKind(elements_kind.fast_double, c);
3013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor (var i = 0; i < 3; i++) {
3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  crankshaft_test();
3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch%OptimizeFunctionOnNextCall(crankshaft_test);
3063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochcrankshaft_test();
3073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Elements_kind transitions for arrays.
3093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A map can have three different elements_kind transitions: SMI->DOUBLE,
3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DOUBLE->OBJECT, and SMI->OBJECT. No matter in which order these three are
3123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// created, they must always end up with the same FAST map.
3133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Preparation: create one pair of identical objects for each case.
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar a = [1, 2, 3];
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar b = [1, 2, 3];
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(%HaveSameMap(a, b));
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, a);
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar c = [1, 2, 3];
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochc["case2"] = true;
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar d = [1, 2, 3];
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochd["case2"] = true;
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(%HaveSameMap(c, d));
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(%HaveSameMap(a, c));
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, c);
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar e = [1, 2, 3];
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoche["case3"] = true;
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar f = [1, 2, 3];
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochf["case3"] = true;
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(%HaveSameMap(e, f));
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(%HaveSameMap(a, e));
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(%HaveSameMap(c, e));
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, e);
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case 1: SMI->DOUBLE, DOUBLE->OBJECT, SMI->OBJECT.
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocha[0] = 1.5;
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, a);
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocha[0] = "foo";
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, a);
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochb[0] = "bar";
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(%HaveSameMap(a, b));
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case 2: SMI->DOUBLE, SMI->OBJECT, DOUBLE->OBJECT.
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochc[0] = 1.5;
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, c);
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(%HaveSameMap(c, d));
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochd[0] = "foo";
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, d);
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(%HaveSameMap(c, d));
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochc[0] = "bar";
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(%HaveSameMap(c, d));
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Case 3: SMI->OBJECT, SMI->DOUBLE, DOUBLE->OBJECT.
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoche[0] = "foo";
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, e);
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(%HaveSameMap(e, f));
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochf[0] = 1.5;
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, f);
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(%HaveSameMap(e, f));
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochf[0] = "bar";
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, f);
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(%HaveSameMap(e, f));
3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test if Array.concat() works correctly with DOUBLE elements.
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar a = [1, 2];
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, a);
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar b = [4.5, 5.5];
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, b);
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar c = a.concat(b);
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals([1, 2, 4.5, 5.5], c);
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_double, c);
3693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test that Array.push() correctly handles SMI elements.
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar a = [1, 2];
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, a);
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocha.push(3, 4, 5);
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast_smi_only, a);
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals([1, 2, 3, 4, 5], a);
3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test that Array.splice() and Array.slice() return correct ElementsKinds.
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar a = ["foo", "bar"];
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, a);
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar b = a.splice(0, 1);
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, b);
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar c = a.slice(0, 1);
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertKind(elements_kind.fast, c);
3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Throw away type information in the ICs for next stress run.
3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochgc();
387