регистрация закрытия Duktape

У меня есть проект C ++, и я использую библиотеку duktape JS. Мне нужно зарегистрировать глобальную функцию в JS и сохранить указатель на объект как данные замыкания с этой функцией, чтобы я мог получить доступ к этому указателю при вызове функции.

Я знаю, как это сделать в lua c api:

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

Сначала я нажимаю указатель как данные закрытия, затем указатель на функцию. Мне нужен такой же функционал в API-интерфейсе Duktape.

Можете ли вы показать мне код с регистрацией закрытия и доступ к нему?

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, вы можете использовать внутренняя строка, например "\xFF" "ptr",

1

Другие решения

У меня была похожая проблема. После небольшого поиска я нашел вики о том, как сохранять объекты который помог мне сохранить ссылку на функцию (обратный вызов) для дальнейшего использования.

0

По вопросам рекламы [email protected]