Welcome! Log In Create A New Profile

Advanced

[njs] Making njs_parser_var_statement() more generic.

Dmitry Volyntsev
April 05, 2019 10:18AM
details: https://hg.nginx.org/njs/rev/f189d8b1c237
branches:
changeset: 871:f189d8b1c237
user: hongzhidao <hongzhidao@gmail.com>
date: Fri Apr 05 21:16:41 2019 +0800
description:
Making njs_parser_var_statement() more generic.

diffstat:

njs/njs_parser.c | 111 +++++++-----------------------------------------------
1 files changed, 16 insertions(+), 95 deletions(-)

diffs (176 lines):

diff -r 5224c5969233 -r f189d8b1c237 njs/njs_parser.c
--- a/njs/njs_parser.c Fri Apr 05 20:59:15 2019 +0800
+++ b/njs/njs_parser.c Fri Apr 05 21:16:41 2019 +0800
@@ -37,7 +37,8 @@ static njs_parser_node_t *njs_parser_ret
njs_parser_t *parser, njs_parser_node_t *expr);
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);
+static njs_token_t njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser,
+ 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);
@@ -46,9 +47,7 @@ static njs_token_t njs_parser_while_stat
static njs_token_t njs_parser_do_while_statement(njs_vm_t *vm,
njs_parser_t *parser);
static njs_token_t njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser);
-static njs_token_t njs_parser_for_var_statement(njs_vm_t *vm,
- njs_parser_t *parser);
-static njs_token_t njs_parser_for_var_in_statement(njs_vm_t *vm,
+static njs_token_t njs_parser_var_in_statement(njs_vm_t *vm,
njs_parser_t *parser, njs_parser_node_t *name);
static njs_token_t njs_parser_for_in_statement(njs_vm_t *vm,
njs_parser_t *parser, nxt_str_t *name, njs_token_t token);
@@ -358,7 +357,7 @@ njs_parser_statement(njs_vm_t *vm, njs_p

switch (token) {
case NJS_TOKEN_VAR:
- token = njs_parser_var_statement(vm, parser);
+ token = njs_parser_var_statement(vm, parser, 0);
break;

case NJS_TOKEN_RETURN:
@@ -1009,7 +1008,7 @@ njs_parser_return_statement(njs_vm_t *vm


static njs_token_t
-njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser)
+njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, nxt_bool_t var_in)
{
njs_token_t token;
njs_parser_node_t *left, *stmt, *name, *assign, *expr;
@@ -1026,15 +1025,17 @@ njs_parser_var_statement(njs_vm_t *vm, n
if (token != NJS_TOKEN_NAME) {
if (token == NJS_TOKEN_ARGUMENTS || token == NJS_TOKEN_EVAL) {
njs_parser_syntax_error(vm, parser, "Identifier \"%V\" "
- "is forbidden in var declaration",
- njs_parser_text(parser));
+ "is forbidden in %s declaration",
+ njs_parser_text(parser),
+ var_in ? "for-in var" : "var");
}

return NJS_TOKEN_ILLEGAL;
}


- name = njs_parser_variable_node(vm, parser, njs_parser_text(parser),
+ name = njs_parser_variable_node(vm, parser,
+ njs_parser_text(parser),
njs_parser_key_hash(parser),
NJS_VARIABLE_VAR);
if (nxt_slow_path(name == NULL)) {
@@ -1046,6 +1047,10 @@ njs_parser_var_statement(njs_vm_t *vm, n
return token;
}

+ if (var_in && token == NJS_TOKEN_IN) {
+ return njs_parser_var_in_statement(vm, parser, name);
+ }
+
expr = NULL;

if (token == NJS_TOKEN_ASSIGNMENT) {
@@ -1353,7 +1358,7 @@ njs_parser_for_statement(njs_vm_t *vm, n

if (token == NJS_TOKEN_VAR) {

- token = njs_parser_for_var_statement(vm, parser);
+ token = njs_parser_var_statement(vm, parser, 1);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
@@ -1452,91 +1457,7 @@ njs_parser_for_statement(njs_vm_t *vm, n


static njs_token_t
-njs_parser_for_var_statement(njs_vm_t *vm, njs_parser_t *parser)
-{
- njs_token_t token;
- njs_parser_node_t *left, *stmt, *name, *assign, *expr;
-
- parser->node = NULL;
- left = NULL;
-
- do {
- token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
-
- if (token != NJS_TOKEN_NAME) {
- if (token == NJS_TOKEN_ARGUMENTS || token == NJS_TOKEN_EVAL) {
- njs_parser_syntax_error(vm, parser, "Identifier \"%V\" "
- "is forbidden in for-in var declaration",
- njs_parser_text(parser));
- }
-
- return NJS_TOKEN_ILLEGAL;
- }
-
- name = njs_parser_variable_node(vm, parser, njs_parser_text(parser),
- njs_parser_key_hash(parser),
- NJS_VARIABLE_VAR);
- if (nxt_slow_path(name == NULL)) {
- return NJS_TOKEN_ERROR;
- }
-
- token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
-
- if (token == NJS_TOKEN_IN) {
- return njs_parser_for_var_in_statement(vm, parser, name);
- }
-
- expr = NULL;
-
- if (token == NJS_TOKEN_ASSIGNMENT) {
-
- token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
-
- token = njs_parser_assignment_expression(vm, parser, token);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
-
- expr = parser->node;
- }
-
- assign = njs_parser_node_new(vm, parser, NJS_TOKEN_VAR);
- if (nxt_slow_path(assign == NULL)) {
- return NJS_TOKEN_ERROR;
- }
-
- assign->u.operation = njs_vmcode_move;
- assign->left = name;
- assign->right = expr;
-
- stmt = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT);
- if (nxt_slow_path(stmt == NULL)) {
- return NJS_TOKEN_ERROR;
- }
-
- stmt->left = left;
- stmt->right = assign;
- parser->node = stmt;
-
- left = stmt;
-
- } while (token == NJS_TOKEN_COMMA);
-
- return token;
-}
-
-
-static njs_token_t
-njs_parser_for_var_in_statement(njs_vm_t *vm, njs_parser_t *parser,
+njs_parser_var_in_statement(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *name)
{
njs_token_t token;
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Making njs_parser_var_statement() more generic.

Dmitry Volyntsev 297 April 05, 2019 10:18AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 285
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready