diff --git a/gen/function_source.c b/gen/function_source.c index 3c55b8764..642e8285b 100644 --- a/gen/function_source.c +++ b/gen/function_source.c @@ -57,8 +57,11 @@ static JSContext *JS_NewCustomContext(JSRuntime *rt) int main(int argc, char **argv) { + int r; + JSValue ret; JSRuntime *rt; JSContext *ctx; + r = 0; rt = JS_NewRuntime(); js_std_set_worker_new_context_func(JS_NewCustomContext); js_std_init_handlers(rt); @@ -66,9 +69,14 @@ int main(int argc, char **argv) ctx = JS_NewCustomContext(rt); js_std_add_helpers(ctx, argc, argv); js_std_eval_binary(ctx, qjsc_function_source, qjsc_function_source_size, 0); - js_std_loop(ctx); + ret = js_std_loop(ctx); + if (JS_IsException(ret)) { + js_std_dump_error1(ctx, ret); + r = 1; + } + JS_FreeValue(ctx, ret); JS_FreeContext(ctx); js_std_free_handlers(rt); JS_FreeRuntime(rt); - return 0; + return r; } diff --git a/gen/hello.c b/gen/hello.c index c1df12140..f713ed19b 100644 --- a/gen/hello.c +++ b/gen/hello.c @@ -30,8 +30,11 @@ static JSContext *JS_NewCustomContext(JSRuntime *rt) int main(int argc, char **argv) { + int r; + JSValue ret; JSRuntime *rt; JSContext *ctx; + r = 0; rt = JS_NewRuntime(); js_std_set_worker_new_context_func(JS_NewCustomContext); js_std_init_handlers(rt); @@ -39,9 +42,14 @@ int main(int argc, char **argv) ctx = JS_NewCustomContext(rt); js_std_add_helpers(ctx, argc, argv); js_std_eval_binary(ctx, qjsc_hello, qjsc_hello_size, 0); - js_std_loop(ctx); + ret = js_std_loop(ctx); + if (JS_IsException(ret)) { + js_std_dump_error1(ctx, ret); + r = 1; + } + JS_FreeValue(ctx, ret); JS_FreeContext(ctx); js_std_free_handlers(rt); JS_FreeRuntime(rt); - return 0; + return r; } diff --git a/gen/hello_module.c b/gen/hello_module.c index 70d43a40a..45e9bc712 100644 --- a/gen/hello_module.c +++ b/gen/hello_module.c @@ -82,8 +82,11 @@ static JSContext *JS_NewCustomContext(JSRuntime *rt) int main(int argc, char **argv) { + int r; + JSValue ret; JSRuntime *rt; JSContext *ctx; + r = 0; rt = JS_NewRuntime(); js_std_set_worker_new_context_func(JS_NewCustomContext); js_std_init_handlers(rt); @@ -91,9 +94,14 @@ int main(int argc, char **argv) ctx = JS_NewCustomContext(rt); js_std_add_helpers(ctx, argc, argv); js_std_eval_binary(ctx, qjsc_hello_module, qjsc_hello_module_size, 0); - js_std_loop(ctx); + ret = js_std_loop(ctx); + if (JS_IsException(ret)) { + js_std_dump_error1(ctx, ret); + r = 1; + } + JS_FreeValue(ctx, ret); JS_FreeContext(ctx); js_std_free_handlers(rt); JS_FreeRuntime(rt); - return 0; + return r; } diff --git a/gen/test_fib.c b/gen/test_fib.c index 53293833c..d33cff29e 100644 --- a/gen/test_fib.c +++ b/gen/test_fib.c @@ -58,8 +58,11 @@ static JSContext *JS_NewCustomContext(JSRuntime *rt) int main(int argc, char **argv) { + int r; + JSValue ret; JSRuntime *rt; JSContext *ctx; + r = 0; rt = JS_NewRuntime(); js_std_set_worker_new_context_func(JS_NewCustomContext); js_std_init_handlers(rt); @@ -67,9 +70,14 @@ int main(int argc, char **argv) ctx = JS_NewCustomContext(rt); js_std_add_helpers(ctx, argc, argv); js_std_eval_binary(ctx, qjsc_test_fib, qjsc_test_fib_size, 0); - js_std_loop(ctx); + ret = js_std_loop(ctx); + if (JS_IsException(ret)) { + js_std_dump_error1(ctx, ret); + r = 1; + } + JS_FreeValue(ctx, ret); JS_FreeContext(ctx); js_std_free_handlers(rt); JS_FreeRuntime(rt); - return 0; + return r; } diff --git a/qjs.c b/qjs.c index eef6d85cb..9ccf8416b 100644 --- a/qjs.c +++ b/qjs.c @@ -36,6 +36,7 @@ #include #include "cutils.h" +#include "quickjs.h" #include "quickjs-libc.h" #ifdef QJS_USE_MIMALLOC @@ -556,6 +557,7 @@ int main(int argc, char **argv) ret = js_std_loop(ctx); if (!JS_IsUndefined(ret)) { js_std_dump_error1(ctx, ret); + JS_FreeValue(ctx, ret); goto fail; } } diff --git a/qjsc.c b/qjsc.c index 8e0b58bc7..5e2e8aeed 100644 --- a/qjsc.c +++ b/qjsc.c @@ -314,19 +314,27 @@ static void compile_file(JSContext *ctx, FILE *fo, static const char main_c_template1[] = "int main(int argc, char **argv)\n" "{\n" + " int r;\n" + " JSValue ret;\n" " JSRuntime *rt;\n" " JSContext *ctx;\n" + " r = 0;\n" " rt = JS_NewRuntime();\n" " js_std_set_worker_new_context_func(JS_NewCustomContext);\n" " js_std_init_handlers(rt);\n" ; static const char main_c_template2[] = - " js_std_loop(ctx);\n" + " ret = js_std_loop(ctx);\n" + " if (JS_IsException(ret)) {\n" + " js_std_dump_error1(ctx, ret);\n" + " r = 1;\n" + " }\n" + " JS_FreeValue(ctx, ret);\n" " JS_FreeContext(ctx);\n" " js_std_free_handlers(rt);\n" " JS_FreeRuntime(rt);\n" - " return 0;\n" + " return r;\n" "}\n"; #define PROG_NAME "qjsc" @@ -375,7 +383,7 @@ int main(int argc, char **argv) stack_size = 0; memset(&dynamic_module_list, 0, sizeof(dynamic_module_list)); - + /* add system modules */ namelist_add(&cmodule_list, "qjs:std", "std", 0); namelist_add(&cmodule_list, "qjs:os", "os", 0); diff --git a/quickjs-libc.c b/quickjs-libc.c index a84c3b0e2..c1107de69 100644 --- a/quickjs-libc.c +++ b/quickjs-libc.c @@ -3499,7 +3499,7 @@ static void *worker_func(void *opaque) js_std_dump_error(ctx); JS_FreeValue(ctx, val); - js_std_loop(ctx); + JS_FreeValue(ctx, js_std_loop(ctx)); JS_FreeContext(ctx); js_std_free_handlers(rt); @@ -4137,6 +4137,7 @@ JSValue js_std_loop(JSContext *ctx) JSRuntime *rt = JS_GetRuntime(ctx); JSThreadState *ts = js_get_thread_state(rt); JSContext *ctx1; + JSValue ret; int err; for(;;) { @@ -4156,7 +4157,9 @@ JSValue js_std_loop(JSContext *ctx) break; } done: - return ts->exc; + ret = ts->exc; + ts->exc = JS_UNDEFINED; + return ret; } /* Wait for a promise and execute pending jobs while waiting for diff --git a/run-test262.c b/run-test262.c index 5d42139e1..66ab89806 100644 --- a/run-test262.c +++ b/run-test262.c @@ -45,6 +45,7 @@ typedef pthread_t js_thread_t; #include "cutils.h" #include "list.h" +#include "quickjs.h" #include "quickjs-c-atomics.h" #include "quickjs-libc.h" @@ -1554,7 +1555,12 @@ static int eval_buf(JSContext *ctx, const char *buf, size_t buf_len, } if (local) { - js_std_loop(ctx); + JSValue val = js_std_loop(ctx); + if (JS_IsException(val)) { + js_std_dump_error1(ctx, val); + ret = -1; + } + JS_FreeValue(ctx, val); } JS_FreeCString(ctx, error_name);