*/
njs_ret_t jump_offset;
njs_generator_patch_t *next;
- /*
- * index_offset is used for patching vmcode_try_return instruction
- * inside try blocks.
- */
- njs_index_t index_offset;
};
njs_generator_patch_t *continuation;
njs_generator_patch_t *exit;
njs_generator_block_t *next;
+
+ njs_index_t index;
};
njs_generator_t *generator, njs_generator_block_t *block, njs_ret_t offset);
static nxt_noinline void njs_generate_patch_block(njs_vm_t *vm,
njs_generator_t *generator, njs_generator_patch_t *list);
-static nxt_noinline void njs_generate_patch_try_exit_block(njs_vm_t *vm,
- njs_generator_t *generator, njs_generator_patch_t *list, njs_index_t dest);
static nxt_int_t njs_generate_make_exit_patch(njs_vm_t *vm,
njs_generator_t *generator, njs_generator_block_t *block, njs_ret_t offset);
static nxt_noinline void njs_generate_patch_block_exit(njs_vm_t *vm,
return NXT_ERROR;
}
- patch->index_offset = 0;
patch->jump_offset = njs_code_offset(generator, equal)
+ offsetof(njs_vmcode_equal_jump_t, offset);
block->continuation = NULL;
block->exit = NULL;
+ block->index = 0;
+
return NXT_OK;
}
patch->next = block->continuation;
block->continuation = patch;
- patch->index_offset = 0;
patch->jump_offset = offset;
return NXT_OK;
}
-static nxt_noinline void
-njs_generate_patch_try_exit_block(njs_vm_t *vm, njs_generator_t *generator,
- njs_generator_patch_t *list, njs_index_t dest)
-{
- njs_generator_patch_t *patch, *next;
-
- for (patch = list; patch != NULL; patch = next) {
- njs_code_update_offset(generator, patch);
- next = patch->next;
-
- if (patch->index_offset != 0) {
- *(njs_code_ptr(generator, njs_index_t, patch->index_offset)) = dest;
- }
-
- nxt_mem_cache_free(vm->mem_cache_pool, patch);
- }
-}
-
-
static nxt_int_t
njs_generate_make_exit_patch(njs_vm_t *vm, njs_generator_t *generator,
njs_generator_block_t *block, njs_ret_t offset)
patch->next = block->exit;
block->exit = patch;
- patch->index_offset = 0;
patch->jump_offset = offset;
return NXT_OK;
jump->code.retval = NJS_VMCODE_NO_RETVAL;
jump->offset = offsetof(njs_vmcode_jump_t, offset);
- patch->index_offset = 0;
patch->jump_offset = njs_code_offset(generator, jump)
+ offsetof(njs_vmcode_jump_t, offset);
}
jump->code.retval = NJS_VMCODE_NO_RETVAL;
jump->offset = offsetof(njs_vmcode_jump_t, offset);
- patch->index_offset = 0;
patch->jump_offset = njs_code_offset(generator, jump)
+ offsetof(njs_vmcode_jump_t, offset);
}
try_return->code.operands = NJS_VMCODE_2OPERANDS;
try_return->code.retval = NJS_VMCODE_RETVAL;
try_return->retval = index;
-
- try_return->save = index;
- patch->index_offset = njs_code_offset(generator, try_return)
- + offsetof(njs_vmcode_try_return_t, save);
+ try_return->save = block->index;
try_return->offset = offsetof(njs_vmcode_try_return_t, offset);
patch->jump_offset = njs_code_offset(generator, try_return)
return ret;
}
+ try_block = generator->block;
+ try_block->index = exit_index;
+
ret = njs_generator(vm, generator, node->left);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
}
- try_block = generator->block;
-
njs_generate_code(generator, njs_vmcode_try_end_t, try_end);
try_end_offset = njs_code_offset(generator, try_end);
try_end->code.operation = njs_vmcode_try_end;
try_end->code.retval = NJS_VMCODE_NO_RETVAL;
if (try_block->exit != NULL) {
- njs_generate_patch_try_exit_block(vm, generator, try_block->exit,
- exit_index);
+ njs_generate_patch_block(vm, generator, try_block->exit);
njs_generate_code(generator, njs_vmcode_try_trampoline_t, try_break);
try_break->code.operation = njs_vmcode_try_break;
return ret;
}
+ catch_block = generator->block;
+ catch_block->index = exit_index;
+
ret = njs_generator(vm, generator, node->left->right);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
}
- catch_block = generator->block;
-
njs_generate_code(generator, njs_vmcode_try_end_t, catch_end);
catch_end_offset = njs_code_offset(generator, catch_end);
catch_end->code.operation = njs_vmcode_try_end;
catch_end->code.retval = NJS_VMCODE_NO_RETVAL;
if (catch_block->exit != NULL) {
- njs_generate_patch_try_exit_block(vm, generator,
- catch_block->exit,
- exit_index);
+ njs_generate_patch_block(vm, generator, catch_block->exit);
njs_generate_code(generator, njs_vmcode_try_trampoline_t,
try_break);