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