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:
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);