180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// Redistribution and use in source and binary forms, with or without
380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// modification, are permitted provided that the following conditions are
480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// met:
580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//
680c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//     * Redistributions of source code must retain the above copyright
780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//       notice, this list of conditions and the following disclaimer.
880c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//     * Redistributions in binary form must reproduce the above
980c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//       copyright notice, this list of conditions and the following
1080c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//       disclaimer in the documentation and/or other materials provided
1180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//       with the distribution.
1280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//     * Neither the name of Google Inc. nor the names of its
1380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//       contributors may be used to endorse or promote products derived
1480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//       from this software without specific prior written permission.
1580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org//
1680c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1880c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1980c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2080c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2680c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
28ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Flags: --harmony-scoping --allow-natives-syntax
2980c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
301b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org// TODO(ES6): properly activate extended mode
311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org"use strict";
321b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
3364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org// Check that the following functions are optimizable.
3464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvar functions = [ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14,
3564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org                  f15, f16, f17, f18, f19, f20, f21, f22, f23 ];
3664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
3764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfor (var i = 0; i < functions.length; ++i) {
3864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  var func = functions[i];
3964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  print("Testing:");
4064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  print(func);
4164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  for (var j = 0; j < 10; ++j) {
4264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    func(12);
4364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
4464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  %OptimizeFunctionOnNextCall(func);
4564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  func(12);
46ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  assertOptimized(func);
4764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
4864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
4964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f1() { }
5064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
5164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f2(x) { }
5264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
5364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f3() {
5464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  let x;
5564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
5664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
5764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f4() {
5864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  function foo() {
5964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
6064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
6164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
6264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f5() {
6364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  let x = 1;
6464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
6564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
6664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f6() {
6764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  const x = 1;
6864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
6964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
7064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f7(x) {
7164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  return x;
7264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
7364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
7464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f8() {
7564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  let x;
7664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  return x;
7764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
7864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
7964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f9() {
8064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  function x() {
8164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
8264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  return x;
8364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
8464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
8564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f10(x) {
8664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  x = 1;
8764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
8864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
8964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f11() {
9064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  let x;
9164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  x = 1;
9264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
9364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
9464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f12() {
9564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  function x() {};
9664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  x = 1;
9764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
9864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
9964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f13(x) {
10064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
10164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
10264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
10364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f14() {
10464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  let x;
10564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
10664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
10764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
10864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f15() {
10964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  function x() {
11064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
11164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
11264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
11364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
11464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f16() {
11564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  let x = 1;
11664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
11764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
11864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
11964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f17() {
12064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  const x = 1;
12164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
12264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
12364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
12464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f18(x) {
12564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  return x;
12664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
12764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
12864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
12964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f19() {
13064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  let x;
13164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  return x;
13264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
13364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
13464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
13564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f20() {
13664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  function x() {
13764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
13864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  return x;
13964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
14064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
14164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
14264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f21(x) {
14364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  x = 1;
14464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
14564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
14664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
14764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f22() {
14864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  let x;
14964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  x = 1;
15064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
15164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
15264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
15364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction f23() {
15464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  function x() { }
15564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  x = 1;
15664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  (function() { x; });
15764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
15864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
15964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
16080c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org// Test that temporal dead zone semantics for function and block scoped
16164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org// let bindings are handled by the optimizing compiler.
16264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
16364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction TestFunctionLocal(s) {
16464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  'use strict';
16564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  var func = eval("(function baz(){" + s + "; })");
16664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  print("Testing:");
16764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  print(func);
16864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  for (var i = 0; i < 5; ++i) {
16964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    try {
17064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      func();
17164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      assertUnreachable();
17264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    } catch (e) {
17364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      assertInstanceof(e, ReferenceError);
17464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    }
17564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
17664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  %OptimizeFunctionOnNextCall(func);
17764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  try {
17864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    func();
17964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    assertUnreachable();
18064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  } catch (e) {
18164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    assertInstanceof(e, ReferenceError);
18264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
18364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
18464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
18564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction TestFunctionContext(s) {
18664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  'use strict';
18764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  var func = eval("(function baz(){ " + s + "; (function() { x; }); })");
18864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  print("Testing:");
18964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  print(func);
19064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  for (var i = 0; i < 5; ++i) {
19164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    print(i);
19264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    try {
19364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      func();
19464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      assertUnreachable();
19564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    } catch (e) {
19664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      assertInstanceof(e, ReferenceError);
19764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    }
19864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
19964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  print("optimize");
20064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  %OptimizeFunctionOnNextCall(func);
20164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  try {
20264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    print("call");
20364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    func();
20464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    assertUnreachable();
20564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  } catch (e) {
20664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    print("catch");
20764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    assertInstanceof(e, ReferenceError);
20864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
20964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
21064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
21164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgfunction TestAll(s) {
21264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  TestFunctionLocal(s);
21364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  TestFunctionContext(s);
21464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
21564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
21664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org// Use before initialization in declaration statement.
21764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('let x = x + 1');
21864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('let x = x += 1');
21964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('let x = x++');
22064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('let x = ++x');
22164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('const x = x + 1');
22264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
22364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org// Use before initialization in prior statement.
22464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('x + 1; let x;');
22564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('x = 1; let x;');
22664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('x += 1; let x;');
22764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('++x; let x;');
22864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('x++; let x;');
22964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgTestAll('let y = x; const x = 1;');
23064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
23180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
23280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.orgfunction f(x, b) {
23380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  let y = (b ? y : x) + 42;
23480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  return y;
23580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org}
23680c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
23780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.orgfunction g(x, b) {
23880c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  {
23980c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org    let y = (b ? y : x) + 42;
24080c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org    return y;
24180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  }
24280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org}
24380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
24480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.orgfor (var i=0; i<10; i++) {
24580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  f(i, false);
24680c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  g(i, false);
24780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org}
24880c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
24980c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org%OptimizeFunctionOnNextCall(f);
25080c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org%OptimizeFunctionOnNextCall(g);
25180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
25280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.orgtry {
25380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  f(42, true);
25480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org} catch (e) {
25580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  assertInstanceof(e, ReferenceError);
25680c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org}
25780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
25880c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.orgtry {
25980c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  g(42, true);
26080c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org} catch (e) {
26180c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  assertInstanceof(e, ReferenceError);
26280c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org}
263