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 283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --allow-natives-syntax --smi-only-arrays --expose-gc 293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test element kind of objects. 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Since --smi-only-arrays affects builtins, its default setting at compile 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// time sticks if built with snapshot. If --smi-only-arrays is deactivated 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// by default, only a no-snapshot build actually has smi-only arrays enabled 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// in this test case. Depending on whether smi-only arrays are actually 353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// enabled, this test takes the appropriate code path to check smi-only arrays. 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochsupport_smi_only_arrays = %HasFastSmiOnlyElements(new Array(1,2,3,4,5,6,7,8)); 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochif (support_smi_only_arrays) { 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch print("Tests include smi-only arrays."); 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} else { 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch print("Tests do NOT include smi-only arrays."); 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar elements_kind = { 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fast_smi_only : 'fast smi only elements', 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fast : 'fast elements', 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fast_double : 'fast double elements', 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch dictionary : 'dictionary elements', 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch external_byte : 'external byte elements', 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch external_unsigned_byte : 'external unsigned byte elements', 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch external_short : 'external short elements', 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch external_unsigned_short : 'external unsigned short elements', 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch external_int : 'external int elements', 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch external_unsigned_int : 'external unsigned int elements', 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch external_float : 'external float elements', 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch external_double : 'external double elements', 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch external_pixel : 'external pixel elements' 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction getKind(obj) { 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasFastSmiOnlyElements(obj)) return elements_kind.fast_smi_only; 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasFastElements(obj)) return elements_kind.fast; 643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasFastDoubleElements(obj)) return elements_kind.fast_double; 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasDictionaryElements(obj)) return elements_kind.dictionary; 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Every external kind is also an external array. 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HasExternalArrayElements(obj)); 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasExternalByteElements(obj)) { 693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind.external_byte; 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasExternalUnsignedByteElements(obj)) { 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind.external_unsigned_byte; 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasExternalShortElements(obj)) { 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind.external_short; 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasExternalUnsignedShortElements(obj)) { 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind.external_unsigned_short; 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasExternalIntElements(obj)) { 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind.external_int; 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasExternalUnsignedIntElements(obj)) { 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind.external_unsigned_int; 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasExternalFloatElements(obj)) { 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind.external_float; 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasExternalDoubleElements(obj)) { 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind.external_double; 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (%HasExternalPixelElements(obj)) { 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind.external_pixel; 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction assertKind(expected, obj, name_opt) { 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!support_smi_only_arrays && 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch expected == elements_kind.fast_smi_only) { 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch expected = elements_kind.fast; 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(expected, getKind(obj), name_opt); 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar me = {}; 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.fast, me); 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochme.dance = 0xD15C0; 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochme.drink = 0xC0C0A; 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.fast, me); 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochif (support_smi_only_arrays) { 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var too = [1,2,3]; 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, too); 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch too.dance = 0xD15C0; 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch too.drink = 0xC0C0A; 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, too); 1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Make sure the element kind transitions from smionly when a non-smi is stored. 1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar you = new Array(); 1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.fast_smi_only, you); 1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor (var i = 0; i < 1337; i++) { 1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var val = i; 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (i == 1336) { 1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, you); 1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch val = new Object(); 1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch you[i] = val; 1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.fast, you); 1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.dictionary, new Array(0xDECAF)); 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar fast_double_array = new Array(0xDECAF); 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor (var i = 0; i < 0xDECAF; i++) fast_double_array[i] = i / 2; 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.fast_double, fast_double_array); 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.external_byte, new Int8Array(9001)); 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.external_unsigned_byte, new Uint8Array(007)); 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.external_short, new Int16Array(666)); 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.external_unsigned_short, new Uint16Array(42)); 1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.external_int, new Int32Array(0xF)); 1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.external_unsigned_int, new Uint32Array(23)); 1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.external_float, new Float32Array(7)); 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.external_double, new Float64Array(0)); 1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.external_pixel, new PixelArray(512)); 1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Crankshaft support for smi-only array elements. 1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction monomorphic(array) { 1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, array); 1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (var i = 0; i < 3; i++) { 1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch array[i] = i + 10; 1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, array); 1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (var i = 0; i < 3; i++) { 1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a = array[i]; 1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(i + 10, a); 1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar smi_only = new Array(1, 2, 3); 1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertKind(elements_kind.fast_smi_only, smi_only); 1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor (var i = 0; i < 3; i++) monomorphic(smi_only); 1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch%OptimizeFunctionOnNextCall(monomorphic); 1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmonomorphic(smi_only); 1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochif (support_smi_only_arrays) { 1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch function construct_smis() { 1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a = [0, 0, 0]; 1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch a[0] = 0; // Send the COW array map to the steak house. 1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, a); 1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return a; 1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch function construct_doubles() { 1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a = construct_smis(); 1753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch a[0] = 1.5; 1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_double, a); 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return a; 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch function construct_objects() { 1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a = construct_smis(); 1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch a[0] = "one"; 1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, a); 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return a; 1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Test crankshafted transition SMI->DOUBLE. 1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch function convert_to_double(array) { 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch array[1] = 2.5; 1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_double, array); 1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(2.5, array[1]); 1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var smis = construct_smis(); 1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (var i = 0; i < 3; i++) convert_to_double(smis); 1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch %OptimizeFunctionOnNextCall(convert_to_double); 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch smis = construct_smis(); 1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch convert_to_double(smis); 1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Test crankshafted transitions SMI->FAST and DOUBLE->FAST. 1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch function convert_to_fast(array) { 1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch array[1] = "two"; 2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, array); 2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("two", array[1]); 2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch smis = construct_smis(); 2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (var i = 0; i < 3; i++) convert_to_fast(smis); 2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var doubles = construct_doubles(); 2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (var i = 0; i < 3; i++) convert_to_fast(doubles); 2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch smis = construct_smis(); 2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch doubles = construct_doubles(); 2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch %OptimizeFunctionOnNextCall(convert_to_fast); 2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch convert_to_fast(smis); 2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch convert_to_fast(doubles); 2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Test transition chain SMI->DOUBLE->FAST (crankshafted function will 2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // transition to FAST directly). 2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch function convert_mixed(array, value, kind) { 2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch array[1] = value; 2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(kind, array); 2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(value, array[1]); 2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch smis = construct_smis(); 2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (var i = 0; i < 3; i++) { 2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch convert_mixed(smis, 1.5, elements_kind.fast_double); 2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch doubles = construct_doubles(); 2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (var i = 0; i < 3; i++) { 2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch convert_mixed(doubles, "three", elements_kind.fast); 2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch smis = construct_smis(); 2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch doubles = construct_doubles(); 2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch %OptimizeFunctionOnNextCall(convert_mixed); 2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch convert_mixed(smis, 1, elements_kind.fast); 2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch convert_mixed(doubles, 1, elements_kind.fast); 2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HaveSameMap(smis, doubles)); 2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Crankshaft support for smi-only elements in dynamic array literals. 2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction get(foo) { return foo; } // Used to generate dynamic values. 2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction crankshaft_test() { 2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (support_smi_only_arrays) { 2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a1 = [get(1), get(2), get(3)]; 2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, a1); 2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a2 = new Array(get(1), get(2), get(3)); 2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, a2); 2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var b = [get(1), get(2), get("three")]; 2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, b); 2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var c = [get(1), get(2), get(3.5)]; 2483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (support_smi_only_arrays) { 2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_double, c); 2503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor (var i = 0; i < 3; i++) { 2533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch crankshaft_test(); 2543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch%OptimizeFunctionOnNextCall(crankshaft_test); 2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochcrankshaft_test(); 2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Elements_kind transitions for arrays. 2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A map can have three different elements_kind transitions: SMI->DOUBLE, 2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DOUBLE->OBJECT, and SMI->OBJECT. No matter in which order these three are 2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// created, they must always end up with the same FAST map. 2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// This test is meaningless without FAST_SMI_ONLY_ELEMENTS. 2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochif (support_smi_only_arrays) { 2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Preparation: create one pair of identical objects for each case. 2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a = [1, 2, 3]; 2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var b = [1, 2, 3]; 2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HaveSameMap(a, b)); 2703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, a); 2713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var c = [1, 2, 3]; 2723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch c["case2"] = true; 2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var d = [1, 2, 3]; 2743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch d["case2"] = true; 2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HaveSameMap(c, d)); 2763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(%HaveSameMap(a, c)); 2773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, c); 2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var e = [1, 2, 3]; 2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch e["case3"] = true; 2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var f = [1, 2, 3]; 2813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch f["case3"] = true; 2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HaveSameMap(e, f)); 2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(%HaveSameMap(a, e)); 2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(%HaveSameMap(c, e)); 2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, e); 2863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Case 1: SMI->DOUBLE, DOUBLE->OBJECT, SMI->OBJECT. 2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch a[0] = 1.5; 2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_double, a); 2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch a[0] = "foo"; 2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, a); 2913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch b[0] = "bar"; 2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HaveSameMap(a, b)); 2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Case 2: SMI->DOUBLE, SMI->OBJECT, DOUBLE->OBJECT. 2943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch c[0] = 1.5; 2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_double, c); 2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(%HaveSameMap(c, d)); 2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch d[0] = "foo"; 2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, d); 2993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(%HaveSameMap(c, d)); 3003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch c[0] = "bar"; 3013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HaveSameMap(c, d)); 3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Case 3: SMI->OBJECT, SMI->DOUBLE, DOUBLE->OBJECT. 3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch e[0] = "foo"; 3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, e); 3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(%HaveSameMap(e, f)); 3063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch f[0] = 1.5; 3073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_double, f); 3083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(%HaveSameMap(e, f)); 3093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch f[0] = "bar"; 3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, f); 3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HaveSameMap(e, f)); 3123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test if Array.concat() works correctly with DOUBLE elements. 3153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochif (support_smi_only_arrays) { 3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a = [1, 2]; 3173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, a); 3183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var b = [4.5, 5.5]; 3193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_double, b); 3203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var c = a.concat(b); 3213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals([1, 2, 4.5, 5.5], c); 3223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // TODO(1810): Change implementation so that we get DOUBLE elements here? 3233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, c); 3243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test that Array.push() correctly handles SMI elements. 3273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochif (support_smi_only_arrays) { 3283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a = [1, 2]; 3293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, a); 3303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch a.push(3, 4, 5); 3313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast_smi_only, a); 3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals([1, 2, 3, 4, 5], a); 3333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test that Array.splice() and Array.slice() return correct ElementsKinds. 3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochif (support_smi_only_arrays) { 3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a = ["foo", "bar"]; 3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, a); 3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var b = a.splice(0, 1); 3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, b); 3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var c = a.slice(0, 1); 3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertKind(elements_kind.fast, c); 3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Throw away type information in the ICs for next stress run. 3463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochgc(); 347