Я пытался использовать 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;
}