From 505cdb8bf9d8d08e8944d5386a4afe8d19cf1c1f Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Thu, 6 Jul 2017 19:09:56 +0300 Subject: [PATCH] Moving VM initialization from njs_vm_clone() to njs_vm_init(). --- njs/njscript.c | 98 +++++++++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 40 deletions(-) diff --git a/njs/njscript.c b/njs/njscript.c index 21686f1f..46a5c59e 100644 --- a/njs/njscript.c +++ b/njs/njscript.c @@ -26,6 +26,9 @@ #include +static nxt_int_t njs_vm_init(njs_vm_t *vm); + + static void * njs_alloc(void *mem, size_t size) { @@ -244,11 +247,8 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end) njs_vm_t * njs_vm_clone(njs_vm_t *vm, nxt_mem_cache_pool_t *mcp, void **external) { - u_char *values; - size_t size, scope_size; njs_vm_t *nvm; nxt_int_t ret; - njs_frame_t *frame; nxt_mem_cache_pool_t *nmcp; nxt_thread_log_debug("CLONE:"); @@ -274,64 +274,82 @@ njs_vm_clone(njs_vm_t *vm, nxt_mem_cache_pool_t *mcp, void **external) nvm->values_hash = vm->values_hash; nvm->externals_hash = vm->externals_hash; - nvm->retval = njs_value_void; nvm->current = vm->current; nvm->external = external; nvm->global_scope = vm->global_scope; - scope_size = vm->scope_size; - nvm->scope_size = scope_size; - scope_size += NJS_INDEX_GLOBAL_OFFSET; - - size = NJS_GLOBAL_FRAME_SIZE + scope_size + NJS_FRAME_SPARE_SIZE; - size = nxt_align_size(size, NJS_FRAME_SPARE_SIZE); + nvm->scope_size = vm->scope_size; - frame = nxt_mem_cache_align(nmcp, sizeof(njs_value_t), size); - if (nxt_slow_path(frame == NULL)) { + ret = njs_vm_init(nvm); + if (nxt_slow_path(ret != NXT_OK)) { goto fail; } - memset(frame, 0, NJS_GLOBAL_FRAME_SIZE); - - nvm->top_frame = &frame->native; - nvm->active_frame = frame; + return nvm; + } - frame->native.size = size; - frame->native.free_size = size - (NJS_GLOBAL_FRAME_SIZE + scope_size); +fail: - values = (u_char *) frame + NJS_GLOBAL_FRAME_SIZE; + if (mcp == NULL) { + nxt_mem_cache_pool_destroy(nmcp); + } - frame->native.free = values + scope_size; + return NULL; +} - nvm->scopes[NJS_SCOPE_GLOBAL] = (njs_value_t *) values; - memcpy(values + NJS_INDEX_GLOBAL_OFFSET, vm->global_scope, - vm->scope_size); - ret = njs_regexp_init(nvm); - if (nxt_slow_path(ret != NXT_OK)) { - goto fail; - } +static nxt_int_t +njs_vm_init(njs_vm_t *vm) +{ + size_t size, scope_size; + u_char *values; + nxt_int_t ret; + njs_frame_t *frame; - ret = njs_builtin_objects_clone(nvm); - if (nxt_slow_path(ret != NXT_OK)) { - goto fail; - } + scope_size = vm->scope_size + NJS_INDEX_GLOBAL_OFFSET; - nvm->trace.level = NXT_LEVEL_TRACE; - nvm->trace.size = 2048; - nvm->trace.handler = njs_parser_trace_handler; - nvm->trace.data = nvm; + size = NJS_GLOBAL_FRAME_SIZE + scope_size + NJS_FRAME_SPARE_SIZE; + size = nxt_align_size(size, NJS_FRAME_SPARE_SIZE); - return nvm; + frame = nxt_mem_cache_align(vm->mem_cache_pool, sizeof(njs_value_t), size); + if (nxt_slow_path(frame == NULL)) { + return NXT_ERROR; } -fail: + memset(frame, 0, NJS_GLOBAL_FRAME_SIZE); - if (mcp == NULL) { - nxt_mem_cache_pool_destroy(nmcp); + vm->top_frame = &frame->native; + vm->active_frame = frame; + + frame->native.size = size; + frame->native.free_size = size - (NJS_GLOBAL_FRAME_SIZE + scope_size); + + values = (u_char *) frame + NJS_GLOBAL_FRAME_SIZE; + + frame->native.free = values + scope_size; + + vm->scopes[NJS_SCOPE_GLOBAL] = (njs_value_t *) values; + memcpy(values + NJS_INDEX_GLOBAL_OFFSET, vm->global_scope, + vm->scope_size); + + ret = njs_regexp_init(vm); + if (nxt_slow_path(ret != NXT_OK)) { + return NXT_ERROR; } - return NULL; + ret = njs_builtin_objects_clone(vm); + if (nxt_slow_path(ret != NXT_OK)) { + return NXT_ERROR; + } + + vm->retval = njs_value_void; + + vm->trace.level = NXT_LEVEL_TRACE; + vm->trace.size = 2048; + vm->trace.handler = njs_parser_trace_handler; + vm->trace.data = vm; + + return NXT_OK; } -- 2.47.3