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