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 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test materialization of the arguments object when deoptimizing a 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// strict mode closure after modifying an argument. 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function () { 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var forceDeopt = 0; 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function inner(x) { 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "use strict"; 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch x = 2; 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Do not remove this %DebugPrint as it makes sure the deopt happens 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // after the assignment and is not hoisted above the assignment. 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %DebugPrint(arguments[0]); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch forceDeopt + 1; 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return arguments[0]; 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(1, inner(1)); 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(1, inner(1)); 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %OptimizeFunctionOnNextCall(inner); 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(1, inner(1)); 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch forceDeopt = "not a number"; 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(1, inner(1)); 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})(); 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test materialization of the arguments object when deoptimizing an 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// inlined strict mode closure after modifying an argument. 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function () { 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var forceDeopt = 0; 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function inner(x) { 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "use strict"; 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch x = 2; 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Do not remove this %DebugPrint as it makes sure the deopt happens 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // after the assignment and is not hoisted above the assignment. 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %DebugPrint(arguments[0]); 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch forceDeopt + 1; 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return arguments[0]; 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function outer(x) { 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return inner(x); 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(1, outer(1)); 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(1, outer(1)); 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %OptimizeFunctionOnNextCall(outer); 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(1, outer(1)); 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch forceDeopt = "not a number"; 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(1, outer(1)); 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})(); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test materialization of the multiple arguments objects when 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// deoptimizing several inlined closure after modifying an argument. 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function () { 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var forceDeopt = 0; 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function inner(x,y,z) { 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "use strict"; 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch x = 3; 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Do not remove this %DebugPrint as it makes sure the deopt happens 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // after the assignment and is not hoisted above the assignment. 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %DebugPrint(arguments[0]); 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch forceDeopt + 1; 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return arguments[0]; 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function middle(x) { 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "use strict"; 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch x = 2; 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return inner(10*x, 20*x, 30*x) + arguments[0]; 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function outer(x) { 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return middle(x); 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(21, outer(1)); 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(21, outer(1)); 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %OptimizeFunctionOnNextCall(outer); 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(21, outer(1)); 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch forceDeopt = "not a number"; 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(21, outer(1)); 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})(); 114