Загрузите собственные модули C в duktape 2.1.0 для
Я все еще потерялся после прочтения инструкции.
Он сказал, что
Обратный вызов load является функцией Duktape/C, которая принимает идентификатор разрешенного модуля и: (1) возвращает исходный код Ecmascript для модуля или неопределенный, если нет исходного кода, например, для чистых модулей C, (2) может заполнять module.exports сам, и (3) может заменить module.exports.
Но при загрузке родного модуля C,
- что должно быть помещено в стек значений?
duk_push_undefined(ctx)
вместоduk_push_string(ctx, module_source)
? - что должно быть возвращено обратным вызовом load вызывающей стороне?
return 0
вместоreturn 1
?
Я пытался позвонить myobject_init
(используя экземпляр по умолчанию в http://wiki.duktape.org/HowtoNativeConstructor.html) в обратном вызове загрузки cb_load_module
, Но дуктапе жалуется
Ошибка типа: [объект объекта] не может быть создан
когда я оцениваю var MyObject = require("MyObject")
независимо от того, если я
- вставить неопределенное значение в стек значений и вернуть 1,
- или ничего не вставляйте в стек значений и возвращайте 0.
1 ответ
Задача решена. Есть еще несколько деталей, разбросанных по
- https://github.com/svaarala/duktape/blob/master/doc/c-module-convention.rst
- http://wiki.duktape.org/HowtoModules.html Речь идет о структуре загрузки модулей duktape 1.x, но она помогает понять структуру 2.x.
Наиболее важные трюки:
Функция init модуля должна возвращать функцию (конструктор также является функцией). НЕ регистрируйте функцию, используя
duk_put_global_string
,duk_ret_t module_init(duk_context* ctx) { duk_push_c_function(ctx, module_constructor, num_arguments_for_constructor); // set properties for the constructor return 1; // stack: [ ... constructor ] }
Функция
cb_load_module
необходимо вставить функцию инициализации модуля в стек значений, а затем использоватьduk_call
позвонить и установитьmodule.exports
, НЕ вызывайте функцию инициализации модуля напрямую.duk_ret_t cb_load_module(duk_context *ctx) { // stack: [ resolved_id exports module ] ... duk_push_c_function(ctx, module_init, 0); duk_call(ctx, 0); duk_put_prop_string(ctx, 2, "exports"); // obj_idx(module) = 2 return 0; // no .js source for native modules }