details: http://hg.nginx.org/njs/rev/729072cc162f branches: changeset: 559:729072cc162f user: Dmitry Volyntsev <xei...@nginx.com> date: Tue Jul 17 20:25:47 2018 +0300 description: Fixed exception handling in njs_vm_value_to_ext_string().
diffstat: njs/njs_vm.c | 14 ++++++++++++-- njs/test/njs_expect_test.exp | 7 +++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diffs (55 lines): diff -r 04dc301f7d5a -r 729072cc162f njs/njs_vm.c --- a/njs/njs_vm.c Mon Jul 16 14:30:41 2018 +0300 +++ b/njs/njs_vm.c Tue Jul 17 20:25:47 2018 +0300 @@ -3273,8 +3273,9 @@ fail: static njs_ret_t njs_object_value_to_string(njs_vm_t *vm, njs_value_t *value) { - u_char *current; - njs_ret_t ret; + u_char *current; + njs_ret_t ret; + njs_native_frame_t *previous; static const njs_vmcode_1addr_t value_to_string[] = { { .code = { .operation = njs_vmcode_value_to_string, @@ -3298,6 +3299,14 @@ njs_object_value_to_string(njs_vm_t *vm, njs_set_invalid(&vm->top_frame->trap_scratch); vm->top_frame->trap_values[0] = *value; + /* + * Prevent njs_vmcode_interpreter() to unwind the current frame if + * an exception happens. It preserves the current frame state if + * njs_vm_value_to_ext_string() is called from within njs_vm_run(). + */ + previous = vm->top_frame->previous; + vm->top_frame->previous = NULL; + ret = njs_vmcode_interpreter(vm); if (ret == NJS_STOP) { @@ -3306,6 +3315,7 @@ njs_object_value_to_string(njs_vm_t *vm, } vm->current = current; + vm->top_frame->previous = previous; return ret; } diff -r 04dc301f7d5a -r 729072cc162f njs/test/njs_expect_test.exp --- a/njs/test/njs_expect_test.exp Mon Jul 16 14:30:41 2018 +0300 +++ b/njs/test/njs_expect_test.exp Tue Jul 17 20:25:47 2018 +0300 @@ -203,6 +203,13 @@ njs_test { "JSON.parse(Error()\r\nSyntaxError: Unexpected token \"\" in 1"} } +njs_test { + {"try { console.log({ toString: function() { throw 'test'; } }) } catch (e) {}\r\n" + "undefined"} + {"function f() { throw 't' }; try { console.log({ toString: function() { return f() } }) } catch (e) {}\r\n" + "undefined"} +} + # Non-ASCII characters njs_test { {"'絵文字'\r\n" _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel