我正在尝试用 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
。我确信它理解我的输入,因为如果我给它未定义的符号,上面显示的错误处理就会启动并且堆栈跟踪会正确输出。