function = native->function;
ret = function->u.native(vm, native->arguments, native->nargs,
- frame->retval);
-
+ function->magic);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
static njs_int_t
njs_function_prototype_call(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t retval)
+ njs_index_t unused)
{
njs_int_t ret;
+ njs_frame_t *frame;
njs_function_t *function;
const njs_value_t *this;
nargs = 0;
}
+ frame = (njs_frame_t *) vm->top_frame;
+
function = njs_function(&args[0]);
/* Skip the "call" method frame. */
return ret;
}
- ret = njs_function_frame_invoke(vm, retval);
+ ret = njs_function_frame_invoke(vm, frame->retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
static njs_int_t
njs_function_prototype_apply(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t retval)
+ njs_index_t unused)
{
uint32_t i, length;
njs_int_t ret;
+ njs_frame_t *frame;
njs_value_t name, *this, *arr_like;
njs_array_t *arr;
njs_function_t *func;
/* Skip the "apply" method frame. */
vm->top_frame->skip = 1;
+ frame = (njs_frame_t *) vm->top_frame;
+
ret = njs_function_frame(vm, func, this, args, length, 0);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- ret = njs_function_frame_invoke(vm, retval);
+ ret = njs_function_frame_invoke(vm, frame->retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
njs_object_t object;
uint8_t args_offset;
- uint8_t args_count;
- /* Function is a closure. */
+ uint8_t args_count:5;
uint8_t closure:1;
-
uint8_t native:1;
uint8_t ctor:1;
+ uint8_t magic;
+
union {
njs_function_lambda_t *lambda;
njs_function_native_t native;
}
-#define njs_native_function(_function, _args_count) { \
+#define _njs_native_function(_function, _args_count, _magic) { \
.data = { \
.type = NJS_FUNCTION, \
.truth = 1, \
.u.function = & (njs_function_t) { \
.native = 1, \
+ .magic = _magic, \
.args_count = _args_count, \
.args_offset = 1, \
.u.native = _function, \
}
+#define njs_native_function(_function, _args_count) \
+ _njs_native_function(_function, _args_count, 0)
+
+
+#define njs_native_function2(_function, _args_count, _magic) \
+ _njs_native_function(_function, _args_count, _magic)
+
+
#define njs_prop_handler(_handler) { \
.data = { \
.type = NJS_INVALID, \