2016-11-30 48 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"

相關問題