diff --git a/gen/function_source.c b/gen/function_source.c index 3c55b87..642e828 100644 Binary files a/gen/function_source.c and b/gen/function_source.c differ diff --git a/gen/hello.c b/gen/hello.c index c1df121..f713ed1 100644 Binary files a/gen/hello.c and b/gen/hello.c differ diff --git a/gen/hello_module.c b/gen/hello_module.c index 70d43a4..45e9bc7 100644 Binary files a/gen/hello_module.c and b/gen/hello_module.c differ diff --git a/gen/test_fib.c b/gen/test_fib.c index 5329383..d33cff2 100644 Binary files a/gen/test_fib.c and b/gen/test_fib.c differ diff --git a/qjs.c b/qjs.c index eef6d85..9ccf841 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 8e0b58b..5e2e8ae 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 a84c3b0..c1107de 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 5d42139..66ab898 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);