16ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 26ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// Redistribution and use in source and binary forms, with or without 36ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// modification, are permitted provided that the following conditions are 46ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// met: 56ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// 66ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// * Redistributions of source code must retain the above copyright 76ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// notice, this list of conditions and the following disclaimer. 86ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// * Redistributions in binary form must reproduce the above 96ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// copyright notice, this list of conditions and the following 106ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// disclaimer in the documentation and/or other materials provided 116ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// with the distribution. 126ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// * Neither the name of Google Inc. nor the names of its 136ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// contributors may be used to endorse or promote products derived 146ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// from this software without specific prior written permission. 156ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// 166ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org 286ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// Flags: --allow-natives-syntax 296ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org 306ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// Test inlining and deoptimization of function.apply(this, arguments) 316ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org// calls for which the exact number of arguments is known. 326ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org(function () { 336ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org "use strict"; 346ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org function test(argumentsCount) { 356ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org var dispatcher = {}; 366ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org var deoptimize = { deopt:false }; 376ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org dispatcher["const" + argumentsCount] = 0; 386ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org dispatcher.func = C; 396ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org 406ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org function A(x,y) { 416ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org var r = "A"; 426ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org if (argumentsCount == 1) r += B(10); 436ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org if (argumentsCount == 2) r += B(10, 11); 446ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org if (argumentsCount == 3) r += B(10, 11, 12); 456ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org assertSame(1, x); 466ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org assertSame(2, y); 476ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org return r; 486ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org } 496ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org 506ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org function B(x,y) { 51c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org x = 0; y = 0; 526ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org var r = "B" + dispatcher.func.apply(this, arguments); 536ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org assertSame(argumentsCount, arguments.length); 546ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org for (var i = 0; i < arguments.length; i++) { 556ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org assertSame(10 + i, arguments[i]); 566ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org } 576ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org return r; 586ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org } 596ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org 606ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org function C(x,y) { 616ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org x = 0; y = 0; 626ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org var r = "C" 636ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org deoptimize.deopt; 646ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org assertSame(argumentsCount, arguments.length); 656ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org for (var i = 0; i < arguments.length; i++) { 666ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org assertSame(10 + i, arguments[i]); 676ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org } 686ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org return r; 696ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org } 706ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org 716ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org assertEquals("ABC", A(1,2)); 726ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org assertEquals("ABC", A(1,2)); 736ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org %OptimizeFunctionOnNextCall(A); 746ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org assertEquals("ABC", A(1,2)); 756ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org delete deoptimize.deopt; 766ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org assertEquals("ABC", A(1,2)); 776ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org 786ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org %DeoptimizeFunction(A); 796ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org %ClearFunctionTypeFeedback(A); 806ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org %DeoptimizeFunction(B); 816ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org %ClearFunctionTypeFeedback(B); 826ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org %DeoptimizeFunction(C); 836ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org %ClearFunctionTypeFeedback(C); 846ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org } 856ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org 866ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org for (var a = 1; a <= 3; a++) { 876ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org test(a); 886ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org } 896ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org})(); 90