From 2dfc99aa73968dbf41270f2c50bd39d92cc2c06e Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Thu, 22 Nov 2018 17:38:40 +0300 Subject: [PATCH] Fixed parsing of throw statement inside if. --- njs/njs_parser.c | 18 +++++++++++++++++- njs/test/njs_unit_test.c | 9 +++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/njs/njs_parser.c b/njs/njs_parser.c index f0aaa516..1252df69 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -1696,7 +1696,23 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser) parser->node = try; - return token; + switch (token) { + + case NJS_TOKEN_SEMICOLON: + case NJS_TOKEN_LINE_END: + return njs_parser_token(parser); + + case NJS_TOKEN_CLOSE_BRACE: + case NJS_TOKEN_END: + return token; + + default: + if (parser->lexer->prev_token == NJS_TOKEN_LINE_END) { + return token; + } + + return NJS_TOKEN_ILLEGAL; + } } diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index c4176494..3beaf395 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -2159,6 +2159,15 @@ static njs_unit_test_t njs_test[] = { nxt_string("(function(){ if(true) return 1\n;\n else return 0; })()"), nxt_string("1") }, + { nxt_string("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(0)"), + nxt_string("1") }, + + { nxt_string("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(1)"), + nxt_string("foo") }, + + { nxt_string("function f(n) {if (n == 1) throw 'foo'\nelse if (n == 2) return 1}; f(2)"), + nxt_string("1") }, + /* do while. */ { nxt_string("do { break } if (false)"), -- 2.47.3