quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

commit ea92967fc26a9df96c167342770ed391ea2e44ae
parent 56e67b308e0522fa98927eaf003f99343b107ec3
Author: Fabrice Bellard <fabrice@bellard.org>
Date:   Sat,  3 Feb 2024 15:47:42 +0100

fixed Promise return in the REPL by using a wrapper object in async std.evalScript() (github issue #231)

Diffstat:
Mquickjs/Makefile | 2+-
Mquickjs/doc/quickjs.texi | 4+++-
Mquickjs/quickjs.c | 16++++++++++++++--
Mquickjs/repl.js | 3++-
4 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/quickjs/Makefile b/quickjs/Makefile @@ -28,7 +28,7 @@ endif # Windows cross compilation from Linux #CONFIG_WIN32=y # use link time optimization (smaller and faster executables but slower build) -CONFIG_LTO=y +#CONFIG_LTO=y # consider warnings as errors (for development) #CONFIG_WERROR=y # force 32 bit build for some utilities diff --git a/quickjs/doc/quickjs.texi b/quickjs/doc/quickjs.texi @@ -379,7 +379,9 @@ optional properties: stack frames below the evalScript. @item async Boolean (default = false). If true, @code{await} is accepted in the - script and a promise is returned. + script and a promise is returned. The promise is resolved with an + object whose @code{value} property holds the value returned by the + script. @end table @item loadScript(filename) diff --git a/quickjs/quickjs.c b/quickjs/quickjs.c @@ -34371,9 +34371,21 @@ static __exception int js_parse_program(JSParseState *s) if (!s->is_module) { /* return the value of the hidden variable eval_ret_idx */ - emit_op(s, OP_get_loc); - emit_u16(s, fd->eval_ret_idx); + if (fd->func_kind == JS_FUNC_ASYNC) { + /* wrap the return value in an object so that promises can + be safely returned */ + emit_op(s, OP_object); + emit_op(s, OP_dup); + emit_op(s, OP_get_loc); + emit_u16(s, fd->eval_ret_idx); + + emit_op(s, OP_put_field); + emit_atom(s, JS_ATOM_value); + } else { + emit_op(s, OP_get_loc); + emit_u16(s, fd->eval_ret_idx); + } emit_return(s, TRUE); } else { emit_return(s, FALSE); diff --git a/quickjs/repl.js b/quickjs/repl.js @@ -1313,7 +1313,7 @@ import * as os from "os"; /* result is a promise */ result.then(print_eval_result, print_eval_error); } else { - print_eval_result(result); + print_eval_result({ value: result }); } } catch (error) { print_eval_error(error); @@ -1321,6 +1321,7 @@ import * as os from "os"; } function print_eval_result(result) { + result = result.value; eval_time = os.now() - eval_start_time; std.puts(colors[styles.result]); print(result);