static njs_int_t njs_generate_for_let_update(njs_vm_t *vm,
njs_generator_t *generator, njs_parser_node_t *node);
static njs_int_t njs_generate_for_resolve_closure(njs_vm_t *vm,
- njs_parser_node_t *node);
+ njs_generator_t *generator, njs_parser_node_t *node);
static njs_int_t njs_generate_for_in_statement(njs_vm_t *vm,
njs_generator_t *generator, njs_parser_node_t *node);
static njs_int_t njs_generate_for_in_set_prop_block(njs_vm_t *vm,
static void njs_generate_patch_block(njs_vm_t *vm, njs_generator_t *generator,
njs_generator_block_t *block, unsigned type);
static njs_generator_patch_t *njs_generate_make_continuation_patch(njs_vm_t *vm,
- njs_generator_block_t *block, const njs_str_t *label,
- njs_jump_off_t offset);
+ njs_generator_t *generator, njs_generator_block_t *block,
+ const njs_str_t *label, njs_jump_off_t offset);
static njs_generator_patch_t *njs_generate_make_exit_patch(njs_vm_t *vm,
- njs_generator_block_t *block, const njs_str_t *label,
- njs_jump_off_t offset);
+ njs_generator_t *generator, njs_generator_block_t *block,
+ const njs_str_t *label, njs_jump_off_t offset);
static void njs_generate_patch_block_exit(njs_vm_t *vm,
njs_generator_t *generator);
static const njs_str_t *njs_generate_jump_destination(njs_vm_t *vm,
njs_int_t
-njs_generator_init(njs_generator_t *generator, njs_str_t *file,
- njs_int_t depth, njs_bool_t runtime)
+njs_generator_init(njs_generator_t *generator, njs_mp_t *mem_pool,
+ njs_str_t *file, njs_int_t depth, njs_bool_t runtime)
{
njs_memzero(generator, sizeof(njs_generator_t));
njs_queue_init(&generator->stack);
+ generator->mem_pool = mem_pool;
generator->file = *file;
generator->depth = depth;
generator->runtime = runtime;
{
njs_generator_stack_entry_t *entry;
- entry = njs_mp_alloc(vm->mem_pool, sizeof(njs_generator_stack_entry_t));
+ entry = njs_mp_alloc(generator->mem_pool,
+ sizeof(njs_generator_stack_entry_t));
if (njs_slow_path(entry == NULL)) {
return NJS_ERROR;
}
njs_queue_insert_before(link, &entry->link);
if (size > 0) {
- entry->context = njs_mp_alloc(vm->mem_pool, size);
+ entry->context = njs_mp_alloc(generator->mem_pool, size);
if (njs_slow_path(entry->context == NULL)) {
return NJS_ERROR;
}
njs_queue_remove(link);
if (ctx != NULL) {
- njs_mp_free(vm->mem_pool, ctx);
+ njs_mp_free(generator->mem_pool, ctx);
}
generator->context = entry->context;
njs_generator_next(generator, entry->state, entry->node);
- njs_mp_free(vm->mem_pool, entry);
+ njs_mp_free(generator->mem_pool, entry);
return NJS_OK;
}
return ret;
}
- patch = njs_mp_alloc(vm->mem_pool, sizeof(njs_generator_patch_t));
+ patch = njs_mp_alloc(generator->mem_pool,
+ sizeof(njs_generator_patch_t));
if (njs_slow_path(patch == NULL)) {
return NJS_ERROR;
}
next = ctx->patch->next;
- njs_mp_free(vm->mem_pool, ctx->patch);
+ njs_mp_free(generator->mem_pool, ctx->patch);
ctx->patch = next;
node = branch->right;
* foreseen in order to generate optimized code for let updates.
*/
- ret = njs_generate_for_resolve_closure(vm, condition);
+ ret = njs_generate_for_resolve_closure(vm, generator, condition);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
init = node->left;
update = node->right->right->right;
- ret = njs_generate_for_resolve_closure(vm, update);
+ ret = njs_generate_for_resolve_closure(vm, generator, update);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
static njs_int_t
-njs_generate_for_resolve_closure(njs_vm_t *vm, njs_parser_node_t *node)
+njs_generate_for_resolve_closure(njs_vm_t *vm, njs_generator_t *generator,
+ njs_parser_node_t *node)
{
- return njs_parser_traverse(vm, node, NULL,
+ return njs_parser_traverse(vm, generator->mem_pool, node, NULL,
njs_generate_for_resolve_closure_cb);
}
{
njs_generator_block_t *block;
- block = njs_mp_alloc(vm->mem_pool, sizeof(njs_generator_block_t));
+ block = njs_mp_alloc(generator->mem_pool,
+ sizeof(njs_generator_block_t));
if (njs_fast_path(block != NULL)) {
block->next = generator->block;
static njs_generator_patch_t *
-njs_generate_make_continuation_patch(njs_vm_t *vm, njs_generator_block_t *block,
+njs_generate_make_continuation_patch(njs_vm_t *vm,
+ njs_generator_t *generator, njs_generator_block_t *block,
const njs_str_t *label, njs_jump_off_t offset)
{
njs_generator_patch_t *patch;
- patch = njs_mp_alloc(vm->mem_pool, sizeof(njs_generator_patch_t));
+ patch = njs_mp_alloc(generator->mem_pool, sizeof(njs_generator_patch_t));
if (njs_slow_path(patch == NULL)) {
njs_memory_error(vm);
return NULL;
&patch->label);
next = patch->next;
- njs_mp_free(vm->mem_pool, patch);
+ njs_mp_free(generator->mem_pool, patch);
}
}
static njs_generator_patch_t *
-njs_generate_make_exit_patch(njs_vm_t *vm, njs_generator_block_t *block,
- const njs_str_t *label, njs_jump_off_t offset)
+njs_generate_make_exit_patch(njs_vm_t *vm, njs_generator_t *generator,
+ njs_generator_block_t *block, const njs_str_t *label,
+ njs_jump_off_t offset)
{
njs_generator_patch_t *patch;
- patch = njs_mp_alloc(vm->mem_pool, sizeof(njs_generator_patch_t));
+ patch = njs_mp_alloc(generator->mem_pool, sizeof(njs_generator_patch_t));
if (njs_slow_path(patch == NULL)) {
njs_memory_error(vm);
return NULL;
njs_debug_generator(vm, "EXIT %s %p", njs_block_type(block->type), block);
- njs_mp_free(vm->mem_pool, block);
+ njs_mp_free(generator->mem_pool, block);
}
njs_generate_code_jump(generator, jump,
offsetof(njs_vmcode_jump_t, offset));
- patch = njs_generate_make_continuation_patch(vm, block, label,
+ patch = njs_generate_make_continuation_patch(vm, generator, block, label,
njs_code_offset(generator, jump)
+ offsetof(njs_vmcode_jump_t, offset));
if (njs_slow_path(patch == NULL)) {
njs_generate_code_jump(generator, jump,
offsetof(njs_vmcode_jump_t, offset));
- patch = njs_generate_make_exit_patch(vm, block, label,
+ patch = njs_generate_make_exit_patch(vm, generator, block, label,
njs_code_offset(generator, jump)
+ offsetof(njs_vmcode_jump_t, offset));
if (njs_slow_path(patch == NULL)) {
}
}
- njs_mp_free(vm->mem_pool, generator->context);
+ njs_mp_free(generator->mem_pool, generator->context);
return njs_generate_node_index_release_pop(vm, generator, expr);
}
}
}
- njs_mp_free(vm->mem_pool, generator->context);
+ njs_mp_free(generator->mem_pool, generator->context);
ret = njs_generate_children_indexes_release(vm, generator, lvalue);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- ret = njs_generator_init(&generator, &prev->file, depth, prev->runtime);
+ ret = njs_generator_init(&generator, prev->mem_pool, &prev->file, depth,
+ prev->runtime);
if (njs_slow_path(ret != NJS_OK)) {
njs_internal_error(vm, "njs_generator_init() failed");
return NJS_ERROR;
generator->code_end = code_start + code_size + prelude;
}
+ if (arr != NULL) {
+ njs_arr_destroy(arr);
+ }
+
code = njs_arr_item(vm->codes, index);
code->start = generator->code_start;
code->end = generator->code_end;
try_return->save = top->index;
try_return->offset = offsetof(njs_vmcode_try_return_t, offset);
- patch = njs_generate_make_exit_patch(vm, immediate, &return_label,
+ patch = njs_generate_make_exit_patch(vm, generator, immediate,
+ &return_label,
njs_code_offset(generator, try_return)
+ offsetof(njs_vmcode_try_return_t,
offset));
NJS_GENERATOR_LOOP,
&ctx->try_cont_label);
- patch = njs_generate_make_continuation_patch(vm, block,
+ patch = njs_generate_make_continuation_patch(vm, generator, block,
&ctx->try_cont_label,
njs_code_offset(generator, finally)
+ offsetof(njs_vmcode_finally_t, continue_offset));
*/
if (block != NULL) {
- patch = njs_generate_make_exit_patch(vm, block,
+ patch = njs_generate_make_exit_patch(vm, generator, block,
&ctx->try_exit_label,
njs_code_offset(generator, finally)
+ offsetof(njs_vmcode_finally_t, break_offset));
&no_label);
if (block != NULL) {
- patch = njs_generate_make_exit_patch(vm, block, &no_label,
+ patch = njs_generate_make_exit_patch(vm, generator, block,
+ &no_label,
njs_code_offset(generator, finally)
+ offsetof(njs_vmcode_finally_t, break_offset));
if (njs_slow_path(patch == NULL)) {
block = njs_generate_find_block(vm, generator->block,
NJS_GENERATOR_LOOP, dest_label);
- patch = njs_generate_make_continuation_patch(vm, block, dest_label,
+ patch = njs_generate_make_continuation_patch(vm, generator, block,
+ dest_label,
njs_code_offset(generator, finally)
+ offsetof(njs_vmcode_finally_t, continue_offset));
if (njs_slow_path(patch == NULL)) {
block = njs_generate_find_block(vm, generator->block,
NJS_GENERATOR_ALL, dest_label);
if (block != NULL) {
- patch = njs_generate_make_exit_patch(vm, block, dest_label,
+ patch = njs_generate_make_exit_patch(vm, generator, block,
+ dest_label,
njs_code_offset(generator, finally)
+ offsetof(njs_vmcode_finally_t, break_offset));
if (njs_slow_path(patch == NULL)) {
block = njs_generate_find_block(vm, generator->block,
NJS_GENERATOR_ALL, &no_label);
if (block != NULL) {
- patch = njs_generate_make_exit_patch(vm, block, &no_label,
+ patch = njs_generate_make_exit_patch(vm, generator, block,
+ &no_label,
njs_code_offset(generator, finally)
+ offsetof(njs_vmcode_finally_t, break_offset));
if (njs_slow_path(patch == NULL)) {
cache = generator->index_cache;
if (cache == NULL) {
- cache = njs_arr_create(vm->mem_pool, 4, sizeof(njs_value_t *));
+ cache = njs_arr_create(generator->mem_pool, 4, sizeof(njs_value_t *));
if (njs_slow_path(cache == NULL)) {
return NJS_ERROR;
}