blob: 56c1d7224df5f6b0763a8ecda64c485cead0e8da [file] [log] [blame]
Ben Murdoch3fb3ca82011-12-02 17:19:32 +00001// Copyright 2011 the V8 project authors. All rights reserved.
Steve Blocka7e24c12009-10-30 11:49:00 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28function argc0() {
29 return arguments.length;
30}
31
32function argc1(i) {
33 return arguments.length;
34}
35
36function argc2(i, j) {
37 return arguments.length;
38}
39
40assertEquals(0, argc0());
41assertEquals(1, argc0(1));
42assertEquals(2, argc0(1, 2));
43assertEquals(3, argc0(1, 2, 3));
44assertEquals(0, argc1());
45assertEquals(1, argc1(1));
46assertEquals(2, argc1(1, 2));
47assertEquals(3, argc1(1, 2, 3));
48assertEquals(0, argc2());
49assertEquals(1, argc2(1));
50assertEquals(2, argc2(1, 2));
51assertEquals(3, argc2(1, 2, 3));
52
Steve Blocka7e24c12009-10-30 11:49:00 +000053var index;
54
55function argv0() {
56 return arguments[index];
57}
58
59function argv1(i) {
60 return arguments[index];
61}
62
63function argv2(i, j) {
64 return arguments[index];
65}
66
67index = 0;
68assertEquals(7, argv0(7));
69assertEquals(7, argv0(7, 8));
70assertEquals(7, argv0(7, 8, 9));
71assertEquals(7, argv1(7));
72assertEquals(7, argv1(7, 8));
73assertEquals(7, argv1(7, 8, 9));
74assertEquals(7, argv2(7));
75assertEquals(7, argv2(7, 8));
76assertEquals(7, argv2(7, 8, 9));
77
78index = 1;
79assertEquals(8, argv0(7, 8));
80assertEquals(8, argv0(7, 8));
81assertEquals(8, argv1(7, 8, 9));
82assertEquals(8, argv1(7, 8, 9));
83assertEquals(8, argv2(7, 8, 9));
84assertEquals(8, argv2(7, 8, 9));
85
86index = 2;
87assertEquals(9, argv0(7, 8, 9));
88assertEquals(9, argv1(7, 8, 9));
89assertEquals(9, argv2(7, 8, 9));
90
91
92// Test that calling a lazily compiled function with
93// an unexpected number of arguments works.
94function f(a) { return arguments.length; };
95assertEquals(3, f(1, 2, 3));
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000096
97function f1(x, y) {
98 function g(a) {
99 a[0] = "three";
100 return a.length;
101 }
102 var l = g(arguments);
103 y = 5;
104 assertEquals(2, l);
105 assertEquals("three", x);
106 assertEquals(5, y);
107}
108f1(3, "five");
109
110
111function f2() {
112 if (arguments[0] > 0) {
113 return arguments.callee(arguments[0] - 1) + arguments[0];
114 }
115 return 0;
116}
117assertEquals(55, f2(10));
118
119
120function f3() {
121 assertEquals(0, arguments.length);
122}
123f3();
124
125
126function f4() {
127 var arguments = 0;
128 assertEquals(void 0, arguments.length);
129}
130f4();
131
132
133function f5(x, y, z) {
134 function g(a) {
135 x = "two";
136 y = "three";
137 a[1] = "drei";
138 a[2] = "fuenf";
139 };
140
141 g(arguments);
142 assertEquals("two", x);
143 assertEquals("drei", y);
144 assertEquals("fuenf", z);
145}
146f5(2, 3, 5);
147
148
149function f6(x, y) {
150 x = "x";
151 arguments[1] = "y";
152 return [arguments.length, arguments[0], y, arguments[2]];
153}
154
155assertArrayEquals([0, void 0, void 0, void 0], f6());
156assertArrayEquals([1, "x", void 0, void 0], f6(1));
157assertArrayEquals([2, "x", "y", void 0], f6(9, 17));
158assertArrayEquals([3, "x", "y", 7], f6(3, 5, 7));
159assertArrayEquals([4, "x", "y", "c"], f6("a", "b", "c", "d"));
160
161
162function list_args(a) {
163 assertEquals("function", typeof a.callee);
164 var result = [];
165 result.push(a.length);
166 for (i = 0; i < a.length; i++) result.push(a[i]);
167 return result;
168}
169
170
171function f1(x, y) {
172 function g(p) {
173 x = p;
174 }
175 g(y);
176 return list_args(arguments);
177}
178
179assertArrayEquals([0], f1());
180assertArrayEquals([1, void 0], f1(3));
181assertArrayEquals([2, 5, 5], f1(3, 5));
182assertArrayEquals([3, 5, 5, 7], f1(3, 5, 7));
183
184// Check out of bounds behavior.
185function arg_get(x) { return arguments[x]; }
186function arg_del(x) { return delete arguments[x]; }
187function arg_set(x) { return (arguments[x] = 117); }
188assertEquals(undefined, arg_get(0xFFFFFFFF));
189assertEquals(true, arg_del(0xFFFFFFFF));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000190assertEquals(117, arg_set(0xFFFFFFFF));