From e919372ec61156ce6fa8f8776b046295ce340463 Mon Sep 17 00:00:00 2001 From: Alexander Borisov Date: Fri, 30 Apr 2021 16:02:20 +0300 Subject: [PATCH] Introduced reserved words in strict mode. --- src/njs_lexer_tables.h | 16 ++++++++-------- src/njs_parser.c | 6 ++++++ src/test/njs_unit_test.c | 8 +++++++- utils/lexer_keyword.py | 16 ++++++++-------- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/njs_lexer_tables.h b/src/njs_lexer_tables.h index c9ad680d..e6503252 100644 --- a/src/njs_lexer_tables.h +++ b/src/njs_lexer_tables.h @@ -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 }, { diff --git a/src/njs_parser.c b/src/njs_parser.c index 259e0dc2..2b41ae73 100644 --- a/src/njs_parser.c +++ b/src/njs_parser.c @@ -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; diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 5aa43f93..5d1e3ea3 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -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") }, diff --git a/utils/lexer_keyword.py b/utils/lexer_keyword.py index 8ba967de..253aaadf 100755 --- a/utils/lexer_keyword.py +++ b/utils/lexer_keyword.py @@ -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 } -- 2.47.3