nxt_int_t
njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
{
- nxt_int_t ret;
- njs_lexer_t *lexer;
- njs_parser_t *parser, *prev;
- njs_generator_t *generator;
- njs_parser_node_t *node;
+ nxt_int_t ret;
+ njs_lexer_t *lexer;
+ njs_parser_t *parser, *prev;
+ njs_generator_t *generator;
parser = nxt_mem_cache_zalloc(vm->mem_cache_pool, sizeof(njs_parser_t));
if (nxt_slow_path(parser == NULL)) {
vm->retval = njs_value_void;
- node = njs_parser(vm, parser, prev);
- if (nxt_slow_path(node == NULL)) {
+ ret = njs_parser(vm, parser, prev);
+ if (nxt_slow_path(ret != NXT_OK)) {
goto fail;
}
nxt_memzero(generator, sizeof(njs_generator_t));
- ret = njs_generate_scope(vm, generator, node);
+ ret = njs_generate_scope(vm, generator, parser->scope);
if (nxt_slow_path(ret != NXT_OK)) {
goto fail;
}
node = node->right;
- ret = njs_generate_scope(vm, generator, node);
+ ret = njs_generate_scope(vm, generator, node->scope);
if (nxt_fast_path(ret == NXT_OK)) {
size = 0;
nxt_int_t
njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator,
- njs_parser_node_t *node)
+ njs_parser_scope_t *scope)
{
- u_char *p;
- size_t size;
- uintptr_t scope_size;
- nxt_int_t ret;
- nxt_uint_t n;
- njs_value_t *value;
- njs_vm_code_t *code;
- njs_parser_scope_t *scope;
-
- scope = node->scope;
+ u_char *p;
+ size_t size;
+ uintptr_t scope_size;
+ nxt_int_t ret;
+ nxt_uint_t n;
+ njs_value_t *value;
+ njs_vm_code_t *code;
generator->code_size = 128;
generator->code_start = p;
generator->code_end = p;
- ret = njs_generate_argument_closures(vm, generator, node);
+ ret = njs_generate_argument_closures(vm, generator, scope->node);
if (nxt_slow_path(ret != NXT_OK)) {
return NXT_ERROR;
}
- if (nxt_slow_path(njs_generator(vm, generator, node) != NXT_OK)) {
+ if (nxt_slow_path(njs_generator(vm, generator, scope->node) != NXT_OK)) {
return NXT_ERROR;
}
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,
- njs_parser_t *parent);
static njs_token_t njs_parser_function_lambda(njs_vm_t *vm,
njs_parser_t *parser, njs_function_lambda_t *lambda, njs_token_t token);
static njs_token_t njs_parser_return_statement(njs_vm_t *vm,
njs_parser_t *parser, njs_token_t token);
-njs_parser_node_t *
+nxt_int_t
njs_parser(njs_vm_t *vm, njs_parser_t *parser, njs_parser_t *prev)
{
njs_ret_t ret;
ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_GLOBAL);
if (nxt_slow_path(ret != NXT_OK)) {
- return NULL;
+ return NXT_ERROR;
}
if (prev != NULL) {
ret = nxt_lvlhsh_insert(variables, &lhq);
if (nxt_slow_path(ret != NXT_OK)) {
- return NULL;
+ return NXT_ERROR;
}
}
}
token = njs_parser_statement_chain(vm, parser, token);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return NULL;
+ return NXT_ERROR;
}
if (token == NJS_TOKEN_CLOSE_BRACE && vm->options.trailer) {
node = njs_parser_node_alloc(vm);
if (nxt_slow_path(node == NULL)) {
- return NULL;
+ return NXT_ERROR;
}
}
node->token = NJS_TOKEN_END;
node->scope = parser->scope;
- return node;
+ parser->scope->node = node;
+
+ return NXT_OK;
}
var->value.type = NJS_FUNCTION;
var->value.data.truth = 1;
- parser = njs_parser_function_create(vm, parser);
- if (nxt_slow_path(parser == NULL)) {
- return NJS_TOKEN_ERROR;
- }
-
token = njs_parser_function_lambda(vm, parser, function->u.lambda, token);
- vm->parser = parser->parent;
-
return token;
}
node->scope = parser->scope;
parser->node = node;
- parser = njs_parser_function_create(vm, parser);
- if (nxt_slow_path(parser == NULL)) {
- return NJS_TOKEN_ERROR;
- }
-
token = njs_parser_token(parser);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
njs_parser_scope_end(vm, parser);
- vm->parser = parser->parent;
-
return token;
}
-static njs_parser_t *
-njs_parser_function_create(njs_vm_t *vm, njs_parser_t *parent)
-{
- njs_parser_t *parser;
-
- parser = nxt_mem_cache_zalloc(vm->mem_cache_pool, sizeof(njs_parser_t));
- if (nxt_slow_path(parser == NULL)) {
- return NULL;
- }
-
- parser->parent = parent;
- parser->scope = parent->scope;
- parser->lexer = parent->lexer;
- vm->parser = parser;
-
- return parser;
-}
-
-
static njs_token_t
njs_parser_function_lambda(njs_vm_t *vm, njs_parser_t *parser,
njs_function_lambda_t *lambda, njs_token_t token)
njs_ret_t ret;
njs_index_t index;
njs_variable_t *arg;
- njs_parser_node_t *node, *body, *last;
+ njs_parser_node_t *node, *body, *last, *parent;
ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_FUNCTION);
if (nxt_slow_path(ret != NXT_OK)) {
return token;
}
+ parent = parser->node;
parser->node = NULL;
while (token != NJS_TOKEN_CLOSE_BRACE) {
node->right->token = NJS_TOKEN_RETURN;
}
- parser->parent->node->right = parser->node;
+ parent->right = parser->node;
+
parser->node->scope = parser->scope;
+ parser->scope->node = parser->node;
+
+ parser->node = parent;
njs_parser_scope_end(vm, parser);