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