duktape 对多个绑定的 js 函数使用通用的 c 函数
duktape use common c function for multiple bound js functions
我正在尝试使用 duktape 引擎将一个通用的 c 函数绑定到多个 javascript 函数。
我的问题是我需要找出普通c 函数中调用函数的名称。我觉得可以使用经常引用的 javascript 堆栈来实现这一点。
但是我对如何实现它没有具体的想法。有人知道如何执行此操作吗?
下面你可以找到我的mwe。函数 duk_get_invoking_function 是伪代码,强调我的意图。
#include "duktape.h"
duk_ret_t common_function(duk_context * ctx) {
const char * function_name;
//
// function_name = duk_get_invoking_function(ctx);
// e.g. function_name is "func_01"
//
return 0;
}
int main() {
duk_context * ctx;
ctx = duk_create_heap_default();
if (!ctx) {
return 1;
}
duk_push_c_function(ctx, common_function, DUK_VARARGS);
duk_put_global_string(ctx, "func_01");
duk_push_c_function(ctx, common_function, DUK_VARARGS);
duk_put_global_string(ctx, "func_02");
duk_push_c_function(ctx, common_function, DUK_VARARGS);
duk_put_global_string(ctx, "func_03");
duk_eval_string(ctx, "func_01('abc'); func_02(123); func_03();");
duk_destroy_heap(ctx);
return 0;
}
如果我理解正确的话,您希望多个 Ecmascript 函数对象绑定到同一个本机函数——当调用该本机函数时,找出调用中使用了哪个 Ecmascript 函数对象。
如果是这样,您无需查看调用堆栈即可执行此操作:每个 duk_push_c_function() 都会创建一个新的 Ecmascript 函数对象,该对象指向同一个本机函数。当调用本机函数时,您可以使用 duk_push_current_function() 来访问调用中使用的 Ecmascript 函数。然后,您可以根据例如区分 Ecmascript 函数对象。它们的属性是您在创建它们时设置的。
我正在尝试使用 duktape 引擎将一个通用的 c 函数绑定到多个 javascript 函数。
我的问题是我需要找出普通c 函数中调用函数的名称。我觉得可以使用经常引用的 javascript 堆栈来实现这一点。
但是我对如何实现它没有具体的想法。有人知道如何执行此操作吗?
下面你可以找到我的mwe。函数 duk_get_invoking_function 是伪代码,强调我的意图。
#include "duktape.h"
duk_ret_t common_function(duk_context * ctx) {
const char * function_name;
//
// function_name = duk_get_invoking_function(ctx);
// e.g. function_name is "func_01"
//
return 0;
}
int main() {
duk_context * ctx;
ctx = duk_create_heap_default();
if (!ctx) {
return 1;
}
duk_push_c_function(ctx, common_function, DUK_VARARGS);
duk_put_global_string(ctx, "func_01");
duk_push_c_function(ctx, common_function, DUK_VARARGS);
duk_put_global_string(ctx, "func_02");
duk_push_c_function(ctx, common_function, DUK_VARARGS);
duk_put_global_string(ctx, "func_03");
duk_eval_string(ctx, "func_01('abc'); func_02(123); func_03();");
duk_destroy_heap(ctx);
return 0;
}
如果我理解正确的话,您希望多个 Ecmascript 函数对象绑定到同一个本机函数——当调用该本机函数时,找出调用中使用了哪个 Ecmascript 函数对象。
如果是这样,您无需查看调用堆栈即可执行此操作:每个 duk_push_c_function() 都会创建一个新的 Ecmascript 函数对象,该对象指向同一个本机函数。当调用本机函数时,您可以使用 duk_push_current_function() 来访问调用中使用的 Ecmascript 函数。然后,您可以根据例如区分 Ecmascript 函数对象。它们的属性是您在创建它们时设置的。