157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Redistribution and use in source and binary forms, with or without
357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// modification, are permitted provided that the following conditions are
457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// met:
557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//
657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//     * Redistributions of source code must retain the above copyright
757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//       notice, this list of conditions and the following disclaimer.
857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//     * Redistributions in binary form must reproduce the above
957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//       copyright notice, this list of conditions and the following
1057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//       disclaimer in the documentation and/or other materials provided
1157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//       with the distribution.
1257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//     * Neither the name of Google Inc. nor the names of its
1357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//       contributors may be used to endorse or promote products derived
1457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//       from this software without specific prior written permission.
1557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org//
1657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
2857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Flags: --allow-natives-syntax --use-escape-analysis --expose-gc
2957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
3057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
3157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Simple test of capture
3257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org(function testCapturedArguments() {
3357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function h() {
3457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return g.arguments[0];
3557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
3657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
3757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function g(x) {
3857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return h();
3957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
4057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
4157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function f() {
4257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var l = { y : { z : 4 }, x : 2 }
4357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var r = g(l);
4457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(2, r.x);
4557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(2, l.x);
4657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    l.x = 3;
4757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    l.y.z = 5;
4857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    // Test that the arguments object is properly
4957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    // aliased
5057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, r.x);
5157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, l.x);
5257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(5, r.y.z);
5357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
5457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
5557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f(); f();
5657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  %OptimizeFunctionOnNextCall(f);
5757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f();
5857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org})();
5957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
6057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
6157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Get the arguments object twice, test aliasing
6257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org(function testTwoCapturedArguments() {
6357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function h() {
6457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return g.arguments[0];
6557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
6657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
6757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function i() {
6857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return g.arguments[0];
6957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
7057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
7157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function g(x) {
7257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return {h : h() , i : i()};
7357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
7457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
7557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function f() {
7657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var l = { y : { z : 4 }, x : 2 }
7757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var r = g(l);
7857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(2, r.h.x)
7957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    l.y.z = 3;
8057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, r.h.y.z);
8157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, r.i.y.z);
8257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
8357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
8457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f(); f();
8557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  %OptimizeFunctionOnNextCall(f);
8657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f();
8757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org})();
8857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
8957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
9057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Nested arguments object test
9157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org(function testTwoCapturedArgumentsNested() {
9257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function i() {
9357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return { gx : g.arguments[0], hx : h.arguments[0] };
9457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
9557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
9657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function h(x) {
9757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return i();
9857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
9957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
10057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function g(x) {
10157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return h(x.y);
10257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
10357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
10457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function f() {
10557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var l = { y : { z : 4 }, x : 2 }
10657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var r = g(l);
10757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(2, r.gx.x)
10857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(4, r.gx.y.z)
10957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(4, r.hx.z)
11057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    l.y.z = 3;
11157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, r.gx.y.z)
11257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, r.hx.z)
11357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, l.y.z)
11457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
11557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
11657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f(); f();
11757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  %OptimizeFunctionOnNextCall(f);
11857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f();
11957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  %OptimizeFunctionOnNextCall(f);
12057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f();
12157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org})();
12257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
12357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
12457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Nested arguments object test with different inlining
12557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org(function testTwoCapturedArgumentsNested2() {
12657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function i() {
12757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return { gx : g.arguments[0], hx : h.arguments[0] };
12857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
12957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
13057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function h(x) {
13157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return i();
13257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
13357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
13457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function g(x) {
13557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return h(x.y);
13657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
13757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
13857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function f() {
13957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var l = { y : { z : 4 }, x : 2 }
14057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var r = g(l);
14157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(2, r.gx.x)
14257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(4, r.gx.y.z)
14357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(4, r.hx.z)
14457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    l.y.z = 3;
14557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, r.gx.y.z)
14657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, r.hx.z)
14757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, l.y.z)
14857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
14957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
15057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  %NeverOptimizeFunction(i);
15157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f(); f();
15257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  %OptimizeFunctionOnNextCall(f);
15357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f();
15457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  %OptimizeFunctionOnNextCall(f);
15557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f();
15657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org})();
15757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
15857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
15957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Multiple captured argument test
16057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org(function testTwoArgumentsCapture() {
16157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function h() {
16257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return { a : g.arguments[1], b : g.arguments[0] };
16357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
16457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
16557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function g(x, y) {
16657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return h();
16757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
16857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
16957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  function f() {
17057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var l = { y : { z : 4 }, x : 2 }
17157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var k = { t : { u : 3 } };
17257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    var r = g(k, l);
17357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(2, r.a.x)
17457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(4, r.a.y.z)
17557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(3, r.b.t.u)
17657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    l.y.z = 6;
17757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    r.b.t.u = 7;
17857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(6, r.a.y.z)
17957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    assertEquals(7, k.t.u)
18057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
18157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
18257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f(); f();
18357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  %OptimizeFunctionOnNextCall(f);
18457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f();
18557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  %OptimizeFunctionOnNextCall(f);
18657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  f(); f();
18757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org})();
188