Загрузите собственные модули 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 ответ

Задача решена. Есть еще несколько деталей, разбросанных по

Наиболее важные трюки:

  • Функция 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
    }
    
Другие вопросы по тегам