169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --harmony-scoping --allow-natives-syntax
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(ES6): properly activate extended mode
313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch"use strict";
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Check that the following functions are optimizable.
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar functions = [ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14,
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  f15, f16, f17, f18, f19, f20, f21, f22, f23 ];
363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor (var i = 0; i < functions.length; ++i) {
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var func = functions[i];
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  print("Testing:");
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  print(func);
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (var j = 0; j < 10; ++j) {
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    func(12);
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %OptimizeFunctionOnNextCall(func);
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  func(12);
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertTrue(%GetOptimizationStatus(func) != 2);
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f1() { }
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f2(x) { }
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f3() {
543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let x;
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f4() {
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  function foo() {
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f5() {
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let x = 1;
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f6() {
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const x = 1;
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f7(x) {
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return x;
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f8() {
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let x;
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return x;
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f9() {
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  function x() {
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return x;
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f10(x) {
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  x = 1;
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f11() {
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let x;
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  x = 1;
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f12() {
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  function x() {};
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  x = 1;
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f13(x) {
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f14() {
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let x;
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f15() {
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  function x() {
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f16() {
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let x = 1;
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f17() {
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const x = 1;
1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f18(x) {
1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return x;
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f19() {
1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let x;
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return x;
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f20() {
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  function x() {
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return x;
1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f21(x) {
1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  x = 1;
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f22() {
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let x;
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  x = 1;
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f23() {
1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  function x() { }
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  x = 1;
1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function() { x; });
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
159c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
16069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Test that temporal dead zone semantics for function and block scoped
1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// let bindings are handled by the optimizing compiler.
1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestFunctionLocal(s) {
1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  'use strict';
1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var func = eval("(function baz(){" + s + "; })");
1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  print("Testing:");
1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  print(func);
1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (var i = 0; i < 5; ++i) {
1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    try {
1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      func();
1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      assertUnreachable();
1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } catch (e) {
1733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      assertInstanceof(e, ReferenceError);
1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %OptimizeFunctionOnNextCall(func);
1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  try {
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    func();
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    assertUnreachable();
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } catch (e) {
1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    assertInstanceof(e, ReferenceError);
1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestFunctionContext(s) {
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  'use strict';
1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var func = eval("(function baz(){ " + s + "; (function() { x; }); })");
1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  print("Testing:");
1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  print(func);
1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (var i = 0; i < 5; ++i) {
1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    print(i);
1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    try {
1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      func();
1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      assertUnreachable();
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } catch (e) {
1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      assertInstanceof(e, ReferenceError);
1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  print("optimize");
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %OptimizeFunctionOnNextCall(func);
2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  try {
2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    print("call");
2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    func();
2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    assertUnreachable();
2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } catch (e) {
2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    print("catch");
2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    assertInstanceof(e, ReferenceError);
2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestAll(s) {
2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  TestFunctionLocal(s);
2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  TestFunctionContext(s);
2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Use before initialization in declaration statement.
2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('let x = x + 1');
2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('let x = x += 1');
2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('let x = x++');
2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('let x = ++x');
2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('const x = x + 1');
2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Use before initialization in prior statement.
2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('x + 1; let x;');
2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('x = 1; let x;');
2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('x += 1; let x;');
2273ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('++x; let x;');
2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('x++; let x;');
2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestAll('let y = x; const x = 1;');
2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
23269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction f(x, b) {
23369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  let y = (b ? y : x) + 42;
23469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return y;
23569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
23669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
23769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction g(x, b) {
23869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  {
23969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    let y = (b ? y : x) + 42;
24069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return y;
24169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
24269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
24369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
24469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfor (var i=0; i<10; i++) {
24569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  f(i, false);
24669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  g(i, false);
24769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
24869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
24969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch%OptimizeFunctionOnNextCall(f);
25069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch%OptimizeFunctionOnNextCall(g);
25169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
25269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochtry {
25369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  f(42, true);
25469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} catch (e) {
25569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  assertInstanceof(e, ReferenceError);
25669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
25769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
25869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochtry {
25969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  g(42, true);
26069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} catch (e) {
26169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  assertInstanceof(e, ReferenceError);
26269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
263