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,
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);
}
+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)
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,
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)) {
}
}
+ 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)
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}