1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
4 * Any copyright is dedicated to the Public Domain.
5 * http://creativecommons.org/licenses/publicdomain/
9 * In strict mode, it is a syntax error for an identifier to appear
10 * more than once in a function's argument list.
14 * The parameters of ordinary function definitions should not contain
15 * duplicate identifiers.
17 assertEq(testLenientAndStrict('function f(x,y) {}',
21 assertEq(testLenientAndStrict('function f(x,x) {}',
23 parseRaisesException(SyntaxError)),
25 assertEq(testLenientAndStrict('function f(x,y,z,y) {}',
27 parseRaisesException(SyntaxError)),
30 /* Exercise the hashed local name map case. */
31 assertEq(testLenientAndStrict('function f(a,b,c,d,e,f,g,h,d) {}',
33 parseRaisesException(SyntaxError)),
37 * SpiderMonkey has always treated duplicates in destructuring
38 * patterns as an error. Strict mode should not affect this.
40 assertEq(testLenientAndStrict('function f([x,y]) {}',
44 assertEq(testLenientAndStrict('function f([x,x]){}',
45 parseRaisesException(SyntaxError),
46 parseRaisesException(SyntaxError)),
48 assertEq(testLenientAndStrict('function f(x,[x]){}',
49 parseRaisesException(SyntaxError),
50 parseRaisesException(SyntaxError)),
54 * Strict rules apply to the parameters if the function's body is
57 assertEq(testLenientAndStrict('function f(x,x) { "use strict" };',
58 parseRaisesException(SyntaxError),
59 parseRaisesException(SyntaxError)),
63 * Calls to the function constructor should not be affected by the
64 * strictness of the calling code, but should be affected by the
65 * strictness of the function body.
67 assertEq(testLenientAndStrict('Function("x","x","")',
71 assertEq(testLenientAndStrict('Function("x","y","")',
75 assertEq(testLenientAndStrict('Function("x","x","\'use strict\'")',
76 raisesException(SyntaxError),
77 raisesException(SyntaxError)),
79 assertEq(testLenientAndStrict('Function("x","y","\'use strict\'")',
86 * The parameter lists of function expressions should not contain
87 * duplicate identifiers.
89 assertEq(testLenientAndStrict('(function (x,x) 2)',
91 parseRaisesException(SyntaxError)),
93 assertEq(testLenientAndStrict('(function (x,y) 2)',
99 * All permutations of:
100 * - For the two magic identifiers 'arguments' or 'eval'
101 * - For function definitions, function expressions, expression closures,
102 * and getter and setter property definitions,
103 * - For forms that inherit their context's strictness, and forms that
104 * include their own strictness directives,
105 * - For ordinary parameters, array destructuring parameters, and
106 * object destructuring parameters,
107 * - the magic identifiers may be used to name such parameters
108 * in lenient code, but not in strict code
109 * - the magic identifiers may be used as function names in lenient code,
110 * but not in strict code
112 assertEq(testLenientAndStrict('function f(eval){}',
114 parseRaisesException(SyntaxError)),
116 assertEq(testLenientAndStrict('function f([eval]){}',
118 parseRaisesException(SyntaxError)),
120 assertEq(testLenientAndStrict('function f({x:eval}){}',
122 parseRaisesException(SyntaxError)),
124 assertEq(testLenientAndStrict('function eval(){}',
126 parseRaisesException(SyntaxError)),
128 assertEq(testLenientAndStrict('function f(eval){"use strict";}',
129 parseRaisesException(SyntaxError),
130 parseRaisesException(SyntaxError)),
132 assertEq(testLenientAndStrict('function f([eval]){"use strict";}',
133 parseRaisesException(SyntaxError),
134 parseRaisesException(SyntaxError)),
136 assertEq(testLenientAndStrict('function f({x:eval}){"use strict";}',
137 parseRaisesException(SyntaxError),
138 parseRaisesException(SyntaxError)),
140 assertEq(testLenientAndStrict('function eval(){"use strict";}',
141 parseRaisesException(SyntaxError),
142 parseRaisesException(SyntaxError)),
144 assertEq(testLenientAndStrict('(function f(eval){})',
146 parseRaisesException(SyntaxError)),
148 assertEq(testLenientAndStrict('(function f([eval]){})',
150 parseRaisesException(SyntaxError)),
152 assertEq(testLenientAndStrict('(function f({x:eval}){})',
154 parseRaisesException(SyntaxError)),
156 assertEq(testLenientAndStrict('(function eval(){})',
158 parseRaisesException(SyntaxError)),
160 assertEq(testLenientAndStrict('(function f(eval){"use strict";})',
161 parseRaisesException(SyntaxError),
162 parseRaisesException(SyntaxError)),
164 assertEq(testLenientAndStrict('(function f([eval]){"use strict";})',
165 parseRaisesException(SyntaxError),
166 parseRaisesException(SyntaxError)),
168 assertEq(testLenientAndStrict('(function f({x:eval}){"use strict";})',
169 parseRaisesException(SyntaxError),
170 parseRaisesException(SyntaxError)),
172 assertEq(testLenientAndStrict('(function eval(){"use strict";})',
173 parseRaisesException(SyntaxError),
174 parseRaisesException(SyntaxError)),
176 assertEq(testLenientAndStrict('(function f(eval) 2)',
178 parseRaisesException(SyntaxError)),
180 assertEq(testLenientAndStrict('(function f([eval]) 2)',
182 parseRaisesException(SyntaxError)),
184 assertEq(testLenientAndStrict('(function f({x:eval}) 2)',
186 parseRaisesException(SyntaxError)),
188 assertEq(testLenientAndStrict('(function eval() 2)',
190 parseRaisesException(SyntaxError)),
192 assertEq(testLenientAndStrict('({set x(eval){}})',
194 parseRaisesException(SyntaxError)),
196 assertEq(testLenientAndStrict('({set x([eval]){}})',
198 parseRaisesException(SyntaxError)),
200 assertEq(testLenientAndStrict('({set x({x:eval}){}})',
202 parseRaisesException(SyntaxError)),
204 assertEq(testLenientAndStrict('({set x(eval){"use strict";}})',
205 parseRaisesException(SyntaxError),
206 parseRaisesException(SyntaxError)),
208 assertEq(testLenientAndStrict('({set x([eval]){"use strict";}})',
209 parseRaisesException(SyntaxError),
210 parseRaisesException(SyntaxError)),
212 assertEq(testLenientAndStrict('({set x({x:eval}){"use strict";}})',
213 parseRaisesException(SyntaxError),
214 parseRaisesException(SyntaxError)),
216 assertEq(testLenientAndStrict('function f(arguments){}',
218 parseRaisesException(SyntaxError)),
220 assertEq(testLenientAndStrict('function f([arguments]){}',
222 parseRaisesException(SyntaxError)),
224 assertEq(testLenientAndStrict('function f({x:arguments}){}',
226 parseRaisesException(SyntaxError)),
228 assertEq(testLenientAndStrict('function arguments(){}',
230 parseRaisesException(SyntaxError)),
232 assertEq(testLenientAndStrict('function f(arguments){"use strict";}',
233 parseRaisesException(SyntaxError),
234 parseRaisesException(SyntaxError)),
236 assertEq(testLenientAndStrict('function f([arguments]){"use strict";}',
237 parseRaisesException(SyntaxError),
238 parseRaisesException(SyntaxError)),
240 assertEq(testLenientAndStrict('function f({x:arguments}){"use strict";}',
241 parseRaisesException(SyntaxError),
242 parseRaisesException(SyntaxError)),
244 assertEq(testLenientAndStrict('function arguments(){"use strict";}',
245 parseRaisesException(SyntaxError),
246 parseRaisesException(SyntaxError)),
248 assertEq(testLenientAndStrict('(function f(arguments){})',
250 parseRaisesException(SyntaxError)),
252 assertEq(testLenientAndStrict('(function f([arguments]){})',
254 parseRaisesException(SyntaxError)),
256 assertEq(testLenientAndStrict('(function f({x:arguments}){})',
258 parseRaisesException(SyntaxError)),
260 assertEq(testLenientAndStrict('(function arguments(){})',
262 parseRaisesException(SyntaxError)),
264 assertEq(testLenientAndStrict('(function f(arguments){"use strict";})',
265 parseRaisesException(SyntaxError),
266 parseRaisesException(SyntaxError)),
268 assertEq(testLenientAndStrict('(function f([arguments]){"use strict";})',
269 parseRaisesException(SyntaxError),
270 parseRaisesException(SyntaxError)),
272 assertEq(testLenientAndStrict('(function f({x:arguments}){"use strict";})',
273 parseRaisesException(SyntaxError),
274 parseRaisesException(SyntaxError)),
276 assertEq(testLenientAndStrict('(function arguments(){"use strict";})',
277 parseRaisesException(SyntaxError),
278 parseRaisesException(SyntaxError)),
280 assertEq(testLenientAndStrict('(function f(arguments) 2)',
282 parseRaisesException(SyntaxError)),
284 assertEq(testLenientAndStrict('(function f([arguments]) 2)',
286 parseRaisesException(SyntaxError)),
288 assertEq(testLenientAndStrict('(function f({x:arguments}) 2)',
290 parseRaisesException(SyntaxError)),
292 assertEq(testLenientAndStrict('(function arguments() 2)',
294 parseRaisesException(SyntaxError)),
296 assertEq(testLenientAndStrict('({set x(arguments){}})',
298 parseRaisesException(SyntaxError)),
300 assertEq(testLenientAndStrict('({set x([arguments]){}})',
302 parseRaisesException(SyntaxError)),
304 assertEq(testLenientAndStrict('({set x({x:arguments}){}})',
306 parseRaisesException(SyntaxError)),
308 assertEq(testLenientAndStrict('({set x(arguments){"use strict";}})',
309 parseRaisesException(SyntaxError),
310 parseRaisesException(SyntaxError)),
312 assertEq(testLenientAndStrict('({set x([arguments]){"use strict";}})',
313 parseRaisesException(SyntaxError),
314 parseRaisesException(SyntaxError)),
316 assertEq(testLenientAndStrict('({set x({x:arguments}){"use strict";}})',
317 parseRaisesException(SyntaxError),
318 parseRaisesException(SyntaxError)),
322 * Functions produced using the Function constructor may not use
323 * 'eval' or 'arguments' as a parameter name if their body is strict
324 * mode code. The strictness of the calling code does not affect the
325 * constraints applied to the parameters.
327 assertEq(testLenientAndStrict('Function("eval","")',
331 assertEq(testLenientAndStrict('Function("eval","\'use strict\';")',
332 raisesException(SyntaxError),
333 raisesException(SyntaxError)),
335 assertEq(testLenientAndStrict('Function("arguments","")',
339 assertEq(testLenientAndStrict('Function("arguments","\'use strict\';")',
340 raisesException(SyntaxError),
341 raisesException(SyntaxError)),
345 reportCompare(true, true);