static const njs_str_t undef_label = { 0xffffffff, (u_char *) "" };
+njs_inline const njs_str_t *
+njs_generate_node_label(njs_vm_t *vm, njs_parser_node_t *node,
+ njs_str_t *label)
+{
+ if (node->u.label == NJS_ATOM_STRING_unknown) {
+ return &no_label;
+ }
+
+ njs_atom_string_get(vm, node->u.label, label);
+
+ return label;
+}
+
+
njs_int_t
njs_generator_init(njs_generator_t *generator, njs_str_t *file,
njs_int_t depth, njs_bool_t runtime)
njs_parser_node_t *node)
{
njs_int_t ret;
+ njs_str_t label;
ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_BLOCK,
- &node->name);
+ njs_generate_node_label(vm, node, &label));
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
njs_parser_node_t *swtch)
{
njs_int_t ret;
+ njs_str_t label;
njs_parser_node_t *expr;
njs_vmcode_move_t *move;
njs_generator_switch_ctx_t *ctx;
}
ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_SWITCH,
- &swtch->name);
+ njs_generate_node_label(vm, swtch, &label));
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
njs_parser_node_t *node)
{
njs_int_t ret;
+ njs_str_t label;
njs_vmcode_jump_t *jump;
njs_generator_loop_ctx_t ctx;
ctx.jump_offset = njs_code_offset(generator, jump);
ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
- &node->name);
+ njs_generate_node_label(vm, node, &label));
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
njs_parser_node_t *node)
{
njs_int_t ret;
+ njs_str_t label;
njs_generator_loop_ctx_t ctx;
ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
- &node->name);
+ njs_generate_node_label(vm, node, &label));
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
njs_parser_node_t *node)
{
njs_int_t ret;
+ njs_str_t label;
njs_generator_loop_ctx_t ctx;
ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
- &node->name);
+ njs_generate_node_label(vm, node, &label));
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
njs_parser_node_t *node)
{
njs_int_t ret;
+ njs_str_t label;
njs_parser_node_t *foreach, *name;
njs_generator_loop_ctx_t ctx;
ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
- &node->name);
+ njs_generate_node_label(vm, node, &label));
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
njs_generate_continue_statement(njs_vm_t *vm, njs_generator_t *generator,
njs_parser_node_t *node)
{
+ njs_str_t name;
const njs_str_t *label, *dest;
njs_vmcode_jump_t *jump;
njs_generator_patch_t *patch;
njs_generator_block_t *block;
- label = &node->name;
+ label = njs_generate_node_label(vm, node, &name);
block = njs_generate_find_block(vm, generator->block, NJS_GENERATOR_LOOP,
label);
njs_generate_break_statement(njs_vm_t *vm, njs_generator_t *generator,
njs_parser_node_t *node)
{
+ njs_str_t name;
const njs_str_t *label, *dest;
njs_vmcode_jump_t *jump;
njs_generator_patch_t *patch;
njs_generator_block_t *block;
- label = &node->name;
+ label = njs_generate_node_label(vm, node, &name);
block = njs_generate_find_block(vm, generator->block, NJS_GENERATOR_ALL,
label);
njs_parser_node_t *node)
{
njs_int_t ret;
+ njs_str_t label;
njs_queue_link_t *link;
ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_BLOCK,
- &node->name);
+ njs_generate_node_label(vm, node, &label));
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
njs_lexer_token_t *token, njs_queue_link_t *current);
static njs_int_t njs_parser_labelled_statement_after(njs_parser_t *parser,
njs_lexer_token_t *token, njs_queue_link_t *current);
+static void njs_parser_statement_label(njs_parser_node_t *node,
+ uintptr_t atom_id);
static njs_int_t njs_parser_throw_statement(njs_parser_t *parser,
njs_lexer_token_t *token, njs_queue_link_t *current);
njs_parser_break_continue(njs_parser_t *parser, njs_lexer_token_t *token,
njs_token_type_t type)
{
- njs_int_t ret;
-
parser->node = njs_parser_node_new(parser, type);
if (parser->node == NULL) {
return NJS_ERROR;
return NJS_DONE;
}
- ret = njs_name_copy(parser->vm, &parser->node->name, &token->text);
- if (ret != NJS_OK) {
- return NJS_ERROR;
- }
+ parser->node->u.label = token->atom_id;
break;
}
njs_lexer_token_t *token, njs_queue_link_t *current)
{
njs_int_t ret;
- njs_str_t str;
uintptr_t atom_id;
njs_parser_node_t *node;
atom_id = (uint32_t) (uintptr_t) parser->target;
- njs_atom_string_get(parser->vm, atom_id, &str);
-
- ret = njs_name_copy(parser->vm, &parser->node->name, &str);
- if (ret != NJS_OK) {
- return NJS_ERROR;
- }
+ njs_parser_statement_label(parser->node, atom_id);
ret = njs_label_remove(parser, atom_id);
if (ret != NJS_OK) {
}
+static void
+njs_parser_statement_label(njs_parser_node_t *node, uintptr_t atom_id)
+{
+ switch (node->token_type) {
+ case NJS_TOKEN_BLOCK:
+ case NJS_TOKEN_IF:
+ case NJS_TOKEN_SWITCH:
+ case NJS_TOKEN_WHILE:
+ case NJS_TOKEN_DO:
+ case NJS_TOKEN_FOR:
+ case NJS_TOKEN_FOR_IN:
+ node->u.label = atom_id;
+ break;
+
+ default:
+ break;
+ }
+}
+
+
/*
* 13.14 throw Statement
*/