duktape 关闭注册
duktape closure registration
我有 C++ 项目并且正在使用 duktape JS 库。我需要在 JS 中注册全局函数,并用这个函数将指向对象的指针保存为闭包数据,这样我就可以在调用函数时访问这个指针。
我知道如何在 lua c api:
lua_pushlightuserdata(L, this);
lua_pushcclosure(L, &someFunction, 1);
lua_setglobal(L, "someFunction");
首先我将指针作为闭包数据推送,然后是指向函数的指针。我在 duktape api.
中需要相同的功能
你能给我一些关闭注册和访问的代码吗?
与 "C closure" 关联的值没有直接类比,但您可以通过其他方式获得类似的结果。
一种简单的方法是将值存储为函数实例的 属性:
duk_push_c_function(ctx, someFunction, 1 /*nargs*/);
duk_push_pointer(ctx, (void *) somePointer);
duk_put_prop_string(ctx, -2, "_ptr");
duk_put_global_string(ctx, "someFunction");
然后,当函数被调用时,检索值如下:
void *ptr;
duk_push_current_function(ctx);
duk_get_prop_string(ctx, -1, "_ptr");
ptr = duk_get_pointer(ctx, -1);
duk_pop_2(ctx); /* pop pointer and function */
/* ready to use 'ptr' */
如果您想限制从 Ecmascript 代码访问关联值,您可以使用 internal string,例如"\xFF" "ptr"
.
我遇到了类似的问题。经过一番搜索后,我发现 a Wiki on howto persist objects 可以保存函数(回调)参考供以后使用。
我有 C++ 项目并且正在使用 duktape JS 库。我需要在 JS 中注册全局函数,并用这个函数将指向对象的指针保存为闭包数据,这样我就可以在调用函数时访问这个指针。
我知道如何在 lua c api:
lua_pushlightuserdata(L, this);
lua_pushcclosure(L, &someFunction, 1);
lua_setglobal(L, "someFunction");
首先我将指针作为闭包数据推送,然后是指向函数的指针。我在 duktape api.
中需要相同的功能你能给我一些关闭注册和访问的代码吗?
与 "C closure" 关联的值没有直接类比,但您可以通过其他方式获得类似的结果。
一种简单的方法是将值存储为函数实例的 属性:
duk_push_c_function(ctx, someFunction, 1 /*nargs*/);
duk_push_pointer(ctx, (void *) somePointer);
duk_put_prop_string(ctx, -2, "_ptr");
duk_put_global_string(ctx, "someFunction");
然后,当函数被调用时,检索值如下:
void *ptr;
duk_push_current_function(ctx);
duk_get_prop_string(ctx, -1, "_ptr");
ptr = duk_get_pointer(ctx, -1);
duk_pop_2(ctx); /* pop pointer and function */
/* ready to use 'ptr' */
如果您想限制从 Ecmascript 代码访问关联值,您可以使用 internal string,例如"\xFF" "ptr"
.
我遇到了类似的问题。经过一番搜索后,我发现 a Wiki on howto persist objects 可以保存函数(回调)参考供以后使用。