From fd24a4ee8a9328fd24e72e4e21028491a7f0f2b8 Mon Sep 17 00:00:00 2001 From: hongzhidao Date: Mon, 29 Apr 2019 15:57:36 +0300 Subject: [PATCH] Simplified parsing of var statements. --- njs/njs_parser.c | 37 +++++++++++++------------------------ njs/njs_variable.c | 28 +++++++++++++++++++++------- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/njs/njs_parser.c b/njs/njs_parser.c index 54b6c16d..c5071350 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -38,7 +38,7 @@ static njs_parser_node_t *njs_parser_return_set(njs_vm_t *vm, static njs_token_t njs_parser_return_statement(njs_vm_t *vm, njs_parser_t *parser); static njs_token_t njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, - nxt_bool_t var_in); + njs_token_t parent, nxt_bool_t var_in); static njs_token_t njs_parser_if_statement(njs_vm_t *vm, njs_parser_t *parser); static njs_token_t njs_parser_switch_statement(njs_vm_t *vm, njs_parser_t *parser); @@ -377,7 +377,7 @@ njs_parser_statement(njs_vm_t *vm, njs_parser_t *parser, switch (token) { case NJS_TOKEN_VAR: - token = njs_parser_var_statement(vm, parser, 0); + token = njs_parser_var_statement(vm, parser, token, 0); break; case NJS_TOKEN_RETURN: @@ -490,28 +490,13 @@ njs_parser_block_statement(njs_vm_t *vm, njs_parser_t *parser) static njs_token_t njs_parser_block(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) { - njs_parser_node_t *node; - if (token == NJS_TOKEN_FUNCTION) { njs_parser_syntax_error(vm, parser, "Functions can only be declared at top level or inside a block"); return NJS_TOKEN_ILLEGAL; } - token = njs_parser_statement(vm, parser, token); - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { - return token; - } - - node = parser->node; - - if (node != NULL && node->token == NJS_TOKEN_BLOCK) { - parser->node = node->left; - - nxt_mp_free(vm->mem_pool, node); - } - - return token; + return njs_parser_statement(vm, parser, token); } @@ -1051,10 +1036,14 @@ njs_parser_return_statement(njs_vm_t *vm, njs_parser_t *parser) static njs_token_t -njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, nxt_bool_t var_in) +njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, njs_token_t parent, + nxt_bool_t var_in) { - njs_token_t token; - njs_parser_node_t *left, *stmt, *name, *assign, *expr; + njs_token_t token; + njs_parser_node_t *left, *stmt, *name, *assign, *expr; + njs_variable_type_t type; + + type = NJS_VARIABLE_VAR; parser->node = NULL; left = NULL; @@ -1080,7 +1069,7 @@ njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, nxt_bool_t var_in) name = njs_parser_variable_node(vm, parser, njs_parser_text(parser), njs_parser_key_hash(parser), - NJS_VARIABLE_VAR); + type); if (nxt_slow_path(name == NULL)) { return NJS_TOKEN_ERROR; } @@ -1111,7 +1100,7 @@ njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, nxt_bool_t var_in) expr = parser->node; } - assign = njs_parser_node_new(vm, parser, NJS_TOKEN_VAR); + assign = njs_parser_node_new(vm, parser, parent); if (nxt_slow_path(assign == NULL)) { return NJS_TOKEN_ERROR; } @@ -1400,7 +1389,7 @@ njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser) if (token == NJS_TOKEN_VAR) { - token = njs_parser_var_statement(vm, parser, 1); + token = njs_parser_var_statement(vm, parser, token, 1); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } diff --git a/njs/njs_variable.c b/njs/njs_variable.c index ae8b15b1..9b930eb2 100644 --- a/njs/njs_variable.c +++ b/njs/njs_variable.c @@ -91,16 +91,23 @@ njs_variable_scope_add(njs_vm_t *vm, njs_parser_scope_t *scope, if (nxt_lvlhsh_find(&scope->variables, lhq) == NXT_OK) { var = lhq->value; - if (scope->module || scope->type == NJS_SCOPE_BLOCK - || (scope->type == NJS_SCOPE_GLOBAL && vm->options.module)) - { + if (scope->module || scope->type == NJS_SCOPE_BLOCK) { + if (type == NJS_VARIABLE_FUNCTION || var->type == NJS_VARIABLE_FUNCTION) { - njs_parser_syntax_error(vm, vm->parser, - "\"%V\" has already been declared", - &lhq->key); - return NULL; + goto fail; + } + } + + if (scope->type == NJS_SCOPE_GLOBAL) { + + if (vm->options.module) { + if (type == NJS_VARIABLE_FUNCTION + || var->type == NJS_VARIABLE_FUNCTION) + { + goto fail; + } } } @@ -128,6 +135,13 @@ njs_variable_scope_add(njs_vm_t *vm, njs_parser_scope_t *scope, njs_type_error(vm, "lvlhsh insert failed"); return NULL; + +fail: + + njs_parser_syntax_error(vm, vm->parser, + "\"%V\" has already been declared", + &lhq->key); + return NULL; } -- 2.47.3