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