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