]> git.kaiwu.me - njs.git/commitdiff
Parser: fixed broken object literals parsing.
authorAlexander Borisov <alexander.borisov@nginx.com>
Thu, 25 Jun 2020 10:10:03 +0000 (13:10 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Thu, 25 Jun 2020 10:10:03 +0000 (13:10 +0300)
src/njs_parser.c
src/test/njs_unit_test.c

index be232f1881e1a4f4e532bad3572444d4b032bacd..39f43db22cc3f4b123c479ae3fd2825ba3732492 100644 (file)
@@ -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:
index c8b8b09e4e49215bede147e1ea1a2efd2dcb86a0..b5812579e49c99afeb3d59dc70a2d4037eeb393b 100644 (file)
@@ -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") },
 };