144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// Redistribution and use in source and binary forms, with or without 344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// modification, are permitted provided that the following conditions are 444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// met: 544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// 644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// * Redistributions of source code must retain the above copyright 744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// notice, this list of conditions and the following disclaimer. 844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// * Redistributions in binary form must reproduce the above 944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// copyright notice, this list of conditions and the following 1044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// disclaimer in the documentation and/or other materials provided 1144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// with the distribution. 1244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// * Neither the name of Google Inc. nor the names of its 1344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// contributors may be used to endorse or promote products derived 1444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// from this software without specific prior written permission. 1544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// 1644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 28fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// Flags: --allow-natives-syntax 29fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 3044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgvar global = 0; 31fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgvar MAX = 5; 3244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 3344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// Attempt to inline strcit in non-strict. 3444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 3544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgfunction strictToBeInlined(n) { 3644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org "use strict"; 3744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org global = "strict"; 3844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org if (n == MAX) { undefined_variable_strict = "value"; } 3944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org} 4044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 4144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgfunction nonstrictCallStrict(n) { 4244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org strictToBeInlined(n); 4344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org} 4444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 4544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org(function testInlineStrictInNonStrict() { 4644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org for (var i = 0; i <= MAX; i ++) { 4744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org try { 48fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (i == MAX - 1) %OptimizeFunctionOnNextCall(nonstrictCallStrict); 4944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org nonstrictCallStrict(i); 5044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } catch (e) { 5144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org assertInstanceof(e, ReferenceError); 5244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org assertEquals(MAX, i); 5344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org return; 5444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } 5544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } 5644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org fail("ReferenceError after MAX iterations", "no exception"); 5744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org})(); 5844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 5944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// Attempt to inline non-strict in strict. 6044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 6144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgfunction nonstrictToBeInlined(n) { 6244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org global = "nonstrict"; 6344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org if (n == MAX) { undefined_variable_nonstrict = "The nonstrict value"; } 6444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org} 6544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 6644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgfunction strictCallNonStrict(n) { 6744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org "use strict"; 6844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org nonstrictToBeInlined(n); 6944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org} 7044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 7144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org(function testInlineNonStrictInStrict() { 7244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org for (var i = 0; i <= MAX; i ++) { 7344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org try { 74fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (i == MAX - 1) %OptimizeFunctionOnNextCall(nonstrictCallStrict); 7544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org strictCallNonStrict(i); 7644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } catch (e) { 7744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org fail("no exception", "exception"); 7844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } 7944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } 8044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org assertEquals("The nonstrict value", undefined_variable_nonstrict); 8144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org})(); 8244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 8344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// Optimize strict function. 8444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 8544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgfunction strictAssignToUndefined(n) { 8644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org "use strict"; 8744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org global = "strict"; 8844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org if (n == MAX) { undefined_variable_strict_2 = "value"; } 8944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org} 9044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 9144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org(function testOptimizeStrictAssignToUndefined() { 9244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org for (var i = 0; i <= MAX; i ++) { 9344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org try { 94fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (i == MAX - 1) %OptimizeFunctionOnNextCall(nonstrictCallStrict); 9544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org strictAssignToUndefined(i); 9644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } catch (e) { 9744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org assertInstanceof(e, ReferenceError); 9844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org assertEquals(MAX, i); 9944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org return; 10044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } 10144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } 10244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org fail("ReferenceError after MAX iterations", "no exception"); 10344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org})(); 104