njs_function_apply(njs_vm_t *vm, njs_function_t *function, njs_value_t *args,
nxt_uint_t nargs, njs_index_t retval)
{
- size_t reserve;
njs_ret_t ret;
njs_continuation_t *cont;
if (function->native) {
-
- if (function->continuation_size == 0 && function->bound == NULL) {
- return function->u.native(vm, args, nargs, retval);
- }
-
- reserve = nxt_align_size(sizeof(njs_continuation_t),
- sizeof(njs_value_t)),
-
ret = njs_function_native_frame(vm, function, &args[0], &args[1],
- nargs - 1, reserve, 0);
+ nargs - 1, NJS_CONTINUATION_SIZE, 0);
if (ret != NJS_OK) {
return ret;
}
cont = njs_continuation(vm->frame);
cont->function = function->u.native;
+ cont->args_types = function->args_types;
cont->retval = retval;
cont->return_address = vm->current;
cont = njs_continuation(vm->frame);
cont->function = function->u.native;
+ cont->args_types = function->args_types;
cont->retval = (njs_index_t) retval;
cont->return_address = vm->current + sizeof(njs_vmcode_function_call_t);
cont = njs_continuation(frame);
args = frame->arguments - frame->function->args_offset;
+ if (cont->args_types != NULL) {
+ ret = njs_normalize_args(vm, args, cont->args_types, frame->nargs);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+ }
+
ret = cont->function(vm, args, frame->nargs, cont->retval);
switch (ret) {
{ nxt_string("var d = new Date(); d.__proto__ === Date.prototype"),
nxt_string("true") },
+ { nxt_string("[0].map(new Date().getDate)"),
+ nxt_string("TypeError") },
+
{ nxt_string("new Date(eval)"),
nxt_string("Invalid Date") },