From: Alexander Borisov Date: Fri, 8 Oct 2021 09:32:42 +0000 (+0300) Subject: Fixed unhandled promise rejection in handle events. X-Git-Tag: 0.7.0~12 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=0f0c23c389786f202ae65b7411dc13e9ff3c4139;p=njs.git Fixed unhandled promise rejection in handle events. This closes #423 issue on GitHub. --- diff --git a/src/njs.h b/src/njs.h index ef238dc1..2ead2f96 100644 --- a/src/njs.h +++ b/src/njs.h @@ -265,6 +265,9 @@ NJS_EXPORT njs_int_t njs_vm_posted(njs_vm_t *vm); #define njs_vm_pending(vm) (njs_vm_waiting(vm) || njs_vm_posted(vm)) +#define njs_vm_unhandled_rejection(vm) \ + ((vm)->options.unhandled_rejection == NJS_VM_OPT_UNHANDLED_REJECTION_THROW \ + && (vm)->promise_reason != NULL && (vm)->promise_reason->length != 0) /* * Runs the specified function with provided arguments. diff --git a/src/njs_shell.c b/src/njs_shell.c index dd9e77c8..bfa9a375 100644 --- a/src/njs_shell.c +++ b/src/njs_shell.c @@ -868,7 +868,7 @@ njs_process_script(njs_opts_t *opts, njs_console_t *console, } for ( ;; ) { - if (!njs_vm_pending(vm)) { + if (!njs_vm_pending(vm) && !njs_vm_unhandled_rejection(vm)) { break; } diff --git a/src/njs_vm.c b/src/njs_vm.c index 834e0a66..16cd2f49 100644 --- a/src/njs_vm.c +++ b/src/njs_vm.c @@ -504,24 +504,20 @@ njs_vm_handle_events(njs_vm_t *vm) } } - if (vm->options.unhandled_rejection - == NJS_VM_OPT_UNHANDLED_REJECTION_THROW) - { - if (vm->promise_reason != NULL && vm->promise_reason->length != 0) { - ret = njs_value_to_string(vm, &string, - &vm->promise_reason->start[0]); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } - - njs_string_get(&string, &str); - njs_vm_error(vm, "unhandled promise rejection: %V", &str); - - njs_mp_free(vm->mem_pool, vm->promise_reason); - vm->promise_reason = NULL; - - return NJS_ERROR; + if (njs_vm_unhandled_rejection(vm)) { + ret = njs_value_to_string(vm, &string, + &vm->promise_reason->start[0]); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } + + njs_string_get(&string, &str); + njs_vm_error(vm, "unhandled promise rejection: %V", &str); + + njs_mp_free(vm->mem_pool, vm->promise_reason); + vm->promise_reason = NULL; + + return NJS_ERROR; } for ( ;; ) { diff --git a/test/js/promise_rejection_tracker.js b/test/js/promise_rejection_tracker.js new file mode 100644 index 00000000..db06e222 --- /dev/null +++ b/test/js/promise_rejection_tracker.js @@ -0,0 +1 @@ +Promise.reject(1); \ No newline at end of file diff --git a/test/njs_expect_test.exp b/test/njs_expect_test.exp index e04a89ed..cc3bebeb 100644 --- a/test/njs_expect_test.exp +++ b/test/njs_expect_test.exp @@ -1085,6 +1085,10 @@ njs_run {"./test/js/promise_reject_catch.js"} \ njs_run {"./test/js/promise_reject_post_catch.js"} \ "Error: unhandled promise rejection: undefined" +njs_run {"./test/js/promise_rejection_tracker.js"} \ +"Thrown: +Error: unhandled promise rejection: 1" + njs_run {"./test/js/promise_all.js"} \ "resolved:\\\[\\\['one','two'],\\\['three','four']]"