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_index_t retval, u_char *return_address)
{
njs_ret_t ret;
njs_value_t *value;
*value = vm->retval;
}
+ vm->current = return_address;
+
njs_function_frame_free(vm, frame);
return NXT_OK;
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_index_t retval, u_char *return_address);
void njs_function_frame_free(njs_vm_t *vm, njs_native_frame_t *frame);
ret = njs_function_native_call(vm, function->u.native,
frame->arguments,
function->args_types, frame->nargs,
- (njs_index_t) retval);
+ (njs_index_t) retval,
+ return_address);
}
} else {
return_address);
}
- switch (ret) {
- case NXT_OK:
- return sizeof(njs_vmcode_function_call_t);
-
- case NJS_APPLIED:
- return 0;
-
- default:
- return ret;
- }
+ return (ret == NJS_APPLIED) ? 0 : ret;
}
static njs_ret_t
njs_vmcode_continuation(njs_vm_t *vm, njs_value_t *invld1, njs_value_t *invld2)
{
- u_char *return_address;
njs_ret_t ret;
njs_native_frame_t *frame;
njs_continuation_t *cont;
frame = vm->top_frame;
-
cont = njs_vm_continuation(vm);
- return_address = cont->return_address;
ret = njs_function_native_call(vm, cont->function, frame->arguments,
cont->args_types, frame->nargs,
- cont->retval);
+ cont->retval, cont->return_address);
- switch (ret) {
- case NXT_OK:
- vm->current = return_address;
- /* Fall through. */
-
- case NJS_APPLIED:
- return 0;
-
- default:
- return ret;
- }
+ return (ret == NJS_APPLIED) ? 0 : ret;
}