From 2d2c22c6399c20f774e1dc1786e463378cfe204e Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Fri, 22 Jul 2016 14:38:06 +0300 Subject: [PATCH] Duplicate function names are disabled. --- njs/njs_parser.c | 4 ++-- njs/njs_parser.h | 1 + njs/njs_variable.c | 31 +++++++++++++++++++++++++++++++ njs/njs_variable.h | 1 + njs/test/njs_unit_test.c | 9 +++++++++ 5 files changed, 44 insertions(+), 2 deletions(-) diff --git a/njs/njs_parser.c b/njs/njs_parser.c index dce0ef5d..20a00d1a 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -290,7 +290,6 @@ njs_parser_match(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token, static njs_token_t njs_parser_function_declaration(njs_vm_t *vm, njs_parser_t *parser) { - nxt_uint_t level; njs_token_t token; njs_value_t *value; njs_variable_t *var; @@ -313,7 +312,7 @@ njs_parser_function_declaration(njs_vm_t *vm, njs_parser_t *parser) return NJS_TOKEN_ILLEGAL; } - var = njs_parser_variable(vm, parser, &level); + var = njs_parser_name_alloc(vm, parser); if (nxt_slow_path(var == NULL)) { return NJS_TOKEN_ERROR; } @@ -2241,6 +2240,7 @@ njs_parser_error(njs_vm_t *vm, njs_parser_t *parser, njs_parser_error_t err) "SyntaxError: Invalid Unicode code point \"%.*s\" in %u", "SyntaxError: Unterminated RegExp \"%.*s\" in %u", "SyntaxError: Invalid RegExp flags \"%.*s\" in %u", + "SyntaxError: Duplicate declaration \"%.*s\" in %u", }; msg = errors[err]; diff --git a/njs/njs_parser.h b/njs/njs_parser.h index a40b4ae4..359e92f1 100644 --- a/njs/njs_parser.h +++ b/njs/njs_parser.h @@ -324,6 +324,7 @@ typedef enum { NJS_PARSER_ERROR_UNICODE, NJS_PARSER_ERROR_UNTERMINATED_REGEXP, NJS_PARSER_ERROR_REGEXP_FLAGS, + NJS_PARSER_ERROR_DUPLICATE_DECLARATION, } njs_parser_error_t; diff --git a/njs/njs_variable.c b/njs/njs_variable.c index 7ad8c6b8..46c34d88 100644 --- a/njs/njs_variable.c +++ b/njs/njs_variable.c @@ -53,6 +53,37 @@ static const nxt_lvlhsh_proto_t njs_variables_hash_proto }; +njs_variable_t * +njs_parser_name_alloc(njs_vm_t *vm, njs_parser_t *parser) +{ + nxt_int_t ret; + njs_variable_t *var; + nxt_lvlhsh_query_t lhq; + + var = njs_variable_alloc(vm, parser, &parser->lexer->text); + if (nxt_slow_path(var == NULL)) { + return NULL; + } + + lhq.key_hash = parser->lexer->key_hash; + lhq.key = parser->lexer->text; + lhq.replace = 0; + lhq.value = var; + lhq.proto = &njs_variables_hash_proto; + lhq.pool = vm->mem_cache_pool; + + ret = nxt_lvlhsh_insert(&parser->variables_hash, &lhq); + + if (nxt_fast_path(ret == NXT_OK)) { + return var; + } + + (void) njs_parser_error(vm, parser, NJS_PARSER_ERROR_DUPLICATE_DECLARATION); + + return NULL; +} + + njs_variable_t * njs_parser_variable(njs_vm_t *vm, njs_parser_t *parser, nxt_uint_t *level) { diff --git a/njs/njs_variable.h b/njs/njs_variable.h index edb500d9..0d02d139 100644 --- a/njs/njs_variable.h +++ b/njs/njs_variable.h @@ -26,6 +26,7 @@ typedef struct { } njs_variable_t; +njs_variable_t *njs_parser_name_alloc(njs_vm_t *vm, njs_parser_t *parser); njs_variable_t *njs_parser_variable(njs_vm_t *vm, njs_parser_t *parser, nxt_uint_t *level); njs_value_t *njs_variable_value(njs_parser_t *parser, njs_index_t index); diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index ca2f95db..d678e6fb 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -67,6 +67,15 @@ static njs_unit_test_t njs_test[] = { nxt_string("var a = 1; var b; a"), nxt_string("1") }, + { nxt_string("function f(){} function f(){}"), + nxt_string("SyntaxError: Duplicate declaration \"f\" in 1") }, + + { nxt_string("var f = 1; function f() {}"), + nxt_string("SyntaxError: Duplicate declaration \"f\" in 1") }, + + { nxt_string("function f() {} var f = 1; f"), + nxt_string("1") }, + /* Numbers. */ { nxt_string("999999999999999999999"), -- 2.47.3