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