From 8c895b2974b94a8574ce94f40fb3b058387a6b28 Mon Sep 17 00:00:00 2001 From: Alexander Borisov Date: Thu, 25 Jun 2020 13:10:03 +0300 Subject: [PATCH] Parser: fixed broken object literals parsing. --- src/njs_parser.c | 9 ++++++--- src/test/njs_unit_test.c | 20 +++++++++++++++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/njs_parser.c b/src/njs_parser.c index be232f18..39f43db2 100644 --- a/src/njs_parser.c +++ b/src/njs_parser.c @@ -1694,7 +1694,7 @@ njs_parser_object_literal(njs_parser_t *parser, njs_lexer_token_t *token, njs_parser_next(parser, njs_parser_property_definition_list); - return njs_parser_after(parser, current, node, 0, + return njs_parser_after(parser, current, node, 1, njs_parser_object_literal_after); } @@ -1733,7 +1733,7 @@ njs_parser_property_definition_list(njs_parser_t *parser, { njs_parser_next(parser, njs_parser_property_definition); - return njs_parser_after(parser, current, parser->target, 0, + return njs_parser_after(parser, current, parser->target, 1, njs_parser_property_definition_list_after); } @@ -1750,7 +1750,7 @@ njs_parser_property_definition_list_after(njs_parser_t *parser, njs_parser_next(parser, njs_parser_property_definition); - return njs_parser_after(parser, current, parser->target, 0, + return njs_parser_after(parser, current, parser->target, 1, njs_parser_property_definition_list_after); } @@ -1866,6 +1866,9 @@ njs_parser_property_definition(njs_parser_t *parser, njs_lexer_token_t *token, temp = parser->target; switch (token->type) { + case NJS_TOKEN_CLOSE_BRACE: + return njs_parser_stack_pop(parser); + /* PropertyName */ case NJS_TOKEN_STRING: case NJS_TOKEN_ESCAPE_STRING: diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index c8b8b09e..b5812579 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -11713,7 +11713,7 @@ static njs_unit_test_t njs_test[] = njs_str("RangeError: Maximum call stack size exceeded") }, { njs_str("new Function(\"{[\".repeat(2**13));"), - njs_str("SyntaxError: Unexpected token \")\" in runtime:1") }, + njs_str("SyntaxError: Unexpected token \"}\" in runtime:1") }, { njs_str("new Function(\"{;\".repeat(2**13));"), njs_str("SyntaxError: Unexpected token \")\" in runtime:1") }, @@ -17022,6 +17022,24 @@ static njs_unit_test_t njs_test[] = { njs_str("object?."), njs_str("SyntaxError: Unexpected end of input in 1") }, + + { njs_str("`${{a: 1, b}}`"), + njs_str("ReferenceError: \"b\" is not defined in 1") }, + + { njs_str("`${{a: 1, b:}}`"), + njs_str("SyntaxError: Unexpected token \"}\" in 1") }, + + { njs_str("`${{a: 1, b:,}}`"), + njs_str("SyntaxError: Unexpected token \",\" in 1") }, + + { njs_str("`${{a: 1, b: 2,}}`"), + njs_str("[object Object]") }, + + { njs_str("`${{a: 1,, b: 2}}`"), + njs_str("SyntaxError: Unexpected token \",\" in 1") }, + + { njs_str("`${{f(){-} - {}}`"), + njs_str("SyntaxError: Unexpected token \"}\" in 1") }, }; -- 2.47.3