Welcome! Log In Create A New Profile

Advanced

[njs] Making generator block for block statements.

Dmitry Volyntsev
January 17, 2019 09:04AM
details: https://hg.nginx.org/njs/rev/0f919fb820e8
branches:
changeset: 729:0f919fb820e8
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Wed Jan 16 18:58:23 2019 +0300
description:
Making generator block for block statements.

diffstat:

njs/njs_generator.c | 28 +++++++++++++++++++
njs/njs_parser.c | 75 +++++++++++++++++++++++++++++++++++++++++++++-------
njs/njs_parser.h | 1 +
3 files changed, 93 insertions(+), 11 deletions(-)

diffs (230 lines):

diff -r 4c0de77ef946 -r 0f919fb820e8 njs/njs_generator.c
--- a/njs/njs_generator.c Wed Jan 16 18:55:16 2019 +0300
+++ b/njs/njs_generator.c Wed Jan 16 18:58:23 2019 +0300
@@ -99,6 +99,8 @@ static nxt_int_t njs_generate_break_stat
njs_generator_t *generator, njs_parser_node_t *node);
static nxt_int_t njs_generate_statement(njs_vm_t *vm,
njs_generator_t *generator, njs_parser_node_t *node);
+static nxt_int_t njs_generate_block_statement(njs_vm_t *vm,
+ njs_generator_t *generator, njs_parser_node_t *node);
static nxt_int_t njs_generate_children(njs_vm_t *vm, njs_generator_t *generator,
njs_parser_node_t *node);
static nxt_int_t njs_generate_stop_statement(njs_vm_t *vm,
@@ -257,6 +259,9 @@ njs_generator(njs_vm_t *vm, njs_generato
case NJS_TOKEN_STATEMENT:
return njs_generate_statement(vm, generator, node);

+ case NJS_TOKEN_BLOCK:
+ return njs_generate_block_statement(vm, generator, node);
+
case NJS_TOKEN_END:
return njs_generate_stop_statement(vm, generator, node);

@@ -1507,6 +1512,29 @@ njs_generate_statement(njs_vm_t *vm, njs


static nxt_int_t
+njs_generate_block_statement(njs_vm_t *vm, njs_generator_t *generator,
+ njs_parser_node_t *node)
+{
+ nxt_int_t ret;
+
+ ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_BLOCK,
+ &no_label);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
+ }
+
+ ret = njs_generate_statement(vm, generator, node->left);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
+ }
+
+ njs_generate_patch_block_exit(vm, generator);
+
+ return ret;
+}
+
+
+static nxt_int_t
njs_generate_children(njs_vm_t *vm, njs_generator_t *generator,
njs_parser_node_t *node)
{
diff -r 4c0de77ef946 -r 0f919fb820e8 njs/njs_parser.c
--- a/njs/njs_parser.c Wed Jan 16 18:55:16 2019 +0300
+++ b/njs/njs_parser.c Wed Jan 16 18:58:23 2019 +0300
@@ -19,6 +19,8 @@ static njs_token_t njs_parser_statement(
njs_token_t token);
static njs_token_t 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);
static njs_token_t njs_parser_function_declaration(njs_vm_t *vm,
njs_parser_t *parser);
static njs_parser_t *njs_parser_function_create(njs_vm_t *vm,
@@ -390,8 +392,9 @@ njs_parser_statement(njs_vm_t *vm, njs_p
static njs_token_t
njs_parser_block_statement(njs_vm_t *vm, njs_parser_t *parser)
{
- njs_ret_t ret;
- njs_token_t token;
+ njs_ret_t ret;
+ njs_token_t token;
+ njs_parser_node_t *node;

token = njs_parser_token(parser);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
@@ -412,12 +415,48 @@ njs_parser_block_statement(njs_vm_t *vm,
}
}

+ if (parser->node != NULL) {
+ /* The statement is not empty block or just semicolon. */
+
+ node = njs_parser_node_alloc(vm);
+ if (nxt_slow_path(node == NULL)) {
+ return NJS_TOKEN_ERROR;
+ }
+
+ node->token = NJS_TOKEN_BLOCK;
+ node->left = parser->node;
+ node->right = NULL;
+ parser->node = node;
+ }
+
njs_parser_scope_end(vm, parser);

return njs_parser_token(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;
+
+ 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_mem_cache_free(vm->mem_cache_pool, node);
+ }
+
+ return token;
+}
+
+
nxt_inline njs_token_t
njs_parser_match(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
njs_token_t match)
@@ -933,7 +972,7 @@ njs_parser_if_statement(njs_vm_t *vm, nj

cond = parser->node;

- token = njs_parser_statement(vm, parser, token);
+ token = njs_parser_block(vm, parser, token);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
@@ -947,7 +986,7 @@ njs_parser_if_statement(njs_vm_t *vm, nj
return token;
}

- token = njs_parser_statement(vm, parser, token);
+ token = njs_parser_block(vm, parser, token);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
@@ -1104,7 +1143,7 @@ njs_parser_while_statement(njs_vm_t *vm,

cond = parser->node;

- token = njs_parser_statement(vm, parser, token);
+ token = njs_parser_block(vm, parser, token);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
@@ -1134,7 +1173,7 @@ njs_parser_do_while_statement(njs_vm_t *
return token;
}

- token = njs_parser_statement(vm, parser, token);
+ token = njs_parser_block(vm, parser, token);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
@@ -1252,7 +1291,7 @@ njs_parser_for_statement(njs_vm_t *vm, n
return token;
}

- token = njs_parser_statement(vm, parser, token);
+ token = njs_parser_block(vm, parser, token);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
@@ -1418,7 +1457,7 @@ njs_parser_for_var_in_statement(njs_vm_t
return token;
}

- token = njs_parser_statement(vm, parser, token);
+ token = njs_parser_block(vm, parser, token);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
@@ -1467,7 +1506,7 @@ njs_parser_for_in_statement(njs_vm_t *vm
return token;
}

- token = njs_parser_statement(vm, parser, token);
+ token = njs_parser_block(vm, parser, token);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
@@ -1677,14 +1716,28 @@ njs_parser_try_statement(njs_vm_t *vm, n
static njs_token_t
njs_parser_try_block(njs_vm_t *vm, njs_parser_t *parser)
{
- njs_token_t token;
+ njs_token_t token;
+ njs_parser_node_t *node;

token = njs_parser_token(parser);
if (nxt_slow_path(token != NJS_TOKEN_OPEN_BRACE)) {
return NJS_TOKEN_ILLEGAL;
}

- return njs_parser_block_statement(vm, parser);
+ token = njs_parser_block_statement(vm, parser);
+ 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_mem_cache_free(vm->mem_cache_pool, node);
+ }
+
+ return token;
}


diff -r 4c0de77ef946 -r 0f919fb820e8 njs/njs_parser.h
--- a/njs/njs_parser.h Wed Jan 16 18:55:16 2019 +0300
+++ b/njs/njs_parser.h Wed Jan 16 18:58:23 2019 +0300
@@ -138,6 +138,7 @@ typedef enum {
NJS_TOKEN_EXTERNAL,

NJS_TOKEN_STATEMENT,
+ NJS_TOKEN_BLOCK,
NJS_TOKEN_VAR,
NJS_TOKEN_IF,
NJS_TOKEN_ELSE,
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Making generator block for block statements.

Dmitry Volyntsev 220 January 17, 2019 09:04AM



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

Online Users

Guests: 288
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