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.
73 lines
1.7 KiB
73 lines
1.7 KiB
/*
|
|
* A Duktape/C function does not have an automatic name in Duktape 1.x.
|
|
* You can set it yourself in Duktape 1.1 to get nicer tracebacks.
|
|
* In Duktape 1.0 Function.prototype.name is not writable so you can't
|
|
* do this.
|
|
*/
|
|
|
|
/*===
|
|
*** test_without_name (duk_safe_call)
|
|
my name is: ''
|
|
URIError: uri error (rc -106)
|
|
anon native strict preventsyield
|
|
forEach native strict preventsyield
|
|
eval XXX preventsyield
|
|
==> rc=0, result='undefined'
|
|
*** test_with_name (duk_safe_call)
|
|
my name is: 'my_func'
|
|
URIError: uri error (rc -106)
|
|
my_func native strict preventsyield
|
|
forEach native strict preventsyield
|
|
eval XXX preventsyield
|
|
==> rc=0, result='undefined'
|
|
===*/
|
|
|
|
static duk_ret_t my_func(duk_context *ctx) {
|
|
duk_push_current_function(ctx);
|
|
duk_get_prop_string(ctx, -1, "name");
|
|
printf("my name is: '%s'\n", duk_safe_to_string(ctx, -1));
|
|
duk_pop_2(ctx);
|
|
|
|
return DUK_RET_URI_ERROR;
|
|
}
|
|
|
|
static duk_ret_t test_without_name(duk_context *ctx) {
|
|
duk_push_c_function(ctx, my_func, 0);
|
|
duk_put_global_string(ctx, "MyFunc");
|
|
|
|
duk_eval_string_noresult(ctx,
|
|
"try {\n"
|
|
" [1].forEach(MyFunc);\n"
|
|
"} catch (e) {\n"
|
|
" print(sanitize(e.stack || e));\n"
|
|
"}\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
static duk_ret_t test_with_name(duk_context *ctx) {
|
|
duk_get_global_string(ctx, "MyFunc");
|
|
duk_push_string(ctx, "my_func");
|
|
duk_put_prop_string(ctx, -2, "name");
|
|
duk_pop(ctx);
|
|
|
|
duk_eval_string_noresult(ctx,
|
|
"try {\n"
|
|
" [1].forEach(MyFunc);\n"
|
|
"} catch (e) {\n"
|
|
" print(sanitize(e.stack || e));\n"
|
|
"}\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
void test(duk_context *ctx) {
|
|
duk_eval_string_noresult(ctx,
|
|
"var sanitize = function(v) {\n"
|
|
" v = v.replace(/eval \\S+/, 'eval XXX');\n"
|
|
" return v;\n"
|
|
"}\n");
|
|
|
|
TEST_SAFE_CALL(test_without_name);
|
|
TEST_SAFE_CALL(test_with_name);
|
|
}
|
|
|