mirror of https://github.com/svaarala/duktape.git
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.
76 lines
1.3 KiB
76 lines
1.3 KiB
/*===
|
|
test1 1
|
|
tailcalled 1
|
|
100
|
|
test2 1
|
|
tailcalled 1
|
|
100
|
|
test3 1
|
|
tailcalled 1
|
|
100
|
|
===*/
|
|
|
|
/* Tailcall from inside a siwthc is allowed: even though the catch stack
|
|
* will contain entries referring to the callstack entry being reused,
|
|
* this is not a problem because the entries are not error catching.
|
|
* In Duktape 0.9.0 there was an incorrection assertion in duk_js_call.c
|
|
* which would also trigger an assertion error when tailcall was made
|
|
* from inside a switch:
|
|
*
|
|
* for (i = 0; i < thr->catchstack_top; i++) {
|
|
* DUK_ASSERT(thr->catchstack[i].callstack_index < our_callstack_index);
|
|
* }
|
|
*
|
|
* This has been fixed in Duktape 0.10.0.
|
|
*/
|
|
|
|
function tailcalled(x) {
|
|
print('tailcalled', x);
|
|
return x * 100;
|
|
}
|
|
|
|
function test1(x) {
|
|
print('test1', x);
|
|
return tailcalled(x);
|
|
}
|
|
|
|
function test2(x) {
|
|
var t;
|
|
|
|
print('test2', x);
|
|
switch (x) {
|
|
case 1:
|
|
t = tailcalled(x); return t;
|
|
default:
|
|
t = tailcalled(x); return t;
|
|
}
|
|
}
|
|
|
|
function test3(x) {
|
|
print('test3', x);
|
|
switch (x) {
|
|
case 1:
|
|
return tailcalled(x);
|
|
default:
|
|
return tailcalled(x);
|
|
}
|
|
}
|
|
|
|
|
|
try {
|
|
print(test1(1));
|
|
} catch (e) {
|
|
print(e);
|
|
}
|
|
|
|
try {
|
|
print(test2(1));
|
|
} catch (e) {
|
|
print(e);
|
|
}
|
|
|
|
try {
|
|
print(test3(1));
|
|
} catch (e) {
|
|
print(e);
|
|
}
|
|
|