17b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met:
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions of source code must retain the above copyright
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       notice, this list of conditions and the following disclaimer.
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions in binary form must reproduce the above
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       copyright notice, this list of conditions and the following
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       disclaimer in the documentation and/or other materials provided
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       with the distribution.
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Neither the name of Google Inc. nor the names of its
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       contributors may be used to endorse or promote products derived
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       from this software without specific prior written permission.
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction argc0() {
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return arguments.length;
309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction argc1(i) {
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return arguments.length;
349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction argc2(i, j) {
379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return arguments.length;
389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(0, argc0());
419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(1, argc0(1));
429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(2, argc0(1, 2));
439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(3, argc0(1, 2, 3));
449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(0, argc1());
459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(1, argc1(1));
469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(2, argc1(1, 2));
479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(3, argc1(1, 2, 3));
489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(0, argc2());
499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(1, argc2(1));
509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(2, argc2(1, 2));
519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(3, argc2(1, 2, 3));
529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvar index;
549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction argv0() {
569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return arguments[index];
579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction argv1(i) {
609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return arguments[index];
619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction argv2(i, j) {
649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return arguments[index];
659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comindex = 0;
689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(7, argv0(7));
699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(7, argv0(7, 8));
709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(7, argv0(7, 8, 9));
719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(7, argv1(7));
729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(7, argv1(7, 8));
739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(7, argv1(7, 8, 9));
749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(7, argv2(7));
759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(7, argv2(7, 8));
769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(7, argv2(7, 8, 9));
779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comindex = 1;
799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(8, argv0(7, 8));
809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(8, argv0(7, 8));
819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(8, argv1(7, 8, 9));
829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(8, argv1(7, 8, 9));
839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(8, argv2(7, 8, 9));
849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(8, argv2(7, 8, 9));
859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comindex = 2;
879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(9, argv0(7, 8, 9));
889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(9, argv1(7, 8, 9));
899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(9, argv2(7, 8, 9));
909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that calling a lazily compiled function with
939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// an unexpected number of arguments works.
949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction f(a) { return arguments.length; };
959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(3, f(1, 2, 3));
967b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
977b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgfunction f1(x, y) {
987b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  function g(a) {
997b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    a[0] = "three";
1007b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    return a.length;
1017b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  }
1027b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  var l = g(arguments);
1037b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  y = 5;
1047b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  assertEquals(2, l);
1057b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  assertEquals("three", x);
1067b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  assertEquals(5, y);
1077b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org}
1087b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgf1(3, "five");
1097b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1107b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1117b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgfunction f2() {
1127b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  if (arguments[0] > 0) {
1137b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    return arguments.callee(arguments[0] - 1) + arguments[0];
1147b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  }
1157b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  return 0;
1167b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org}
1177b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgassertEquals(55, f2(10));
1187b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1197b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1207b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgfunction f3() {
1217b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  assertEquals(0, arguments.length);
1227b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org}
1237b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgf3();
1247b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1257b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1267b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgfunction f4() {
1277b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  var arguments = 0;
1287b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  assertEquals(void 0, arguments.length);
1297b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org}
1307b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgf4();
1317b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1327b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1337b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgfunction f5(x, y, z) {
1347b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  function g(a) {
1357b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    x = "two";
1367b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    y = "three";
1377b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    a[1] = "drei";
1387b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    a[2] = "fuenf";
1397b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  };
1407b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1417b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  g(arguments);
1427b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  assertEquals("two", x);
1437b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  assertEquals("drei", y);
1447b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  assertEquals("fuenf", z);
1457b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org}
1467b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgf5(2, 3, 5);
1477b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1487b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1497b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgfunction f6(x, y) {
1507b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  x = "x";
1517b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  arguments[1] = "y";
1527b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  return [arguments.length, arguments[0], y, arguments[2]];
1537b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org}
1547b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1557b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgassertArrayEquals([0, void 0, void 0, void 0], f6());
1567b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgassertArrayEquals([1, "x", void 0, void 0], f6(1));
1577b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgassertArrayEquals([2, "x", "y", void 0], f6(9, 17));
1587b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgassertArrayEquals([3, "x", "y", 7], f6(3, 5, 7));
1597b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgassertArrayEquals([4, "x", "y", "c"], f6("a", "b", "c", "d"));
1607b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1617b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1627b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgfunction list_args(a) {
1637b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  assertEquals("function", typeof a.callee);
1647b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  var result = [];
1657b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  result.push(a.length);
1667b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  for (i = 0; i < a.length; i++) result.push(a[i]);
1677b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  return result;
1687b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org}
1697b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1707b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1717b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgfunction f1(x, y) {
1727b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  function g(p) {
1737b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    x = p;
1747b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  }
1757b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  g(y);
1767b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  return list_args(arguments);
1777b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org}
1787b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
1797b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgassertArrayEquals([0], f1());
1807b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgassertArrayEquals([1, void 0], f1(3));
1817b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgassertArrayEquals([2, 5, 5], f1(3, 5));
1827b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgassertArrayEquals([3, 5, 5, 7], f1(3, 5, 7));
183df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.org
184df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.org// Check out of bounds behavior.
185df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.orgfunction arg_get(x) { return arguments[x]; }
186df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.orgfunction arg_del(x) { return delete arguments[x]; }
187df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.orgfunction arg_set(x) { return (arguments[x] = 117); }
188df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.orgassertEquals(undefined, arg_get(0xFFFFFFFF));
189df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.orgassertEquals(true, arg_del(0xFFFFFFFF));
190f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgassertEquals(117, arg_set(0xFFFFFFFF));
191