184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// Redistribution and use in source and binary forms, with or without 384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// modification, are permitted provided that the following conditions are 484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// met: 584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// 684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// * Redistributions of source code must retain the above copyright 784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// notice, this list of conditions and the following disclaimer. 884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// * Redistributions in binary form must reproduce the above 984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// copyright notice, this list of conditions and the following 1084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// disclaimer in the documentation and/or other materials provided 1184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// with the distribution. 1284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// * Neither the name of Google Inc. nor the names of its 1384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// contributors may be used to endorse or promote products derived 1484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// from this software without specific prior written permission. 1584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// 1684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 2884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// Flags: --allow-natives-syntax --expose-gc 2984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 3084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfunction mkCOWArray() { 3184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org var a = ['']; 3284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org assertEquals('', a[0]); 3384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return a; 3484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 3584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 3684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfunction mkArray() { 3784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org var a = []; 3884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org a[0] = ''; 3984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return a; 4084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 4184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 4284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfunction mkNumberDictionary() { 4384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org var a = new Array(); 4484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org a[0] = ''; 4584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org a[100000] = ''; 4684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return a; 4784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 4884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 4984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfunction write(a, i) { a[i] = "bazinga!"; } 5084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 5184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfunction test(factories, w) { 5284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org factories.forEach(function(f) { w(f(), 0); }); 5384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org factories.forEach(function(f) { w(f(), 0); }); 5484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org %OptimizeFunctionOnNextCall(w); 5584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org factories.forEach(function(f) { w(f(), 0); }); 5684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org} 5784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 5884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// Monomorphic case. 5984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfor (var i = 0; i < 5; i++) write(mkArray(), 0); 6084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org%OptimizeFunctionOnNextCall(write); 6184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgwrite(mkCOWArray(), 0); 6284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgvar failure = mkCOWArray(); 6384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 6484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// Cleanup, then polymorphic case. 6584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org%DeoptimizeFunction(write); 6684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orggc(); 6784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgtest([mkArray, mkNumberDictionary], write); 6884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgtest([mkArray, mkNumberDictionary, mkCOWArray], write); 69