details: https://hg.nginx.org/njs/rev/3b1239c2ee12 branches: changeset: 732:3b1239c2ee12 user: Dmitry Volyntsev <xei...@nginx.com> date: Thu Jan 17 17:01:22 2019 +0300 description: Setting exit index for try_return instruction is simplified.
diffstat: njs/njs_generator.c | 57 ++++++++++++---------------------------------------- 1 files changed, 13 insertions(+), 44 deletions(-) diffs (175 lines): diff -r 2e9bdb42b3e6 -r 3b1239c2ee12 njs/njs_generator.c --- a/njs/njs_generator.c Thu Jan 17 16:12:46 2019 +0300 +++ b/njs/njs_generator.c Thu Jan 17 17:01:22 2019 +0300 @@ -20,11 +20,6 @@ struct njs_generator_patch_s { */ 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; }; @@ -47,6 +42,8 @@ struct njs_generator_block_s { njs_generator_patch_t *continuation; njs_generator_patch_t *exit; njs_generator_block_t *next; + + njs_index_t index; }; @@ -87,8 +84,6 @@ static nxt_int_t njs_generate_make_conti 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, @@ -891,7 +886,6 @@ njs_generate_switch_statement(njs_vm_t * return NXT_ERROR; } - patch->index_offset = 0; patch->jump_offset = njs_code_offset(generator, equal) + offsetof(njs_vmcode_equal_jump_t, offset); @@ -1277,6 +1271,8 @@ njs_generate_start_block(njs_vm_t *vm, n block->continuation = NULL; block->exit = NULL; + block->index = 0; + return NXT_OK; } @@ -1315,7 +1311,6 @@ njs_generate_make_continuation_patch(njs patch->next = block->continuation; block->continuation = patch; - patch->index_offset = 0; patch->jump_offset = offset; return NXT_OK; @@ -1337,25 +1332,6 @@ njs_generate_patch_block(njs_vm_t *vm, n } -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) @@ -1372,7 +1348,6 @@ njs_generate_make_exit_patch(njs_vm_t *v patch->next = block->exit; block->exit = patch; - patch->index_offset = 0; patch->jump_offset = offset; return NXT_OK; @@ -1429,7 +1404,6 @@ njs_generate_continue_statement(njs_vm_t 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); } @@ -1480,7 +1454,6 @@ njs_generate_break_statement(njs_vm_t *v 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); } @@ -2533,10 +2506,7 @@ njs_generate_return_statement(njs_vm_t * 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) @@ -2739,13 +2709,14 @@ njs_generate_try_statement(njs_vm_t *vm, 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; @@ -2753,8 +2724,7 @@ njs_generate_try_statement(njs_vm_t *vm, 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; @@ -2876,13 +2846,14 @@ njs_generate_try_statement(njs_vm_t *vm, 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; @@ -2890,9 +2861,7 @@ njs_generate_try_statement(njs_vm_t *vm, 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); _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel