1ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved. 2ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Redistribution and use in source and binary forms, with or without 3ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// modification, are permitted provided that the following conditions are 4ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// met: 5ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// 6ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// * Redistributions of source code must retain the above copyright 7ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// notice, this list of conditions and the following disclaimer. 8ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// * Redistributions in binary form must reproduce the above 9ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// copyright notice, this list of conditions and the following 10ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// disclaimer in the documentation and/or other materials provided 11ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// with the distribution. 12ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// * Neither the name of Google Inc. nor the names of its 13ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// contributors may be used to endorse or promote products derived 14ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// from this software without specific prior written permission. 15ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// 16ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 28ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Flags: --allow-natives-syntax 29ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 30ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Test that boilerplate objects for array literals with non-constant 31ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// elements (which will contain the hole at non-constant positions) will 32ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// not cause prototype chain lookups when generating optimized code. 33ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 34ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comfunction f(x) { 35ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return [x][0]; 36ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com} 37ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 38ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Test data element on prototype. 39ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comObject.prototype[0] = 23; 40ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(1, f(1)); 41ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(2, f(2)); 42ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com%OptimizeFunctionOnNextCall(f); 43ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(3, f(3)); 44ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com%DeoptimizeFunction(f); 45ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 46ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Test accessor element on prototype. 47ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comObject.prototype.__defineGetter__(0, function() { throw Error(); }); 48ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(4, f(4)); 49ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(5, f(5)); 50ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com%OptimizeFunctionOnNextCall(f); 51ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(6, f(6)); 52ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com%DeoptimizeFunction(f); 53ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 54ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Test the same on boilerplate objects for object literals that contain 55ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// both non-constant properties and non-constant elements. 56ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 57ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comfunction g(x, y) { 58ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com var o = { foo:x, 0:y }; 59ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return o.foo + o[0]; 60ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com} 61ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 62ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Test data property and element on prototype. 63ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comObject.prototype[0] = 23; 64ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comObject.prototype.foo = 42; 65ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(3, g(1, 2)); 66ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(5, g(2, 3)); 67ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com%OptimizeFunctionOnNextCall(g); 68ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(7, g(3, 4)); 69ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com%DeoptimizeFunction(g); 70ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 71ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// Test accessor property and element on prototype. 72ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comObject.prototype.__defineGetter__(0, function() { throw Error(); }); 73ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comObject.prototype.__defineGetter__('foo', function() { throw Error(); }); 74ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(3, g(1, 2)); 75ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(5, g(2, 3)); 76ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com%OptimizeFunctionOnNextCall(g); 77ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertSame(7, g(3, 4)); 78ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com%DeoptimizeFunction(g); 79