njs_function_call().
n = njs_array_next(array->start, ++n, next->length);
next->index = n;
- if (n > 0) {
- vm->current -= sizeof(njs_vmcode_function_call_t);
+ if (n < 0) {
+ vm->current += sizeof(njs_vmcode_function_call_t);
}
nargs = param->nargs;
func = (nargs != 0) ? &args[0] : (njs_value_t *) &njs_value_void;
- vm->current -= sizeof(njs_vmcode_function_call_t);
-
return njs_function_apply(vm, func, &p);
}
func = (nargs != 0) ? &args[0] : (njs_value_t *) &njs_value_void;
- vm->current -= sizeof(njs_vmcode_function_call_t);
-
return njs_function_apply(vm, func, &p);
}
if (nxt_fast_path(ret == NXT_OK)) {
vm->retval = njs_value_void;
- return njs_function_call(vm, param->retval);
+ return njs_function_call(vm, param->retval, 0);
}
}
nxt_noinline njs_ret_t
-njs_function_call(njs_vm_t *vm, njs_index_t retval)
+njs_function_call(njs_vm_t *vm, njs_index_t retval, size_t advance)
{
njs_frame_t *frame;
njs_function_t *function;
frame->retval = retval;
function = frame->native.u.function;
- frame->native.u.return_address = vm->current;
+ frame->native.u.return_address = vm->current + advance;
vm->current = function->u.lambda->u.start;
frame->prev_arguments = vm->scopes[NJS_SCOPE_ARGUMENTS];
call = (njs_vmcode_function_call_t *) vm->current;
- return njs_function_call(vm, call->retval);
+ return njs_function_call(vm, call->retval,
+ sizeof(njs_vmcode_function_call_t));
}
code = (njs_vmcode_function_call_t *) vm->current;
- return njs_function_call(vm, code->retval);
+ return njs_function_call(vm, code->retval,
+ sizeof(njs_vmcode_function_call_t));
}
return NXT_ERROR;
njs_vmcode_t *code);
njs_ret_t njs_function_frame(njs_vm_t *vm, njs_function_t *function,
njs_param_t *param, nxt_bool_t ctor);
-njs_ret_t njs_function_call(njs_vm_t *vm, njs_index_t retval);
+njs_ret_t njs_function_call(njs_vm_t *vm, njs_index_t retval, size_t advance);
extern const njs_object_init_t njs_function_constructor_init;
extern const njs_object_init_t njs_function_prototype_init;
njs_native_frame_t *frame, *previous, *skip;
njs_vmcode_function_call_t *call;
- call = (njs_vmcode_function_call_t *) vm->current;
- /* Update code pointer here to store it as return address in call frame. */
- vm->current += sizeof(njs_vmcode_function_call_t);
-
if (!vm->frame->u.function->native) {
- (void) njs_function_call(vm, (njs_index_t) retval);
+ (void) njs_function_call(vm, (njs_index_t) retval,
+ sizeof(njs_vmcode_function_call_t));
return 0;
}
param.retval = (njs_index_t) retval;
+ call = (njs_vmcode_function_call_t *) vm->current;
param.nargs = call->code.nargs - 1;
args = vm->scopes[NJS_SCOPE_CALLEE_ARGUMENTS];
param.args = args;
*/
*retval = vm->retval;
+ ret = sizeof(njs_vmcode_function_call_t);
+
} else if (ret == NJS_APPLIED) {
/* A user-defined method has been prepared to run. */
ret = 0;
} else if (ret == NXT_AGAIN) {
+ /*
+ * Revert nJSVM current address, execution will
+ * continue on the same function after resumption.
+ */
vm->frame->reentrant = 1;
+ vm->current -= sizeof(njs_vmcode_function_call_t);
}
return ret;