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