1594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 2594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Redistribution and use in source and binary forms, with or without 3594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// modification, are permitted provided that the following conditions are 4594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// met: 5594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// 6594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// * Redistributions of source code must retain the above copyright 7594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// notice, this list of conditions and the following disclaimer. 8594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// * Redistributions in binary form must reproduce the above 9594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// copyright notice, this list of conditions and the following 10594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// disclaimer in the documentation and/or other materials provided 11594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// with the distribution. 12594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// * Neither the name of Google Inc. nor the names of its 13594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// contributors may be used to endorse or promote products derived 14594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// from this software without specific prior written permission. 15594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// 16594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 28639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org// Flags: --allow-natives-syntax --use-escape-analysis --expose-gc 29594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 30594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 31594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Test stores on a join path. 32594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org(function testJoin() { 33594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function constructor() { 34594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.a = 0; 35594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 36594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function join(mode, expected) { 37594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var object = new constructor(); 38594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (mode) { 39594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org object.a = 1; 40594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } else { 41594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org object.a = 2; 42594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 43594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(expected, object.a); 44594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 45594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org join(true, 1); join(true, 1); 46594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org join(false, 2); join(false, 2); 47594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org %OptimizeFunctionOnNextCall(join); 48594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org join(true, 1); join(false, 2); 49594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org})(); 50594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 51594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 52594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Test loads and stores inside a loop. 53594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org(function testLoop() { 54594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function constructor() { 55594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.a = 0; 56594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.b = 23; 57594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 58594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function loop() { 59594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var object = new constructor(); 60594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org for (var i = 1; i < 10; i++) { 61594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org object.a = object.a + i; 62594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(i*(i+1)/2, object.a); 63594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(23, object.b); 64594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 65594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(45, object.a); 66594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(23, object.b); 67594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 68594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org loop(); loop(); 69594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org %OptimizeFunctionOnNextCall(loop); 70594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org loop(); loop(); 71594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org})(); 72594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 73594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 74594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Test loads and stores inside nested loop. 75594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org(function testNested() { 76594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function constructor() { 77594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.a = 0; 78594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.b = 0; 79594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.c = 23; 80594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 81594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function nested() { 82594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var object = new constructor(); 83594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org for (var i = 1; i < 10; i++) { 84594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org object.a = object.a + i; 85594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(i*(i+1)/2, object.a); 86594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals((i-1)*6, object.b); 87594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(23, object.c); 88594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org for (var j = 1; j < 4; j++) { 89594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org object.b = object.b + j; 90594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(i*(i+1)/2, object.a); 91594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals((i-1)*6+j*(j+1)/2, object.b); 92594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(23, object.c); 93594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 94594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(i*(i+1)/2, object.a); 95594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(i*6, object.b); 96594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(23, object.c); 97594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 98594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(45, object.a); 99594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(54, object.b); 100594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(23, object.c); 101594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 102594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org nested(); nested(); 103594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org %OptimizeFunctionOnNextCall(nested); 104594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org nested(); nested(); 105594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org})(); 106594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 107594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 108594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Test deoptimization with captured objects in local variables. 109594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org(function testDeoptLocal() { 110594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var deopt = { deopt:false }; 111594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function constructor1() { 112594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.a = 1.0; 113594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.b = 2.3; 114594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.c = 3.0; 115594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 116594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function constructor2(o) { 117594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.d = o; 118594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org this.e = 4.5; 119594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 120594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function func() { 121594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var o1 = new constructor1(); 122594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var o2 = new constructor2(o1); 123594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org deopt.deopt; 124594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(1.0, o1.a); 125594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(2.3, o2.d.b); 126594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(3.0, o2.d.c); 127594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(4.5, o2.e); 128594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 129594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org func(); func(); 130594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org %OptimizeFunctionOnNextCall(func); 131594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org func(); func(); 132594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org delete deopt.deopt; 133594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org func(); func(); 134594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org})(); 1351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Test deoptimization with captured objects on operand stack. 1381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org(function testDeoptOperand() { 1391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org var deopt = { deopt:false }; 1401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org function constructor1() { 1411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org this.a = 1.0; 1421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org this.b = 2.3; 1431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org deopt.deopt; 1441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(1.0, this.a); 1451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(2.3, this.b); 1461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org this.b = 2.7; 1471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org this.c = 3.0; 1481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org this.d = 4.5; 1491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org function constructor2() { 1511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org this.e = 5.0; 1521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org this.f = new constructor1(); 1531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(1.0, this.f.a); 1541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(2.7, this.f.b); 1551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(3.0, this.f.c); 1561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(4.5, this.f.d); 1571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(5.0, this.e); 1581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org this.e = 5.9; 1591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org this.g = 6.7; 1601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org function func() { 1621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org var o = new constructor2(); 1631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(1.0, o.f.a); 1641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(2.7, o.f.b); 1651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(3.0, o.f.c); 1661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(4.5, o.f.d); 1671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(5.9, o.e); 1681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org assertEquals(6.7, o.g); 1691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 1701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org func(); func(); 1711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org %OptimizeFunctionOnNextCall(func); 1721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org func(); func(); 1731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org delete deopt.deopt; 1741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org func(); func(); 1751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org})(); 1761f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org 1771f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org 1781f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org// Test map checks on captured objects. 1791f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org(function testMapCheck() { 1801f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org var sum = 0; 1811f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org function getter() { return 27; } 1821f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org function setter(v) { sum += v; } 1831f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org function constructor() { 1841f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org this.x = 23; 1851f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org this.y = 42; 1861f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org } 1871f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org function check(x, y) { 1881f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org var o = new constructor(); 1891f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org assertEquals(x, o.x); 1901f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org assertEquals(y, o.y); 1911f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org } 1921f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org var monkey = Object.create(null, { 1931f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org x: { get:getter, set:setter }, 1941f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org y: { get:getter, set:setter } 1951f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org }); 1961f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org check(23, 42); check(23, 42); 1971f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org %OptimizeFunctionOnNextCall(check); 1981f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org check(23, 42); check(23, 42); 1991f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org constructor.prototype = monkey; 2001f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org check(27, 27); check(27, 27); 2011f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org assertEquals(130, sum); 2021f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org})(); 203e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org 204e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org 205e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org// Test OSR into a loop with captured objects. 206e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org(function testOSR() { 207e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org function constructor() { 208e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org this.a = 23; 209e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org } 210e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org function osr1(length) { 211e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org assertEquals(23, (new constructor()).a); 212e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org var result = 0; 213e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org for (var i = 0; i < length; i++) { 214e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org result = (result + i) % 99; 215e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org } 216e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org return result; 217e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org } 218e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org function osr2(length) { 219e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org var result = 0; 220e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org for (var i = 0; i < length; i++) { 221e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org result = (result + i) % 99; 222e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org } 223e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org assertEquals(23, (new constructor()).a); 224e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org return result; 225e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org } 226e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org function osr3(length) { 227e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org var result = 0; 228e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org var o = new constructor(); 229e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org for (var i = 0; i < length; i++) { 230e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org result = (result + i) % 99; 231e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org } 232e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org assertEquals(23, o.a); 233e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org return result; 234e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org } 235e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org function test(closure) { 236e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org assertEquals(45, closure(10)); 237e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org assertEquals(45, closure(10)); 238e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org assertEquals(10, closure(50000)); 239e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org } 240e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org test(osr1); 241e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org test(osr2); 242e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org test(osr3); 243e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org})(); 244639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org 245639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org 246639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org// Test out-of-bounds access on captured objects. 247639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org(function testOOB() { 248639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org function cons1() { 249639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org this.x = 1; 250639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org this.y = 2; 251639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org this.z = 3; 252639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 253639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org function cons2() { 254639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org this.a = 7; 255639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 256639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org function oob(constructor, branch) { 257639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org var o = new constructor(); 258639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org if (branch) { 259639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org return o.a; 260639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } else { 261639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org return o.z; 262639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 263639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 264639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org assertEquals(3, oob(cons1, false)); 265639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org assertEquals(3, oob(cons1, false)); 266639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org assertEquals(7, oob(cons2, true)); 267639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org assertEquals(7, oob(cons2, true)); 268639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org gc(); // Clears type feedback of constructor call. 269639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org assertEquals(7, oob(cons2, true)); 270639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org assertEquals(7, oob(cons2, true)); 271639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org %OptimizeFunctionOnNextCall(oob); 272639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org assertEquals(7, oob(cons2, true)); 273639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org})(); 274cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org 275cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org 276cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org// Test non-shallow nested graph of captured objects. 277cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org(function testDeep() { 278cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org var deopt = { deopt:false }; 279cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org function constructor1() { 280cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org this.x = 23; 281cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 282cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org function constructor2(nested) { 283cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org this.a = 17; 284cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org this.b = nested; 285cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org this.c = 42; 286cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 287cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org function deep() { 288cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org var o1 = new constructor1(); 289cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org var o2 = new constructor2(o1); 290cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org assertEquals(17, o2.a); 291cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org assertEquals(23, o2.b.x); 292cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org assertEquals(42, o2.c); 293cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org o1.x = 99; 294cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org deopt.deopt; 295cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org assertEquals(99, o1.x); 296cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org assertEquals(99, o2.b.x); 297cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org } 298cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org deep(); deep(); 299cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org %OptimizeFunctionOnNextCall(deep); 300cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org deep(); deep(); 301cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org delete deopt.deopt; 302cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org deep(); deep(); 303cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org})(); 304db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org 305db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org 3069cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org// Test non-shallow nested graph of captured objects with duplicates 3079cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org(function testDeepDuplicate() { 3089cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org function constructor1() { 3099cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org this.x = 23; 3109cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org } 3119cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org function constructor2(nested) { 3129cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org this.a = 17; 3139cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org this.b = nested; 3149cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org this.c = 42; 3159cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org } 3169cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org function deep(shouldDeopt) { 3179cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var o1 = new constructor1(); 3189cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var o2 = new constructor2(o1); 3199cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var o3 = new constructor2(o1); 3209cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(17, o2.a); 3219cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(23, o2.b.x); 3229cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(42, o2.c); 3239cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org o3.c = 54; 3249cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org o1.x = 99; 3259cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org if (shouldDeopt) %DeoptimizeFunction(deep); 3269cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(99, o1.x); 3279cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(99, o2.b.x); 3289cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(99, o3.b.x); 3299cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(54, o3.c); 3309cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(17, o3.a); 3319cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(42, o2.c); 3329cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(17, o2.a); 3339cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org o3.b.x = 1; 3349cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(1, o1.x); 3359cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org } 3369cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org deep(false); deep(false); 3379cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org %OptimizeFunctionOnNextCall(deep); 3389cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org deep(false); deep(false); 3399cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org deep(true); deep(true); 3409cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org})(); 3419cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3429cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3439cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org// Test non-shallow nested graph of captured objects with inline 3449cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org(function testDeepInline() { 3459cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org function h() { 3469cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org return { y : 3 }; 3479cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org } 3489cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3499cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org function g(x) { 3509cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var u = { x : h() }; 3519cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org %DeoptimizeFunction(f); 3529cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org return u; 3539cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org } 3549cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3559cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org function f() { 3569cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var l = { dummy : { } }; 3579cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var r = g(l); 3589cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(3, r.x.y); 3599cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org } 3609cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3619cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org f(); f(); f(); 3629cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org %OptimizeFunctionOnNextCall(f); 3639cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org f(); 3649cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org})(); 3659cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3669cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3679cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org// Test two nested objects 3689cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org(function testTwoNestedObjects() { 3699cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org function f() { 3709cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var l = { x : { y : 111 } }; 3719cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var l2 = { x : { y : 111 } }; 3729cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org %DeoptimizeFunction(f); 3739cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(111, l.x.y); 3749cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(111, l2.x.y); 3759cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org } 3769cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3779cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org f(); f(); f(); 3789cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org %OptimizeFunctionOnNextCall(f); 3799cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org f(); 3809cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org})(); 3819cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3829cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3839cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org// Test a nested object and a duplicate 3849cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org(function testTwoObjectsWithDuplicate() { 3859cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org function f() { 3869cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var l = { x : { y : 111 } }; 3879cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var dummy = { d : 0 }; 3889cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org var l2 = l.x; 3899cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org %DeoptimizeFunction(f); 3909cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(111, l.x.y); 3919cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(111, l2.y); 3929cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org assertEquals(0, dummy.d); 3939cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org } 3949cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 3959cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org f(); f(); f(); 3969cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org %OptimizeFunctionOnNextCall(f); 3979cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org f(); 3989cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org})(); 3999cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 4009cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org 401db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org// Test materialization of a field that requires a Smi value. 402db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org(function testSmiField() { 403db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org var deopt = { deopt:false }; 404db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org function constructor() { 405db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org this.x = 1; 406db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org } 407db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org function field(x) { 408db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org var o = new constructor(); 409db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org o.x = x; 410db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org deopt.deopt 411db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org assertEquals(x, o.x); 412db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org } 413db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org field(1); field(2); 414db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org %OptimizeFunctionOnNextCall(field); 415db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org field(3); field(4); 416db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org delete deopt.deopt; 417db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org field(5.5); field(6.5); 418db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org})(); 419db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org 420db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org 421db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org// Test materialization of a field that requires a heap object value. 422db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org(function testHeapObjectField() { 423db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org var deopt = { deopt:false }; 424db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org function constructor() { 425db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org this.x = {}; 426db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org } 427db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org function field(x) { 428db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org var o = new constructor(); 429db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org o.x = x; 430db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org deopt.deopt 431db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org assertEquals(x, o.x); 432db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org } 433db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org field({}); field({}); 434db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org %OptimizeFunctionOnNextCall(field); 435db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org field({}); field({}); 436db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org delete deopt.deopt; 437db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org field(1); field(2); 438db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org})(); 439