From a42dadd0af51f7fb56a1e4daf3c54eaca269536a Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Thu, 22 Nov 2018 15:02:19 +0300 Subject: [PATCH] Fixed handling of unexpected tokens in parser. This fixes #50 issue on Github. --- njs/njs.c | 2 ++ njs/njs_parser.c | 8 ++++---- njs/test/njs_interactive_test.c | 4 ++++ njs/test/njs_unit_test.c | 3 +++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/njs/njs.c b/njs/njs.c index e687ebdc..1ac1125a 100644 --- a/njs/njs.c +++ b/njs/njs.c @@ -252,6 +252,8 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end) nxt_array_reset(vm->backtrace); } + vm->retval = njs_value_void; + node = njs_parser(vm, parser, prev); if (nxt_slow_path(node == NULL)) { goto fail; diff --git a/njs/njs_parser.c b/njs/njs_parser.c index dad90874..f0aaa516 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -639,7 +639,7 @@ njs_parser_function_lambda(njs_vm_t *vm, njs_function_lambda_t *lambda, while (token != NJS_TOKEN_CLOSE_PARENTHESIS) { if (nxt_slow_path(token != NJS_TOKEN_NAME)) { - return NJS_TOKEN_ERROR; + return NJS_TOKEN_ILLEGAL; } arg = njs_variable_add(vm, parser, NJS_VARIABLE_VAR); @@ -676,7 +676,7 @@ njs_parser_function_lambda(njs_vm_t *vm, njs_function_lambda_t *lambda, } if (nxt_slow_path(token != NJS_TOKEN_OPEN_BRACE)) { - return NJS_TOKEN_ERROR; + return NJS_TOKEN_ILLEGAL; } token = njs_parser_token(parser); @@ -1649,7 +1649,7 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser) } if (nxt_slow_path(token != NJS_TOKEN_CLOSE_PARENTHESIS)) { - return token; + return NJS_TOKEN_ILLEGAL; } token = njs_parser_try_block(vm, parser); @@ -1689,7 +1689,7 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser) if (try->right == NULL) { njs_parser_syntax_error(vm, parser, - "Missing catch or finally after try", NULL); + "Missing catch or finally after try"); return NJS_TOKEN_ILLEGAL; } diff --git a/njs/test/njs_interactive_test.c b/njs/test/njs_interactive_test.c index 6ee9773a..e83c08c3 100644 --- a/njs/test/njs_interactive_test.c +++ b/njs/test/njs_interactive_test.c @@ -106,6 +106,10 @@ static njs_interactive_test_t njs_test[] = "f({})" ENTER), nxt_string("1") }, + { nxt_string("arguments" ENTER + "function(){}()" ENTER), + nxt_string("SyntaxError: Unexpected token \"(\" in 1") }, + /* Backtraces */ { nxt_string("function ff(o) {return o.a.a}" ENTER diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index ccd793be..4c2e5ec9 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -6356,6 +6356,9 @@ static njs_unit_test_t njs_test[] = { nxt_string("try {}"), nxt_string("SyntaxError: Missing catch or finally after try in 1") }, + { nxt_string("try{}catch(a[]"), + nxt_string("SyntaxError: Unexpected token \"[\" in 1") }, + { nxt_string("function f(a) {return a;}; " "function thrower() {throw TypeError('Oops')}; " "f(thrower())"), -- 2.47.3