19ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 29ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// Redistribution and use in source and binary forms, with or without 39ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// modification, are permitted provided that the following conditions are 49ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// met: 59ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// 69ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// * Redistributions of source code must retain the above copyright 79ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// notice, this list of conditions and the following disclaimer. 89ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// * Redistributions in binary form must reproduce the above 99ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// copyright notice, this list of conditions and the following 109ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// disclaimer in the documentation and/or other materials provided 119ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// with the distribution. 129ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// * Neither the name of Google Inc. nor the names of its 139ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// contributors may be used to endorse or promote products derived 149ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// from this software without specific prior written permission. 159ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// 169ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org 2856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org// Flags: --allow-natives-syntax --max-opt-count=100 299ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org 30154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgfunction A() { 31154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org} 329ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org 33154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgA.prototype.X = function (a, b, c) { 34154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org assertTrue(this instanceof A); 35154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org assertEquals(1, a); 36154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org assertEquals(2, b); 37154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org assertEquals(3, c); 38154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org}; 39c54d36599f1e72bddd09d5b7a980304c7b638048ricow@chromium.org 40154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgA.prototype.Y = function () { 41154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org this.X.apply(this, arguments); 42154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org}; 43154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 44154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgA.prototype.Z = function () { 45154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org this.Y(1,2,3); 46154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org}; 47154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 48154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgvar a = new A(); 49154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orga.Z(4,5,6); 50154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orga.Z(4,5,6); 51154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org%OptimizeFunctionOnNextCall(a.Z); 52154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orga.Z(4,5,6); 53154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgA.prototype.X.apply = function (receiver, args) { 54154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org return Function.prototype.apply.call(this, receiver, args); 55154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org}; 56154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orga.Z(4,5,6); 573233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org 583233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org 593233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org// Ensure that HArgumentsObject is inserted in a correct place 603233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org// and dominates all uses. 613233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgfunction F1() { } 623233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgfunction F2() { F1.apply(this, arguments); } 633233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgfunction F3(x, y) { 643233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org if (x) { 653233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org F2(y); 663233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org } 673233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org} 683233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org 693233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgfunction F31() { 703233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org return F1.apply(this, arguments); 713233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org} 723233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org 733233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgfunction F4() { 743233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org F3(true, false); 753233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org return F31(1); 763233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org} 773233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org 783233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgF4(1); 793233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgF4(1); 803233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgF4(1); 813233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org%OptimizeFunctionOnNextCall(F4); 823233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgF4(1); 836ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 846ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 856ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org// Test correct adapation of arguments. 866ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org// Strict mode prevents arguments object from shadowing parameters. 876ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org(function () { 886ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org "use strict"; 896ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 906ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org function G2() { 916ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org assertArrayEquals([1,2], arguments); 926ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 936ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 946ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org function G4() { 956ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org assertArrayEquals([1,2,3,4], arguments); 966ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 976ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 986ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org function adapt2to4(a, b, c, d) { 996ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org G2.apply(this, arguments); 1006ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 1016ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 1026ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org function adapt4to2(a, b) { 1036ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org G4.apply(this, arguments); 1046ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 1056ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 1066ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org function test_adaptation() { 1076ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org adapt2to4(1, 2); 1086ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org adapt4to2(1, 2, 3, 4); 1096ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 1106ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 1116ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org test_adaptation(); 1126ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org test_adaptation(); 1136ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org %OptimizeFunctionOnNextCall(test_adaptation); 1146ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org test_adaptation(); 1156ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org})(); 11628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 11728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// Test arguments access from the inlined function. 118ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org%NeverOptimizeFunction(uninlinable); 11928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgfunction uninlinable(v) { 12028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org assertEquals(0, v); 12128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return 0; 12228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} 12328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 12428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgfunction toarr_inner() { 12528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org var a = arguments; 12628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org var marker = a[0]; 12728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org uninlinable(uninlinable(0, 0), marker.x); 12828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 12928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org var r = new Array(); 13028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org for (var i = a.length - 1; i >= 1; i--) { 13128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org r.push(a[i]); 13228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 13328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 13428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return r; 13528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} 13628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 13728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgfunction toarr1(marker, a, b, c) { 13828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return toarr_inner(marker, a / 2, b / 2, c / 2); 13928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} 14028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 14128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgfunction toarr2(marker, a, b, c) { 14228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org var x = 0; 14328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return uninlinable(uninlinable(0, 0), 14428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org x = toarr_inner(marker, a / 2, b / 2, c / 2)), x; 14528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} 14628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 14728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgfunction test_toarr(toarr) { 14828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org var marker = { x: 0 }; 14928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org assertArrayEquals([3, 2, 1], toarr(marker, 2, 4, 6)); 15028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org assertArrayEquals([3, 2, 1], toarr(marker, 2, 4, 6)); 15128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org %OptimizeFunctionOnNextCall(toarr); 15228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org assertArrayEquals([3, 2, 1], toarr(marker, 2, 4, 6)); 15328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org delete marker.x; 15428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org assertArrayEquals([3, 2, 1], toarr(marker, 2, 4, 6)); 15528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org} 15628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 15728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgtest_toarr(toarr1); 15828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgtest_toarr(toarr2); 15928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 16056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 16128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// Test that arguments access from inlined function uses correct values. 162355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org(function () { 163355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org function inner(x, y) { 164355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org "use strict"; 165355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org x = 10; 166355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org y = 20; 167355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org for (var i = 0; i < 1; i++) { 168355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org for (var j = 1; j <= arguments.length; j++) { 169355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org return arguments[arguments.length - j]; 170355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } 171355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } 172355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } 173355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 174355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org function outer(x, y) { 175355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org return inner(x, y); 176355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org } 177355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 178355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org %OptimizeFunctionOnNextCall(outer); 179355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org %OptimizeFunctionOnNextCall(inner); 180355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org assertEquals(2, outer(1, 2)); 181355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org})(); 182355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 183355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 18428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org(function () { 18528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org function inner(x, y) { 18628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org "use strict"; 18728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org x = 10; 18828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org y = 20; 18928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org for (var i = 0; i < 1; i++) { 19028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org for (var j = 1; j <= arguments.length; j++) { 19128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return arguments[arguments.length - j]; 19228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 19328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 19428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 19528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 19628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org function outer(x, y) { 19728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return inner(x, y); 19828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 19928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 20028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org assertEquals(2, outer(1, 2)); 20128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org assertEquals(2, outer(1, 2)); 20228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org assertEquals(2, outer(1, 2)); 20328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org %OptimizeFunctionOnNextCall(outer); 20428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org assertEquals(2, outer(1, 2)); 20528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org})(); 20656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 20756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 20856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org// Test inlining and deoptimization of functions accessing and modifying 20956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org// the arguments object in strict mode with mismatched arguments count. 21056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org(function () { 21156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org "use strict"; 21256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org function test(outerCount, middleCount, innerCount) { 21356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org var forceDeopt = { deopt:false }; 21456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org function inner(x,y) { 21556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org x = 0; y = 0; 21656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org forceDeopt.deopt; 21756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org assertSame(innerCount, arguments.length); 21856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org for (var i = 0; i < arguments.length; i++) { 21956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org assertSame(30 + i, arguments[i]); 22056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 22156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 22256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 22356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org function middle(x,y) { 22456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org x = 0; y = 0; 22556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (innerCount == 1) inner(30); 22656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (innerCount == 2) inner(30, 31); 22756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (innerCount == 3) inner(30, 31, 32); 22856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org assertSame(middleCount, arguments.length); 22956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org for (var i = 0; i < arguments.length; i++) { 23056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org assertSame(20 + i, arguments[i]); 23156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 23256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 23356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 23456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org function outer(x,y) { 23556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org x = 0; y = 0; 23656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (middleCount == 1) middle(20); 23756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (middleCount == 2) middle(20, 21); 23856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (middleCount == 3) middle(20, 21, 22); 23956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org assertSame(outerCount, arguments.length); 24056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org for (var i = 0; i < arguments.length; i++) { 24156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org assertSame(10 + i, arguments[i]); 24256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 24356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 24456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 24556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org for (var step = 0; step < 4; step++) { 24656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (outerCount == 1) outer(10); 24756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (outerCount == 2) outer(10, 11); 24856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (outerCount == 3) outer(10, 11, 12); 24956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (step == 1) %OptimizeFunctionOnNextCall(outer); 25056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (step == 2) delete forceDeopt.deopt; 25156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 25256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 25356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org %DeoptimizeFunction(outer); 25456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org %DeoptimizeFunction(middle); 25556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org %DeoptimizeFunction(inner); 25656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org %ClearFunctionTypeFeedback(outer); 25756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org %ClearFunctionTypeFeedback(middle); 25856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org %ClearFunctionTypeFeedback(inner); 25956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 26056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 26156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org for (var a = 1; a <= 3; a++) { 26256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org for (var b = 1; b <= 3; b++) { 26356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org for (var c = 1; c <= 3; c++) { 26456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org test(a,b,c); 26556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 26656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 26756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 26856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org})(); 269b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 270b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 271b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org// Test materialization of arguments object with values in registers. 272b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org(function () { 273b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org "use strict"; 274b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org var forceDeopt = { deopt:false }; 275b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org function inner(a,b,c,d,e,f,g,h,i,j) { 276b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org var args = arguments; 277b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org forceDeopt.deopt; 278b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(10, args.length); 279b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(a, args[0]); 280b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(b, args[1]); 281b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(c, args[2]); 282b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(d, args[3]); 283b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(e, args[4]); 284b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(f, args[5]); 285b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(g, args[6]); 286b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(h, args[7]); 287b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(i, args[8]); 288b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org assertSame(j, args[9]); 289b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org } 290b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 291b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org var a = 0.5; 292b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org var b = 1.7; 293b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org var c = 123; 294b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org function outer() { 295b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org inner( 296b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org a - 0.3, // double in double register 297b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org b + 2.3, // integer in double register 298b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org c + 321, // integer in general register 299b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org c - 456, // integer in stack slot 300b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org a + 0.1, a + 0.2, a + 0.3, a + 0.4, a + 0.5, 301b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org a + 0.6 // double in stack slot 302b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org ); 303b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org } 304b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 305b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org outer(); 306b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org outer(); 307b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org %OptimizeFunctionOnNextCall(outer); 308b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org outer(); 309b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org delete forceDeopt.deopt; 310b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org outer(); 311b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org})(); 312248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 313248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 314248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org// Test inlining of functions with %_Arguments and %_ArgumentsLength intrinsic. 315248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org(function () { 316248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org function inner(len,a,b,c) { 317248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org assertSame(len, %_ArgumentsLength()); 318248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org for (var i = 1; i < len; ++i) { 319248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org var c = String.fromCharCode(96 + i); 320248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org assertSame(c, %_Arguments(i)); 321248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org } 322248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org } 323248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 324248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org function outer() { 325248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org inner(1); 326248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org inner(2, 'a'); 327248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org inner(3, 'a', 'b'); 328248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org inner(4, 'a', 'b', 'c'); 329248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org inner(5, 'a', 'b', 'c', 'd'); 330248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org inner(6, 'a', 'b', 'c', 'd', 'e'); 331248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org } 332248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 333248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org outer(); 334248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org outer(); 335248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org %OptimizeFunctionOnNextCall(outer); 336248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org outer(); 337248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org})(); 338