njs_vm_call(njs_vm_t *vm, njs_function_t *function, const njs_value_t *args,
nxt_uint_t nargs)
{
- u_char *current;
- njs_ret_t ret;
- njs_value_t *this;
+ u_char *current;
+ njs_ret_t ret;
+ njs_value_t *this;
+ njs_continuation_t *cont;
static const njs_vmcode_stop_t stop[] = {
{ .code = { .operation = njs_vmcode_stop,
this = (njs_value_t *) &njs_value_void;
- ret = njs_function_frame(vm, function, this, args, nargs, 0);
- if (nxt_slow_path(ret != NXT_OK)) {
- return ret;
- }
-
current = vm->current;
- vm->current = (u_char *) stop;
- ret = njs_function_call(vm, NJS_INDEX_GLOBAL_RETVAL, 0);
- if (nxt_slow_path(ret == NXT_ERROR)) {
- return ret;
+ if (function->native) {
+ ret = njs_function_native_frame(vm, function, this, &args[0],
+ nargs, NJS_CONTINUATION_SIZE, 0);
+ if (ret != NJS_OK) {
+ return NJS_ERROR;
+ }
+
+ cont = njs_vm_continuation(vm);
+
+ cont->function = function->u.native;
+ cont->args_types = function->args_types;
+ cont->retval = NJS_INDEX_GLOBAL_RETVAL;
+
+ cont->return_address = (u_char *) stop;
+ vm->current = (u_char *) njs_continuation_nexus;
+
+ } else {
+ ret = njs_function_frame(vm, function, this, args, nargs, 0);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
+ }
+
+ vm->current = (u_char *) stop;
+
+ ret = njs_function_call(vm, NJS_INDEX_GLOBAL_RETVAL, 0);
+ if (nxt_slow_path(ret == NXT_ERROR)) {
+ return ret;
+ }
}
ret = njs_vmcode_interpreter(vm);
njs_ret_t
njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
- const njs_value_t *this, njs_value_t *args, nxt_uint_t nargs,
+ const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,
size_t reserve, nxt_bool_t ctor)
{
size_t size;
njs_ret_t njs_function_apply(njs_vm_t *vm, njs_function_t *function,
njs_value_t *args, nxt_uint_t nargs, njs_index_t retval);
njs_ret_t njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
- const njs_value_t *this, njs_value_t *args, nxt_uint_t nargs,
+ const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,
size_t reserve, nxt_bool_t ctor);
njs_ret_t njs_function_frame(njs_vm_t *vm, njs_function_t *function,
const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,