1f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 2f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// Redistribution and use in source and binary forms, with or without 3f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// modification, are permitted provided that the following conditions are 4f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// met: 5f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// 6f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// * Redistributions of source code must retain the above copyright 7f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// notice, this list of conditions and the following disclaimer. 8f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// * Redistributions in binary form must reproduce the above 9f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// copyright notice, this list of conditions and the following 10f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// disclaimer in the documentation and/or other materials provided 11f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// with the distribution. 12f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// * Neither the name of Google Inc. nor the names of its 13f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// contributors may be used to endorse or promote products derived 14f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// from this software without specific prior written permission. 15f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// 16f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org 28474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// Flags: --allow-natives-syntax --expose-gc 299cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org// Flags: --noalways-opt 30f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org 31f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org// Test element kind of objects. 32f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org 33f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgvar elements_kind = { 34f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org fast_smi_only : 'fast smi only elements', 35f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org fast : 'fast elements', 36f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org fast_double : 'fast double elements', 37f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org dictionary : 'dictionary elements', 38f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org external_byte : 'external byte elements', 39f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org external_unsigned_byte : 'external unsigned byte elements', 40f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org external_short : 'external short elements', 41f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org external_unsigned_short : 'external unsigned short elements', 42f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org external_int : 'external int elements', 43f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org external_unsigned_int : 'external unsigned int elements', 44f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org external_float : 'external float elements', 45f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org external_double : 'external double elements', 46f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org external_pixel : 'external pixel elements' 47f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org} 48f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org 49f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgfunction getKind(obj) { 50f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org if (%HasFastSmiElements(obj)) return elements_kind.fast_smi_only; 51f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org if (%HasFastObjectElements(obj)) return elements_kind.fast; 52f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org if (%HasFastDoubleElements(obj)) return elements_kind.fast_double; 53f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org if (%HasDictionaryElements(obj)) return elements_kind.dictionary; 54f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org} 55f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org 56f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgfunction isHoley(obj) { 57f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org if (%HasFastHoleyElements(obj)) return true; 58f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org return false; 59f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org} 60f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org 61f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgfunction assertKind(expected, obj, name_opt) { 62f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org assertEquals(expected, getKind(obj), name_opt); 63f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org} 64f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org 65474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// Test: If a call site goes megamorphic, it retains the ability to 66474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// use allocation site feedback (if FLAG_allocation_site_pretenuring 67474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// is on). 68474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org(function() { 69474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org function bar(t, len) { 70474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org return new t(len); 71474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org } 72474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 73474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar(Array, 10); 74474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a[0] = 3.5; 75474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org b = bar(Array, 1); 76474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertKind(elements_kind.fast_double, b); 77474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org c = bar(Object, 3); 78474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org b = bar(Array, 10); 79474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // TODO(mvstanton): re-enable when FLAG_allocation_site_pretenuring 80474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // is on in the build. 81474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // assertKind(elements_kind.fast_double, b); 82474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org})(); 83474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 84474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 85474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// Test: ensure that crankshafted array constructor sites are deopted 86474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// if another function is used. 87474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org(function() { 88474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org function bar0(t) { 89474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org return new t(); 90474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org } 91474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar0(Array); 92474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a[0] = 3.5; 93474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org b = bar0(Array); 94474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertKind(elements_kind.fast_double, b); 951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org %OptimizeFunctionOnNextCall(bar0); 96474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org b = bar0(Array); 97474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertKind(elements_kind.fast_double, b); 98474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(bar0); 99474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // bar0 should deopt 100474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org b = bar0(Object); 101474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertUnoptimized(bar0) 102474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // When it's re-optimized, we should call through the full stub 103474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org bar0(Array); 1041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org %OptimizeFunctionOnNextCall(bar0); 105474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org b = bar0(Array); 106474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // This only makes sense to test if we allow crankshafting 107474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org if (4 != %GetOptimizationStatus(bar0)) { 108474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // We also lost our ability to record kind feedback, as the site 109474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // is megamorphic now. 110474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertKind(elements_kind.fast_smi_only, b); 111474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(bar0); 112474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org b[0] = 3.5; 113474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org c = bar0(Array); 114474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertKind(elements_kind.fast_smi_only, c); 115474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org } 116474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org})(); 1171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 119474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// Test: Ensure that inlined array calls in crankshaft learn from deopts 120474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// based on the move to a dictionary for the array. 121474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org(function() { 122474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org function bar(len) { 123474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org return new Array(len); 124474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org } 125474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar(10); 126474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a[0] = "a string"; 127474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar(10); 128474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertKind(elements_kind.fast, a); 129474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org %OptimizeFunctionOnNextCall(bar); 130474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar(10); 131474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertKind(elements_kind.fast, a); 132474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(bar); 1332b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org bar(100000); 134474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(bar); 135474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 136474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // If the argument isn't a smi, things should still work. 137474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar("oops"); 138474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(bar); 139474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertKind(elements_kind.fast, a); 140474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 141474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org function barn(one, two, three) { 142474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org return new Array(one, two, three); 143474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org } 1441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 145474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org barn(1, 2, 3); 146474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org barn(1, 2, 3); 1471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org %OptimizeFunctionOnNextCall(barn); 148474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org barn(1, 2, 3); 149474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(barn); 150474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = barn(1, "oops", 3); 151474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(barn); 152474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org})(); 153474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 154474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 155474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// Test: When a method with array constructor is crankshafted, the type 156474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// feedback for elements kind is baked in. Verify that transitions don't 157474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// change it anymore 158474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org(function() { 159474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org function bar() { 160474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org return new Array(); 161474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org } 162474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar(); 163474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org bar(); 1641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org %OptimizeFunctionOnNextCall(bar); 165474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org b = bar(); 166474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // This only makes sense to test if we allow crankshafting 167474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org if (4 != %GetOptimizationStatus(bar)) { 168474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(bar); 1691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org %DebugPrint(3); 170474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org b[0] = 3.5; 171474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org c = bar(); 172474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertKind(elements_kind.fast_smi_only, c); 173474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(bar); 174474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org } 175474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org})(); 176474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 177474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 178474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// Test: create arrays in two contexts, verifying that the correct 179474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// map for Array in that context will be used. 180474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org(function() { 181474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org function bar() { return new Array(); } 182474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org bar(); 183474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org bar(); 1841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org %OptimizeFunctionOnNextCall(bar); 185474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar(); 186474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertTrue(a instanceof Array); 187474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 188474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org var contextB = Realm.create(); 189474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Realm.eval(contextB, "function bar2() { return new Array(); };"); 190474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Realm.eval(contextB, "bar2(); bar2();"); 191474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Realm.eval(contextB, "%OptimizeFunctionOnNextCall(bar2);"); 192474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org Realm.eval(contextB, "bar2();"); 193474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertFalse(Realm.eval(contextB, "bar2();") instanceof Array); 194474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertTrue(Realm.eval(contextB, "bar2() instanceof Array")); 195474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org})(); 196474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 197474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// Test: create array with packed feedback, then optimize function, which 198474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// should deal with arguments that create holey arrays. 199474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org(function() { 200474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org function bar(len) { return new Array(len); } 201474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org bar(0); 202474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org bar(0); 203b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org %OptimizeFunctionOnNextCall(bar); 204474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar(0); 205474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(bar); 206474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertFalse(isHoley(a)); 207474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar(1); // ouch! 208474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(bar); 209474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertTrue(isHoley(a)); 210474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar(100); 211474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertTrue(isHoley(a)); 212474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org a = bar(0); 213474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org assertOptimized(bar); 214474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // Crankshafted functions don't use mementos, so feedback still 215474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org // indicates a packed array is desired. (unless --nocrankshaft is in use). 216474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org if (4 != %GetOptimizationStatus(bar)) { 217b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org assertFalse(isHoley(a)); 218474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org } 219474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org})(); 220