You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

140 lines
2.8 KiB

/*
* Function compilation and execution (E5 Sections 13, 10.4.3).
*
* There is a separate test for tail recursion, arguments object.
*/
/*---
{
"skip": true
}
---*/
/* FIXME:
* - shadowing
*/
/*** DUPLICATE ARGUMENT NAMES ***/
/*===
3 2
SyntaxError
===*/
/* Non-strict mode: last value to match a certain name remains bound,
* see E5 Section 10.5.
*/
function nonstrict_dup(a,b,a) { print(a,b); }
nonstrict_dup(1,2,3);
/* Strict mode: compile-time error to declare a function with duplicate
* argument names, see E5 Section 13.1.
*/
try {
eval("'use strict';\n" +
"function strict_dup(a,b,a) { print(a,b); }\n" +
"strict_dup(1,2,3);");
} catch(e) {
print(e.name);
}
/*** INVALID ARGUMENT NAMES (NON-STRICT MODE) ***/
/*===
1 2
SyntaxError
SyntaxError
1
===*/
/* Non-strict mode: 'eval' and 'arguments' are valid argument names,
* because they are not reserved words. All non-strict mode reserved
* words are forbidden, because they do not match the 'Identifier'
* production.
*
* XXX: test else (a Keyword), class (a FutureReservedWord), and an
* additional keyword only illegal in strict mode. Should really
* test all reserved words here.
*/
function nonstrict_evalargs(eval, arguments) { print(eval, arguments); }
nonstrict_evalargs(1,2);
try {
/* NB: do not 'print(else)' because that would be a separate,
* different error.
*/
eval("function nonstrict_else(else) { print('else'); }\n" +
"nonstrict_else(1);");
} catch (e) {
print(e.name);
}
try {
eval("function nonstrict_class(class) { print('class'); }\n" +
"nonstrict_class(1);");
} catch (e) {
print(e.name);
}
function nonstrict_package(package) { print(package); }
nonstrict_package(1);
/*** INVALID ARGUMENT NAMES (STRICT MODE) ***/
/*===
SyntaxError
SyntaxError
SyntaxError
SyntaxError
SyntaxError
===*/
/* Strict mode: 'eval' and 'arguments' must cause a compile-time error.
* See E5 Section 13.1.
*/
try {
eval("'use strict'\n" +
"function strict_eval(eval) { print(eval); }\n" +
"strict_eval(1);");
} catch(e) {
print(e.name);
}
try {
eval("'use strict'\n" +
"function strict_args(arguments) { print(arguments); }\n" +
"strict_args(1);");
} catch(e) {
print(e.name);
}
try {
/* NB: do not 'print(else)' because that would be a separate,
* different error.
*/
eval("'use strict'\n" +
"function strict_else(else) { print('else'); }\n" +
"strict_else(1);");
} catch (e) {
print(e.name);
}
try {
eval("'use strict'\n" +
"function strict_class(class) { print('class'); }\n" +
"strict_class(1);");
} catch (e) {
print(e.name);
}
try {
eval("'use strict'\n" +
"function strict_package(package) { print('package'); }\n" +
"strict_package(1);");
} catch (e) {
print(e.name);
}