From: hongzhidao Date: Fri, 11 Jan 2019 10:57:57 +0000 (+0800) Subject: Refactored njs_function_lambda_call(). X-Git-Tag: 0.2.8~76 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=acc9699e31659245c95710fbd5156d62de167d3f;p=njs.git Refactored njs_function_lambda_call(). --- diff --git a/njs/njs_function.c b/njs/njs_function.c index 7bb1b949..8eaab391 100644 --- a/njs/njs_function.c +++ b/njs/njs_function.c @@ -394,7 +394,8 @@ njs_function_frame_alloc(njs_vm_t *vm, size_t size) nxt_noinline njs_ret_t -njs_function_lambda_call(njs_vm_t *vm, njs_index_t retval, size_t advance) +njs_function_lambda_call(njs_vm_t *vm, njs_index_t retval, + u_char *return_address) { size_t size; njs_ret_t ret; @@ -408,9 +409,9 @@ njs_function_lambda_call(njs_vm_t *vm, njs_index_t retval, size_t advance) frame = (njs_frame_t *) vm->top_frame; frame->retval = retval; + frame->return_address = return_address; function = frame->native.function; - frame->return_address = vm->current + advance; lambda = function->u.lambda; vm->current = lambda->start; @@ -947,35 +948,35 @@ njs_function_activate(njs_vm_t *vm, njs_function_t *function, const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs, njs_index_t retval, size_t advance) { + u_char *return_address; njs_ret_t ret; njs_continuation_t *cont; - if (function->native) { - ret = njs_function_native_frame(vm, function, this, args, nargs, - NJS_CONTINUATION_SIZE, 0); - if (nxt_slow_path(ret != NXT_OK)) { - return ret; - } + ret = njs_function_frame(vm, function, this, args, nargs, + NJS_CONTINUATION_SIZE, 0); + if (nxt_slow_path(ret != NXT_OK)) { + return ret; + } + + return_address = vm->current + advance; + if (function->native) { cont = njs_vm_continuation(vm); cont->function = function->u.native; cont->args_types = function->args_types; cont->retval = retval; + cont->return_address = return_address; - cont->return_address = vm->current + advance; vm->current = (u_char *) njs_continuation_nexus; - return NJS_APPLIED; - } - - ret = njs_function_lambda_frame(vm, function, this, args, nargs, 0); + ret = NJS_APPLIED; - if (nxt_slow_path(ret != NXT_OK)) { - return ret; + } else { + ret = njs_function_lambda_call(vm, retval, return_address); } - return njs_function_lambda_call(vm, retval, advance); + return ret; } diff --git a/njs/njs_function.h b/njs/njs_function.h index bf04e295..6b45f482 100644 --- a/njs/njs_function.h +++ b/njs/njs_function.h @@ -171,7 +171,7 @@ njs_ret_t njs_function_activate(njs_vm_t *vm, njs_function_t *function, const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs, njs_index_t retval, size_t advance); njs_ret_t njs_function_lambda_call(njs_vm_t *vm, njs_index_t retval, - size_t advance); + u_char *return_address); njs_ret_t njs_function_native_call(njs_vm_t *vm, njs_function_native_t native, njs_value_t *args, uint8_t *args_types, nxt_uint_t nargs, njs_index_t retval); diff --git a/njs/njs_vm.c b/njs/njs_vm.c index 00f6d47f..0a5d4faa 100644 --- a/njs/njs_vm.c +++ b/njs/njs_vm.c @@ -2014,9 +2014,8 @@ njs_vmcode_method_frame(njs_vm_t *vm, njs_value_t *object, njs_value_t *name) njs_ret_t njs_vmcode_function_call(njs_vm_t *vm, njs_value_t *invld, njs_value_t *retval) { + u_char *return_address; njs_ret_t ret; - nxt_uint_t nargs; - njs_value_t *args; njs_function_t *function; njs_continuation_t *cont; njs_native_frame_t *frame; @@ -2024,37 +2023,33 @@ njs_vmcode_function_call(njs_vm_t *vm, njs_value_t *invld, njs_value_t *retval) frame = vm->top_frame; function = frame->function; - if (!function->native) { - ret = njs_function_lambda_call(vm, (njs_index_t) retval, - sizeof(njs_vmcode_function_call_t)); - - if (nxt_fast_path(ret != NJS_ERROR)) { - return 0; - } + return_address = vm->current + sizeof(njs_vmcode_function_call_t); - return ret; - } + if (function->native) { + if (function->continuation_size != 0) { + cont = njs_vm_continuation(vm); - args = frame->arguments; - nargs = frame->nargs; + cont->function = function->u.native; + cont->args_types = function->args_types; + cont->retval = (njs_index_t) retval; + cont->return_address = return_address; - if (function->continuation_size != 0) { - cont = njs_vm_continuation(vm); + vm->current = (u_char *) njs_continuation_nexus; - cont->function = function->u.native; - cont->args_types = function->args_types; - cont->retval = (njs_index_t) retval; + ret = NJS_APPLIED; - cont->return_address = vm->current + sizeof(njs_vmcode_function_call_t); - vm->current = (u_char *) njs_continuation_nexus; + } else { + ret = njs_function_native_call(vm, function->u.native, + frame->arguments, + function->args_types, frame->nargs, + (njs_index_t) retval); + } - return 0; + } else { + ret = njs_function_lambda_call(vm, (njs_index_t) retval, + return_address); } - ret = njs_function_native_call(vm, function->u.native, args, - function->args_types, nargs, - (njs_index_t) retval); - switch (ret) { case NXT_OK: return sizeof(njs_vmcode_function_call_t);