0

我正在尝试用 C++ 中的 DukTape 实现一个基本的 REPL。我有用户输入作为 aconst char* command_line和以下代码:

void AppConsole::ExecCommand(const char* command_line) {
    duk_push_pointer(duk, (void*) command_line);
    duk_push_uint(duk, (duk_uint_t) strlen(command_line));
    duk_push_string(duk, "input");

    int rc = duk_safe_call(duk, AppConsole::wrapped_compile_execute, NULL /*udata*/, 3 /*nargs*/, 1 /*nret*/);

    if (rc != DUK_EXEC_SUCCESS) {
        print_pop_error(duk);
        AddLog("[error] input was: `%s' (%d)", command_line, strlen(command_line));
    } else {
        AddLog("= %s\n", duk_to_string(duk, -1)); /// always prints "undefined"
        duk_pop(duk);
    }
}

wrapped_compiler_execute函数看起来像:

duk_ret_t AppConsole::wrapped_compile_execute(duk_context* duk, void* udata) {
    const char* src_data;
    duk_size_t src_len;
    duk_uint_t comp_flags;

    (void) udata;

    src_data = (const char*) duk_require_pointer(duk, -3);
    src_len = (duk_size_t) duk_require_uint(duk, -2);

    if (src_data != NULL && src_len >= 1 && src_data[0] == (char) 0xbf) {
        /* Bytecode. */
        (void) duk_type_error(duk, "bytecode input rejected");
    } else {
        /* Source code. */
        comp_flags = 0;
        duk_compile_lstring(duk, comp_flags, src_data, src_len);
    }

    duk_call(duk, 0);

    return 0;  /* duk_safe_call() cleans up */
}

我误解了这个吗?

输入代码,例如var test = 123;应该打印123,随后的test应该打印123。没关系,它打印undefined。我确信它理解我的输入,因为如果我给它未定义的符号,上面显示的错误处理就会启动并且堆栈跟踪会正确输出。

4

0 回答 0