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.

120 lines
3.2 KiB

/*
* Ecmascript compiler recursion limits. These are quite arbitrary, so here
* we test against the current limits, ensuring that reasonable expressions
* get parsed while "unreasonable" ones cause a recursion error.
*
* The compiler limits recursion now in key points which are guaranteed to
* occur in any arbitrarily deep recursion: expression parsing, statement
* parsing, and function body parsing. A single recursion count is used,
* so the actual limits for each expression (consisting of expressions,
* statements, and inner functions) varies.
*/
/*---
{
"custom": true
}
---*/
/*===
test
Error
===*/
/* Expression recursion. */
try {
// expression recursion limit does not prevent this
print(eval("(((((((((((((((((((((((((((((((((((((((((((((((" + "'test'" +
")))))))))))))))))))))))))))))))))))))))))))))))"));
// 111111111122222222223333333333444444444455555555555
//123456789012345678901234567890123456789012345678901234567890
} catch (e) {
print(e.name, e);
}
try {
// expression recursion limit prevents this
print(eval("((((((((((((((((((((((((((((((((((((((((((((((((((" + "'never here'" +
"))))))))))))))))))))))))))))))))))))))))))))))))))"));
// 111111111122222222223333333333444444444455555555555
//123456789012345678901234567890123456789012345678901234567890
} catch (e) {
print(e.name);
}
/*===
test
Error
===*/
/* Statement recursion. */
try {
// statement recursion limit does not prevent this
print(eval("{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{" + "'test'" +
"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}"));
// 111111111122222222223333333333444444444455555555555
//123456789012345678901234567890123456789012345678901234567890
} catch (e) {
print(e.name);
}
try {
// statement recursion limit prevents this
print(eval("{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{" + "'test'" +
"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}"));
// 111111111122222222223333333333444444444455555555555
//123456789012345678901234567890123456789012345678901234567890
} catch (e) {
print(e.name);
}
/*===
function(){ var f=function(){}; }
function(){ var f=function(){ var f=function(){}; }; }
function(){ var f=function(){ var f=function(){ var f=function(){}; }; }; }
test
Error
===*/
/* Function recursion. */
var ignore;
function buildFunc(n) {
var res = 'function(){}';
var i;
for (i = 0; i < n; i++) {
res = 'function(){ var f=' + res + '; }'
}
return res;
}
print(buildFunc(1));
print(buildFunc(2));
print(buildFunc(3));
try {
// function recursion limit does not prevent this
// NOTE: because inner functions are parsed and re-parsed an
// exponentially number of times at the moment, this takes a
// long time
print(eval("ignore = " + buildFunc(15) + "; 'test'"));
} catch (e) {
print(e.name);
}
try {
// function recursion limit prevents this
print(eval("ignore = " + buildFunc(20) + "; 'test'"));
} catch (e) {
print(e.name);
}