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;
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;
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;
}
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);
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;
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);