Duktape требует - не может загрузить модуль - PullRequest
0 голосов
/ 06 апреля 2020

Я пытался использовать require с duktape 2.5.0, но я не могу заставить его работать. Я реализовал функцию modSearch , как я нашел в документации.

Моя C ++ программа компилируется нормально (в VS2019 на Windows 10), но когда я ее запускаю, я получаю эту ошибку (от duktape ):

ReferenceError: идентификатор 'suma' undefined

Я отладил программу, и была вызвана функция mod_search , а файл загружен с диска.

Ниже моя программа и модуль. js файл.

Пожалуйста, подскажите, что я сделал не так. Спасибо!


#include <iostream>
#include "duktape.h"
#include "duk_module_duktape.h"
//---------------------------------------------------
duk_ret_t mod_search(duk_context* ctx)
{
     int  len;

    const char *filename = duk_require_string(ctx, 0);

    FILE* f = fopen(filename, "rb");
    if (!f)
        return -1;
    fseek(f, 0, SEEK_END);
    len = (int) ftell(f);

    // Rewind
    fseek(f, 0, SEEK_SET);

    char* src = (char*)malloc(len);
    fread(src, 1, len,f);
    fclose(f);
    duk_push_lstring(ctx, src, len);
    free(src);
    return 1;
}
//---------------------------------------------------
static duk_ret_t console_log(duk_context* ctx)
{
    duk_push_string(ctx, " ");
    duk_insert(ctx, 0);
    duk_join(ctx, duk_get_top(ctx) - 1);
    std::cout << duk_safe_to_string(ctx, -1);
    return 0;
}
//---------------------------------------------------
int main()
{
    duk_context* ctx = duk_create_heap_default();

    duk_idx_t console_obj_idx = duk_push_bare_object(ctx);
    duk_push_c_function(ctx, console_log, DUK_VARARGS);
    duk_put_prop_string(ctx, console_obj_idx, "log");

    duk_put_global_string(ctx, "console");

    duk_module_duktape_init(ctx);

    duk_get_global_string(ctx, "Duktape");
    duk_push_c_function(ctx, mod_search, 4 /*num_args*/);
    duk_put_prop_string(ctx, -2, "modSearch");
    duk_pop(ctx);

    duk_push_string(ctx, "\n");
    duk_push_string(ctx, "require('modul.js');");
    duk_push_string(ctx, "var a = 3;");
    duk_push_string(ctx, "var b = 5;");
    duk_push_string(ctx, "var s = suma(a, b);");
    duk_push_string(ctx, "console.log(s);");

    duk_join(ctx, 5);

    if (duk_peval(ctx) != 0) {
        std::cout << duk_safe_to_string(ctx, -1);
    }

    duk_pop(ctx); /* pop eval result */

    duk_destroy_heap(ctx);

    getchar();
}
//---------------------------------------------------

// модуль. js

//Your code here...
function suma(a, b)
{
return a+b;
}
...