1830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 2830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// Redistribution and use in source and binary forms, with or without 3830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// modification, are permitted provided that the following conditions are 4830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// met: 5830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// 6830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// * Redistributions of source code must retain the above copyright 7830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// notice, this list of conditions and the following disclaimer. 8830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// * Redistributions in binary form must reproduce the above 9830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// copyright notice, this list of conditions and the following 10830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// disclaimer in the documentation and/or other materials provided 11830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// with the distribution. 12830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// * Neither the name of Google Inc. nor the names of its 13830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// contributors may be used to endorse or promote products derived 14830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// from this software without specific prior written permission. 15830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// 16830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 28474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// Flags: --allow-natives-syntax 29830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 30830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgfunction test1() { 31830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var a = Array(8); 32830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastSmiOrObjectElements(a)); 33830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastHoleyElements(a)); 34830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org} 35830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 36830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgfunction test2() { 37830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var a = Array(); 38830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastSmiOrObjectElements(a)); 39830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertFalse(%HasFastHoleyElements(a)); 40830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org} 41830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 42830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgfunction test3() { 43830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var a = Array(1,2,3,4,5,6,7); 44830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastSmiOrObjectElements(a)); 45830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertFalse(%HasFastHoleyElements(a)); 46830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org} 47830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 48830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgfunction test4() { 49830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var a = [1, 2, 3, 4]; 50830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastSmiElements(a)); 51830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertFalse(%HasFastHoleyElements(a)); 52830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var b = [1, 2,, 4]; 53830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastSmiElements(b)); 54830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastHoleyElements(b)); 55830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org} 56830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 57830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgfunction test5() { 58830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var a = [1, 2, 3, 4.5]; 59830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastDoubleElements(a)); 60830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertFalse(%HasFastHoleyElements(a)); 61830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var b = [1,, 3.5, 4]; 62830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastDoubleElements(b)); 63830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastHoleyElements(b)); 64830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var c = [1, 3.5,, 4]; 65830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastDoubleElements(c)); 66830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastHoleyElements(c)); 67830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org} 68830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 69830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgfunction test6() { 70830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var x = new Object(); 71830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var a = [1, 2, 3.5, x]; 72830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastObjectElements(a)); 73830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertFalse(%HasFastHoleyElements(a)); 74830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(1, a[0]); 75830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(2, a[1]); 76830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(3.5, a[2]); 77830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(x, a[3]); 78830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var b = [1,, 3.5, x]; 79830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastObjectElements(b)); 80830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastHoleyElements(b)); 81830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(1, b[0]); 82830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(undefined, b[1]); 83830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(3.5, b[2]); 84830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(x, b[3]); 85830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org var c = [1, 3.5, x,,]; 86830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastObjectElements(c)); 87830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertTrue(%HasFastHoleyElements(c)); 88830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(1, c[0]); 89830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(3.5, c[1]); 90830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(x, c[2]); 91830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org assertEquals(undefined, c[3]); 92830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org} 93830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 94830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgfunction test_with_optimization(f) { 95830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org // Run tests in a loop to make sure that inlined Array() constructor runs out 96830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org // of new space memory and must fall back on runtime impl. 9799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org for (i = 0; i < 25000; ++i) f(); 98830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org %OptimizeFunctionOnNextCall(f); 9999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org for (i = 0; i < 25000; ++i) f(); // Make sure GC happens 100830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org} 101830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org 102474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.orgtest_with_optimization(test1); 103474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.orgtest_with_optimization(test2); 104474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.orgtest_with_optimization(test3); 105474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.orgtest_with_optimization(test4); 106474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.orgtest_with_optimization(test5); 107474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.orgtest_with_optimization(test6); 108