2016-11-30 43 views
1

我有C++项目,我正在使用duktape JS库。我需要在JS中注册全局函数,并使用此函数保存指向对象的指针作为关闭数据,因此我可以在调用函数时访问此指针。duktape关闭注册

我知道如何在Lua C API做到这一点:

lua_pushlightuserdata(L, this); 
lua_pushcclosure(L, &someFunction, 1); 
lua_setglobal(L, "someFunction"); 

首先我推指针封闭的数据,然后函数指针。我需要在duktape api中使用相同的功能。

你能告诉我一些代码封闭注册和访问它?

回答

1

与“C闭包”相关的值没有直接的类比,但您可以通过其他方式获得类似的结果。

一种简单的方法是将值存储为函数实例的属性:

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"

相关问题