]> git.kaiwu.me - njs.git/commitdiff
Introduced reserved words in strict mode.
authorAlexander Borisov <alexander.borisov@nginx.com>
Fri, 30 Apr 2021 13:02:20 +0000 (16:02 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Fri, 30 Apr 2021 13:02:20 +0000 (16:02 +0300)
src/njs_lexer_tables.h
src/njs_parser.c
src/test/njs_unit_test.c
utils/lexer_keyword.py

index c9ad680d047f040b37addd853b8844d1bdca21a8..e65032529765f1773cb672f8b46542e869d7feb4 100644 (file)
@@ -159,7 +159,7 @@ static const njs_keyword_t njs_lexer_kws[54] =
     {
         .entry = { njs_str("implements") },
         .type = NJS_TOKEN_IMPLEMENTS,
-        .reserved = 0
+        .reserved = 1
     },
 
     {
@@ -183,13 +183,13 @@ static const njs_keyword_t njs_lexer_kws[54] =
     {
         .entry = { njs_str("interface") },
         .type = NJS_TOKEN_INTERFACE,
-        .reserved = 0
+        .reserved = 1
     },
 
     {
         .entry = { njs_str("let") },
         .type = NJS_TOKEN_LET,
-        .reserved = 0
+        .reserved = 1
     },
 
     {
@@ -219,25 +219,25 @@ static const njs_keyword_t njs_lexer_kws[54] =
     {
         .entry = { njs_str("package") },
         .type = NJS_TOKEN_PACKAGE,
-        .reserved = 0
+        .reserved = 1
     },
 
     {
         .entry = { njs_str("private") },
         .type = NJS_TOKEN_PRIVATE,
-        .reserved = 0
+        .reserved = 1
     },
 
     {
         .entry = { njs_str("protected") },
         .type = NJS_TOKEN_PROTECTED,
-        .reserved = 0
+        .reserved = 1
     },
 
     {
         .entry = { njs_str("public") },
         .type = NJS_TOKEN_PUBLIC,
-        .reserved = 0
+        .reserved = 1
     },
 
     {
@@ -249,7 +249,7 @@ static const njs_keyword_t njs_lexer_kws[54] =
     {
         .entry = { njs_str("static") },
         .type = NJS_TOKEN_STATIC,
-        .reserved = 0
+        .reserved = 1
     },
 
     {
index 259e0dc26b446ead8c7a9f22eb07065143c1a21c..2b41ae7370456a51863ecbf024656995845726c9 100644 (file)
@@ -4550,6 +4550,12 @@ njs_parser_declaration(njs_parser_t *parser, njs_lexer_token_t *token,
             break;
 
         default:
+            if (njs_lexer_token_is_reserved(token)) {
+                njs_lexer_consume_token(parser->lexer, 1);
+                njs_parser_next(parser, njs_parser_failed_state);
+                return NJS_OK;
+            }
+
             if (njs_lexer_token_is_binding_identifier(token)) {
                 njs_parser_next(parser, njs_parser_lexical_declaration);
                 break;
index 5aa43f93cf0848f38181a32ae983a95e83a5437b..5d1e3ea34a91ebcba4e55409800f0826e1bda306 100644 (file)
@@ -9475,6 +9475,12 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("function f(){} typeof(f)"),
       njs_str("function") },
 
+    { njs_str("function let() {}"),
+      njs_str("SyntaxError: Unexpected token \"let\" in 1") },
+
+    { njs_str("function static() {}"),
+      njs_str("SyntaxError: Unexpected token \"static\" in 1") },
+
     /* Recursive factorial. */
 
     { njs_str("function f(a) {"
@@ -18101,7 +18107,7 @@ static njs_unit_test_t  njs_test[] =
 
     { njs_str("var let = 123;"
               "let"),
-      njs_str("123") },
+      njs_str("SyntaxError: Unexpected token \"let\" in 1") },
 
     { njs_str("var const = 123"),
       njs_str("SyntaxError: Unexpected token \"const\" in 1") },
index 8ba967deeeda0d551df67ae0cd3346f182a8e737..253aaadf7145ce38aee860722967be9e30f19388 100755 (executable)
@@ -64,14 +64,14 @@ global_keywords = {
     "debugger": 1,
     "enum": 1,
     "extends": 1,
-    "implements": 0,
-    "interface": 0,
-    "let": 0,
-    "package": 0,
-    "private": 0,
-    "protected": 0,
-    "public": 0,
-    "static": 0,
+    "implements": 1,
+    "interface": 1,
+    "let": 1,
+    "package": 1,
+    "private": 1,
+    "protected": 1,
+    "public": 1,
+    "static": 1,
     "super": 1
 }