njs_value_t *value, void *obj, uintptr_t data);
static njs_ret_t ngx_http_js_ext_set_content_length(njs_vm_t *vm, void *obj,
uintptr_t data, nxt_str_t *value);
-static njs_ret_t ngx_http_js_ext_send_header(njs_vm_t *vm, njs_param_t *param);
-static njs_ret_t ngx_http_js_ext_send(njs_vm_t *vm, njs_param_t *param);
-static njs_ret_t ngx_http_js_ext_finish(njs_vm_t *vm, njs_param_t *param);
+static njs_ret_t ngx_http_js_ext_send_header(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
+static njs_ret_t ngx_http_js_ext_send(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
+static njs_ret_t ngx_http_js_ext_finish(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
static njs_ret_t ngx_http_js_ext_get_http_version(njs_vm_t *vm,
njs_value_t *value, void *obj, uintptr_t data);
static njs_ret_t ngx_http_js_ext_get_remote_address(njs_vm_t *vm,
static njs_ret_t
-ngx_http_js_ext_send_header(njs_vm_t *vm, njs_param_t *param)
+ngx_http_js_ext_send_header(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
ngx_http_request_t *r;
- r = njs_value_data(njs_argument(param->args, 0));
+ r = njs_value_data(njs_argument(args, 0));
if (ngx_http_send_header(r) == NGX_ERROR) {
return NJS_ERROR;
static njs_ret_t
-ngx_http_js_ext_send(njs_vm_t *vm, njs_param_t *param)
+ngx_http_js_ext_send(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
nxt_int_t ret;
nxt_str_t s;
ngx_buf_t *b;
- uintptr_t nargs, next;
+ uintptr_t next;
ngx_uint_t n;
- njs_value_t *args;
ngx_chain_t *out, *cl, **ll;
ngx_http_request_t *r;
- r = njs_value_data(njs_argument(param->args, 0));
+ r = njs_value_data(njs_argument(args, 0));
out = NULL;
ll = &out;
- args = param->args;
- nargs = param->nargs;
-
for (n = 1; n < nargs; n++) {
next = 0;
static njs_ret_t
-ngx_http_js_ext_finish(njs_vm_t *vm, njs_param_t *param)
+ngx_http_js_ext_finish(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
ngx_http_request_t *r;
- r = njs_value_data(njs_argument(param->args, 0));
+ r = njs_value_data(njs_argument(args, 0));
if (ngx_http_send_special(r, NGX_HTTP_LAST) == NGX_ERROR) {
return NJS_ERROR;
typedef struct {
- njs_continuation_t continuation;
+ njs_continuation_t cont;
njs_value_t *values;
uint32_t max;
} njs_array_join_t;
static njs_ret_t njs_array_prototype_join_continuation(njs_vm_t *vm,
- njs_param_t *param);
+ njs_value_t *args, nxt_uint_t nargs, njs_index_t unused);
static nxt_noinline njs_value_t *njs_array_copy(njs_value_t *dst,
njs_value_t *src);
-static nxt_int_t njs_array_iterator_args(njs_vm_t *vm, njs_param_t *param);
static nxt_noinline nxt_int_t njs_array_next(njs_value_t *value, nxt_uint_t n,
nxt_uint_t length);
njs_ret_t
-njs_array_constructor(njs_vm_t *vm, njs_param_t *param)
+njs_array_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
double num;
uint32_t size;
- njs_value_t *value, *args;
+ njs_value_t *value;
njs_array_t *array;
- args = ¶m->args[1];
- size = param->nargs - 1;
+ args = &args[1];
+ size = nargs - 1;
if (size == 1 && njs_is_number(&args[0])) {
num = args[0].data.u.number;
*/
static njs_ret_t
-njs_array_prototype_slice(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_slice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
int32_t start, end, length;
uint32_t n;
- uintptr_t nargs;
njs_array_t *array;
- njs_value_t *args, *value;
+ njs_value_t *value;
start = 0;
length = 0;
- args = param->args;
if (njs_is_array(&args[0])) {
length = args[0].data.u.array->length;
- nargs = param->nargs;
if (nargs > 1) {
start = args[1].data.u.number;
static njs_ret_t
-njs_array_prototype_push(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
- uintptr_t i, nargs;
njs_ret_t ret;
- njs_value_t *args;
+ nxt_uint_t i, n;
njs_array_t *array;
- if (njs_is_array(¶m->args[0])) {
- array = param->args[0].data.u.array;
- nargs = param->nargs - 1;
+ if (njs_is_array(&args[0])) {
+ array = args[0].data.u.array;
+ n = nargs - 1;
if (nargs != 0) {
if (nargs > array->size - array->length) {
}
}
- args = param->args;
- nargs = param->nargs;
-
for (i = 1; i < nargs; i++) {
/* GC: njs_retain(&args[i]); */
array->start[array->length++] = args[i];
static njs_ret_t
-njs_array_prototype_pop(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_pop(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_array_t *array;
const njs_value_t *retval, *value;
retval = &njs_value_void;
- if (njs_is_array(¶m->args[0])) {
- array = param->args[0].data.u.array;
+ if (njs_is_array(&args[0])) {
+ array = args[0].data.u.array;
if (array->length != 0) {
array->length--;
static njs_ret_t
-njs_array_prototype_unshift(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
- uintptr_t n;
njs_ret_t ret;
- njs_value_t *args;
+ nxt_uint_t n;
njs_array_t *array;
- if (njs_is_array(¶m->args[0])) {
- array = param->args[0].data.u.array;
- n = param->nargs - 1;
+ if (njs_is_array(&args[0])) {
+ array = args[0].data.u.array;
+ n = nargs - 1;
if (n != 0) {
if ((intptr_t) n > (array->start - array->data)) {
}
array->length += n;
- args = param->args;
- n = param->nargs;
+ n = nargs;
do {
n--;
static njs_ret_t
-njs_array_prototype_shift(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_shift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_array_t *array;
const njs_value_t *retval, *value;
retval = &njs_value_void;
- if (njs_is_array(¶m->args[0])) {
- array = param->args[0].data.u.array;
+ if (njs_is_array(&args[0])) {
+ array = args[0].data.u.array;
if (array->length != 0) {
array->length--;
*/
static njs_ret_t
-njs_array_prototype_to_string(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_to_string(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t retval)
{
- njs_value_t *this, *args;
njs_object_prop_t *prop;
nxt_lvlhsh_query_t lhq;
- args = param->args;
-
if (njs_is_object(&args[0])) {
lhq.key_hash = NJS_JOIN_HASH;
lhq.key.len = sizeof("join") - 1;
prop = njs_object_property(vm, args[0].data.u.object, &lhq);
if (nxt_fast_path(prop != NULL && njs_is_function(&prop->value))) {
-
- this = &args[0];
-
- if (prop->value.data.u.function->native) {
- param->args = &args[0];
- param->nargs++;
- this = NULL;
- }
-
- return njs_function_apply(vm, prop->value.data.u.function, this,
- param);
+ return njs_function_apply(vm, prop->value.data.u.function,
+ args, nargs, retval);
}
}
- return njs_object_prototype_to_string(vm, param);
+ return njs_object_prototype_to_string(vm, args, nargs, retval);
}
static njs_ret_t
-njs_array_prototype_join(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
uint32_t max;
nxt_uint_t i, n;
njs_value_t *value, *values;
njs_array_join_t *join;
- if (!njs_is_array(¶m->args[0])) {
+ if (!njs_is_array(&args[0])) {
goto empty;
}
- array = param->args[0].data.u.array;
+ array = args[0].data.u.array;
if (array->length == 0) {
goto empty;
return NXT_ERROR;
}
- join->continuation.function = njs_array_prototype_join_continuation;
- join->continuation.args = param->args;
- join->continuation.nargs = param->nargs;
+ join->cont.function = njs_array_prototype_join_continuation;
+ join->cont.args = args;
+ join->cont.nargs = nargs;
join->values = values;
join->max = max;
- vm->frame->continuation = &join->continuation;
+ vm->frame->continuation = &join->cont;
n = 0;
}
}
- return njs_array_prototype_join_continuation(vm, param);
+ return njs_array_prototype_join_continuation(vm, args, nargs, unused);
empty:
static njs_ret_t
-njs_array_prototype_join_continuation(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_join_continuation(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
u_char *p;
size_t size, length, mask;
n = 0;
mask = -1;
- array = param->args[0].data.u.array;
+ array = args[0].data.u.array;
for (i = 0; i < array->length; i++) {
value = &array->start[i];
}
}
- if (param->nargs > 1) {
- value = ¶m->args[1];
+ if (nargs > 1) {
+ value = &args[1];
} else {
value = (njs_value_t *) &njs_string_comma;
static njs_ret_t
-njs_array_prototype_concat(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
size_t length;
- uintptr_t nargs;
nxt_uint_t i;
- njs_value_t *args, *value;
+ njs_value_t *value;
njs_array_t *array;
length = 0;
- args = param->args;
- nargs = param->nargs;
for (i = 0; i < nargs; i++) {
if (njs_is_array(&args[i])) {
}
+nxt_inline nxt_int_t
+njs_array_iterator_args(njs_vm_t *vm, njs_value_t * args, nxt_uint_t nargs)
+{
+ if (nargs > 1 && njs_is_array(&args[0]) && njs_is_function(&args[1])) {
+ return NXT_OK;
+ }
+
+ vm->exception = &njs_exception_type_error;
+
+ return NXT_ERROR;
+}
+
+
static njs_ret_t
-njs_array_prototype_for_each(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_for_each(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
nxt_int_t n, ret;
- njs_param_t p;
njs_array_t *array;
- njs_value_t *this, *args, arguments[3];
njs_array_next_t *next;
-
- args = param->args;
+ njs_value_t arguments[4];
if (!vm->frame->reentrant) {
vm->frame->reentrant = 1;
- ret = njs_array_iterator_args(vm, param);
+ ret = njs_array_iterator_args(vm, args, nargs);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
}
next = njs_native_data(vm->frame);
n = next->index;
+ arguments[0] = (nargs > 2) ? args[2] : njs_value_void;
/* GC: array elt, array */
array = args[0].data.u.array;
- arguments[0] = array->start[n];
- njs_number_set(&arguments[1], n);
- arguments[2] = args[0];
+ arguments[1] = array->start[n];
+ njs_number_set(&arguments[2], n);
+ arguments[3] = args[0];
n = njs_array_next(array->start, ++n, next->length);
next->index = n;
vm->current += sizeof(njs_vmcode_function_call_t);
}
- this = (param->nargs > 2) ? &args[2] : (njs_value_t *) &njs_value_void;
- p.args = arguments;
- p.nargs = 3;
- p.retval = (njs_index_t) &next->retval;
-
- return njs_function_apply(vm, args[1].data.u.function, this, &p);
+ return njs_function_apply(vm, args[1].data.u.function, arguments, 4,
+ (njs_index_t) &next->retval);
}
static njs_ret_t
-njs_array_prototype_some(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_some(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
nxt_int_t n, ret;
- njs_param_t p;
njs_array_t *array;
- njs_value_t *this, *args, arguments[3];
njs_array_next_t *next;
-
- args = param->args;
+ njs_value_t arguments[4];
if (!vm->frame->reentrant) {
vm->frame->reentrant = 1;
- ret = njs_array_iterator_args(vm, param);
+ ret = njs_array_iterator_args(vm, args, nargs);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
}
return NXT_OK;
}
+ arguments[0] = (nargs > 2) ? args[2] : njs_value_void;
/* GC: array elt, array */
array = args[0].data.u.array;
- arguments[0] = array->start[n];
- njs_number_set(&arguments[1], n);
- arguments[2] = args[0];
+ arguments[1] = array->start[n];
+ njs_number_set(&arguments[2], n);
+ arguments[3] = args[0];
next->index = njs_array_next(array->start, ++n, next->length);
- this = (param->nargs > 2) ? &args[2] : (njs_value_t *) &njs_value_void;
- p.args = arguments;
- p.nargs = 3;
- p.retval = (njs_index_t) &next->retval;
-
- return njs_function_apply(vm, args[1].data.u.function, this, &p);
+ return njs_function_apply(vm, args[1].data.u.function, arguments, 4,
+ (njs_index_t) &next->retval);
}
static njs_ret_t
-njs_array_prototype_every(njs_vm_t *vm, njs_param_t *param)
+njs_array_prototype_every(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
nxt_int_t n, ret;
- njs_param_t p;
njs_array_t *array;
- njs_value_t *this, *args, arguments[3];
njs_array_next_t *next;
-
- args = param->args;
+ njs_value_t arguments[4];
if (!vm->frame->reentrant) {
vm->frame->reentrant = 1;
- ret = njs_array_iterator_args(vm, param);
+ ret = njs_array_iterator_args(vm, args, nargs);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
}
return NXT_OK;
}
+ arguments[0] = (nargs > 2) ? args[2] : njs_value_void;
/* GC: array elt, array */
array = args[0].data.u.array;
- arguments[0] = array->start[n];
- njs_number_set(&arguments[1], n);
- arguments[2] = args[0];
+ arguments[1] = array->start[n];
+ njs_number_set(&arguments[2], n);
+ arguments[3] = args[0];
next->index = njs_array_next(array->start, ++n, next->length);
- this = (param->nargs > 2) ? &args[2] : (njs_value_t *) &njs_value_void;
- p.args = arguments;
- p.nargs = 3;
- p.retval = (njs_index_t) &next->retval;
-
- return njs_function_apply(vm, args[1].data.u.function, this, &p);
-}
-
-
-static nxt_int_t
-njs_array_iterator_args(njs_vm_t *vm, njs_param_t *param)
-{
- if (param->nargs > 1
- && njs_is_array(¶m->args[0])
- && njs_is_function(¶m->args[1]))
- {
- return NXT_OK;
- }
-
- vm->exception = &njs_exception_type_error;
-
- return NXT_ERROR;
+ return njs_function_apply(vm, args[1].data.u.function, arguments, 4,
+ (njs_index_t) &next->retval);
}
njs_array_t *njs_array_alloc(njs_vm_t *vm, uint32_t length, uint32_t spare);
njs_ret_t njs_array_realloc(njs_vm_t *vm, njs_array_t *array, uint32_t prepend,
uint32_t size);
-njs_ret_t njs_array_constructor(njs_vm_t *vm, njs_param_t *param);
+njs_ret_t njs_array_constructor(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
extern const njs_object_init_t njs_array_constructor_init;
extern const njs_object_init_t njs_array_prototype_init;
njs_ret_t
-njs_boolean_constructor(njs_vm_t *vm, njs_param_t *param)
+njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_object_t *object;
const njs_value_t *value;
- if (param->nargs == 1) {
+ if (nargs == 1) {
value = &njs_value_false;
} else {
- value = njs_is_true(¶m->args[1]) ? &njs_value_true:
- &njs_value_false;
+ value = njs_is_true(&args[1]) ? &njs_value_true : &njs_value_false;
}
if (vm->frame->ctor) {
static njs_ret_t
-njs_boolean_prototype_value_of(njs_vm_t *vm, njs_param_t *param)
+njs_boolean_prototype_value_of(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
njs_value_t *value;
- value = ¶m->args[0];
+ value = &args[0];
if (value->type != NJS_BOOLEAN) {
static njs_ret_t
-njs_boolean_prototype_to_string(njs_vm_t *vm, njs_param_t *param)
+njs_boolean_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
njs_value_t *value;
- value = ¶m->args[0];
+ value = &args[0];
if (value->type != NJS_BOOLEAN) {
#define _NJS_BOOLEAN_H_INCLUDED_
-njs_ret_t njs_boolean_constructor(njs_vm_t *vm, njs_param_t *param);
+njs_ret_t njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
extern const njs_object_init_t njs_boolean_constructor_init;
extern const njs_object_init_t njs_boolean_prototype_init;
typedef struct {
- njs_native_t native;
- uint8_t args_types[NJS_ARGS_TYPES_MAX];
+ njs_function_native_t native;
+ uint8_t args_types[NJS_ARGS_TYPES_MAX];
} njs_function_init_t;
typedef struct {
- njs_continuation_t continuation;
+ njs_continuation_t cont;
njs_function_t *function;
} njs_function_apply_t;
njs_function_t *function, njs_value_t *this, njs_value_t *args,
nxt_uint_t nargs);
static njs_ret_t njs_function_prototype_apply_continuation(njs_vm_t *vm,
- njs_param_t *param);
+ njs_value_t *args, nxt_uint_t nargs, njs_index_t retval);
njs_function_t *
njs_ret_t
-njs_function_constructor(njs_vm_t *vm, njs_param_t *param)
+njs_function_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
return NXT_ERROR;
}
nxt_noinline njs_ret_t
-njs_function_apply(njs_vm_t *vm, njs_function_t *function, njs_value_t *this,
- njs_param_t *param)
+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 ret;
if (function->native) {
- return function->u.native(vm, param);
+ return function->u.native(vm, args, nargs, retval);
}
- ret = njs_function_frame(vm, function, this, param->args, param->nargs, 0);
+ ret = njs_function_frame(vm, function, &args[0], &args[1], nargs - 1, 0);
if (nxt_fast_path(ret == NXT_OK)) {
- return njs_function_call(vm, param->retval, 0);
+ return njs_function_call(vm, retval, 0);
}
return ret;
static njs_ret_t
-njs_function_prototype_call(njs_vm_t *vm, njs_param_t *param)
+njs_function_prototype_call(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t retval)
{
- uintptr_t nargs;
- njs_ret_t ret;
- njs_param_t p;
- njs_value_t *this;
- njs_function_t *function;
- njs_vmcode_function_call_t *call;
-
- if (!njs_is_function(¶m->args[0])) {
+ njs_ret_t ret;
+ njs_value_t *this;
+ njs_function_t *function;
+
+ if (!njs_is_function(&args[0])) {
vm->exception = &njs_exception_type_error;
return NXT_ERROR;
}
- this = ¶m->args[1];
- p.args = ¶m->args[2];
-
- nargs = param->nargs - 1;
- function = param->args[0].data.u.function;
+ nargs = nargs - 1;
+ function = args[0].data.u.function;
if (function->native) {
if (nargs == 0) {
nargs++;
- param->args[1] = njs_value_void;
+ args[1] = njs_value_void;
}
- p.args = ¶m->args[1];
- p.nargs = nargs;
- p.retval = param->retval;
+ ret = njs_normalize_args(vm, &args[1], function->args_types, nargs);
- ret = njs_normalize_args(vm, ¶m->args[1], function->args_types,
- nargs);
if (ret != NJS_OK) {
return ret;
}
- return function->u.native(vm, &p);
+ if (function->local_state_size == 0) {
+ args = &args[1];
+
+ } else {
+ ret = njs_function_apply_frame(vm, function, &args[1], &args[2],
+ nargs - 1);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
+ /* Skip the "call" method frame. */
+ vm->frame->previous->skip = 1;
+
+ args = vm->frame->arguments - function->args_offset;
+ }
+
+ return function->u.native(vm, args, nargs, retval);
}
- if (nargs != 0) {
- nargs--;
+ this = &args[1];
- } else {
+ if (nargs == 0) {
this = (njs_value_t *) &njs_value_void;
+
+ } else {
+ nargs--;
}
- ret = njs_function_frame(vm, function, this, p.args, nargs, 0);
+ ret = njs_function_frame(vm, function, this, &args[2], nargs, 0);
if (nxt_slow_path(ret != NXT_OK)) {
- return NXT_ERROR;
+ return ret;
}
/* Skip the "call" method frame. */
vm->frame->previous->skip = 1;
- call = (njs_vmcode_function_call_t *) vm->current;
-
- return njs_function_call(vm, call->retval,
- sizeof(njs_vmcode_function_call_t));
+ return njs_function_call(vm, retval, sizeof(njs_vmcode_function_call_t));
}
static njs_ret_t
-njs_function_prototype_apply(njs_vm_t *vm, njs_param_t *param)
+njs_function_prototype_apply(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t retval)
{
- uintptr_t nargs;
- njs_ret_t ret;
- njs_param_t p;
- njs_array_t *array;
- njs_value_t *this, *args;
- njs_function_t *function;
- njs_function_apply_t *apply;
- njs_vmcode_function_call_t *code;
-
- args = param->args;
+ njs_ret_t ret;
+ njs_array_t *array;
+ njs_value_t *this;
+ njs_function_t *function;
+ njs_function_apply_t *apply;
if (!njs_is_function(&args[0])) {
goto type_error;
}
function = args[0].data.u.function;
+ this = &args[1];
- if (function->native) {
-
- this = &args[1];
- nargs = param->nargs;
-
- if (nargs > 2) {
- if (!njs_is_array(&args[2])) {
- goto type_error;
- }
-
- array = args[2].data.u.array;
- args = array->start;
- nargs = array->length;
-
- } else {
- if (nargs == 1) {
- this = (njs_value_t *) &njs_value_void;
- }
-
- nargs = 0;
+ if (nargs > 2) {
+ if (!njs_is_array(&args[2])) {
+ goto type_error;
}
- p.retval = param->retval;
-
- ret = njs_function_apply_frame(vm, function, this, args, nargs);
-
- if (nxt_fast_path(ret == NXT_OK)) {
- apply = nxt_mem_cache_alloc(vm->mem_cache_pool,
- sizeof(njs_function_apply_t));
- if (nxt_slow_path(apply == NULL)) {
- return NXT_ERROR;
- }
-
- p.args = vm->frame->arguments - 1;
- p.nargs = nargs + 1;
-
- /* Skip the "apply" method frame. */
- vm->frame->previous->skip = 1;
-
- apply->continuation.function =
- njs_function_prototype_apply_continuation;
- apply->continuation.args = p.args;
- apply->continuation.nargs = p.nargs;
- apply->function = function;
- vm->frame->continuation = &apply->continuation;
+ array = args[2].data.u.array;
+ args = array->start;
+ nargs = array->length;
- return njs_function_prototype_apply_continuation(vm, &p);
+ } else {
+ if (nargs == 1) {
+ this = (njs_value_t *) &njs_value_void;
}
- return ret;
+ nargs = 0;
}
- this = &args[1];
-
- nargs = param->nargs - 1;
- p.nargs = nargs;
+ if (function->native) {
+ ret = njs_function_apply_frame(vm, function, this, args, nargs);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
+ }
- if (nargs > 1) {
- if (!njs_is_array(&args[2])) {
- goto type_error;
+ apply = nxt_mem_cache_alloc(vm->mem_cache_pool,
+ sizeof(njs_function_apply_t));
+ if (nxt_slow_path(apply == NULL)) {
+ return NXT_ERROR;
}
- array = args[2].data.u.array;
- p.args = array->start;
- p.nargs = array->length;
- }
+ args = vm->frame->arguments - function->args_offset;
+ nargs = nargs + 1;
- if (nargs < 2) {
- if (nargs != 0) {
- p.nargs = 0;
+ /* Skip the "apply" method frame. */
+ vm->frame->previous->skip = 1;
- } else {
- this = (njs_value_t *) &njs_value_void;
- }
+ apply->cont.function = njs_function_prototype_apply_continuation;
+ apply->cont.args = args;
+ apply->cont.nargs = nargs;
+ apply->function = function;
+ vm->frame->continuation = &apply->cont;
+
+ return njs_function_prototype_apply_continuation(vm, args, nargs,
+ retval);
}
- ret = njs_function_frame(vm, function, this, p.args, p.nargs, 0);
+ ret = njs_function_frame(vm, function, this, args, nargs, 0);
if (nxt_fast_path(ret == NXT_OK)) {
/* Skip the "apply" method frame. */
vm->frame->previous->skip = 1;
- code = (njs_vmcode_function_call_t *) vm->current;
-
- return njs_function_call(vm, code->retval,
+ return njs_function_call(vm, retval,
sizeof(njs_vmcode_function_call_t));
}
- return NXT_ERROR;
+ return ret;
type_error:
arguments = (njs_value_t *) ((u_char *) njs_native_data(frame)
+ function->local_state_size);
- frame->arguments = arguments + 1;
+
+ frame->arguments = arguments + function->args_offset;
vm->scopes[NJS_SCOPE_CALLEE_ARGUMENTS] = frame->arguments;
- *arguments = *this;
- memcpy(arguments + 1, args, nargs * sizeof(njs_value_t));
+ *arguments++ = *this;
+
+ memcpy(arguments, args, nargs * sizeof(njs_value_t));
return NXT_OK;
}
static njs_ret_t
-njs_function_prototype_apply_continuation(njs_vm_t *vm, njs_param_t *param)
+njs_function_prototype_apply_continuation(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t retval)
{
njs_ret_t ret;
+ njs_function_t *function;
njs_function_apply_t *apply;
apply = (njs_function_apply_t *) vm->frame->continuation;
+ function = apply->function;
- ret = njs_normalize_args(vm, param->args, apply->function->args_types,
- param->nargs);
- if (ret != NJS_OK) {
- return ret;
+ ret = njs_normalize_args(vm, args, function->args_types, nargs);
+
+ if (ret == NJS_OK) {
+ return function->u.native(vm, args, nargs, retval);
}
- return apply->function->u.native(vm, param);
+ return ret;
}
static njs_ret_t
-njs_function_prototype_bind(njs_vm_t *vm, njs_param_t *param)
+njs_function_prototype_bind(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_function_t *bound;
- if (!njs_is_function(¶m->args[0])) {
+ if (!njs_is_function(&args[0])) {
vm->exception = &njs_exception_type_error;
return NXT_ERROR;
}
nxt_lvlhsh_init(&bound->object.shared_hash);
bound->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_FUNCTION];
bound->args_offset = 1;
- bound->u.lambda = param->args[0].data.u.function->u.lambda;
+ bound->u.lambda = args[0].data.u.function->u.lambda;
vm->retval.data.u.function = bound;
vm->retval.type = NJS_FUNCTION;
njs_ret_t
-njs_eval_function(njs_vm_t *vm, njs_param_t *param)
+njs_eval_function(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
return NXT_ERROR;
}
typedef struct {
- njs_native_t function;
+ njs_function_native_t function;
njs_value_t *args;
nxt_uint_t nargs;
} njs_continuation_t;
njs_function_t *njs_function_alloc(njs_vm_t *vm);
njs_native_frame_t *njs_function_frame_alloc(njs_vm_t *vm, size_t size);
-njs_ret_t njs_function_constructor(njs_vm_t *vm, njs_param_t *param);
+njs_ret_t njs_function_constructor(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
njs_ret_t njs_function_apply(njs_vm_t *vm, njs_function_t *function,
- njs_value_t *this, njs_param_t *param);
+ njs_value_t *args, nxt_uint_t nargs, njs_index_t retval);
njs_value_t *njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
njs_vmcode_t *code);
njs_ret_t njs_function_frame(njs_vm_t *vm, njs_function_t *function,
extern const njs_object_init_t njs_function_constructor_init;
extern const njs_object_init_t njs_function_prototype_init;
-njs_ret_t njs_eval_function(njs_vm_t *vm, njs_param_t *param);
+njs_ret_t njs_eval_function(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused);
extern const njs_object_init_t njs_eval_function_init;
njs_ret_t
-njs_number_constructor(njs_vm_t *vm, njs_param_t *param)
+njs_number_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_object_t *object;
const njs_value_t *value;
- if (param->nargs == 1) {
+ if (nargs == 1) {
value = &njs_value_zero;
} else {
- value = ¶m->args[1];
+ value = &args[1];
}
if (vm->frame->ctor) {
static njs_ret_t
-njs_number_prototype_value_of(njs_vm_t *vm, njs_param_t *param)
+njs_number_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_value_t *value;
- value = ¶m->args[0];
+ value = &args[0];
if (value->type != NJS_NUMBER) {
static njs_ret_t
-njs_number_prototype_to_string(njs_vm_t *vm, njs_param_t *param)
+njs_number_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
njs_value_t *value;
- value = ¶m->args[0];
+ value = &args[0];
if (value->type != NJS_NUMBER) {
int64_t njs_hex_number_parse(u_char *p, u_char *end);
njs_ret_t njs_number_to_string(njs_vm_t *vm, njs_value_t *string,
const njs_value_t *number);
-njs_ret_t njs_number_constructor(njs_vm_t *vm, njs_param_t *param);
+njs_ret_t njs_number_constructor(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
extern const njs_object_init_t njs_number_constructor_init;
extern const njs_object_init_t njs_number_prototype_init;
njs_ret_t
-njs_object_constructor(njs_vm_t *vm, njs_param_t *param)
+njs_object_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
nxt_uint_t type;
njs_value_t *value;
type = NJS_OBJECT;
- if (param->nargs == 1 || njs_is_null_or_void(¶m->args[1])) {
+ if (nargs == 1 || njs_is_null_or_void(&args[1])) {
object = njs_object_alloc(vm);
if (nxt_slow_path(object == NULL)) {
}
} else {
- value = ¶m->args[1];
+ value = &args[1];
if (njs_is_object(value)) {
object = value->data.u.object;
/* TODO: properties with attributes. */
static njs_ret_t
-njs_object_create(njs_vm_t *vm, njs_param_t *param)
+njs_object_create(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
- njs_value_t *args;
njs_object_t *object;
- if (param->nargs > 1) {
- args = param->args;
+ if (nargs > 1) {
if (njs_is_object(&args[1]) || njs_is_null(&args[1])) {
static njs_ret_t
-njs_object_prototype_value_of(njs_vm_t *vm, njs_param_t *param)
+njs_object_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
- vm->retval = param->args[0];
+ vm->retval = args[0];
return NXT_OK;
}
njs_ret_t
-njs_object_prototype_to_string(njs_vm_t *vm, njs_param_t *param)
+njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
int32_t index;
- njs_value_t *args;
njs_object_t *prototype;
static const njs_value_t *class_name[] = {
&njs_object_regexp_string,
};
- args = param->args;
index = args[0].type;
if (njs_is_object(&args[0])) {
nxt_lvlhsh_query_t *lhq);
nxt_int_t njs_object_hash_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
const njs_object_prop_t *prop, nxt_uint_t n);
-njs_ret_t njs_object_constructor(njs_vm_t *vm, njs_param_t *param);
+njs_ret_t njs_object_constructor(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
njs_object_prop_t *njs_object_prop_alloc(njs_vm_t *vm, const njs_value_t *name);
njs_ret_t njs_primitive_prototype_get_proto(njs_vm_t *vm, njs_value_t *value);
njs_ret_t njs_object_prototype_create(njs_vm_t *vm, njs_value_t *value);
-njs_ret_t njs_object_prototype_to_string(njs_vm_t *vm, njs_param_t *param);
+njs_ret_t njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
extern const njs_object_init_t njs_object_constructor_init;
extern const njs_object_init_t njs_object_prototype_init;
njs_ret_t
-njs_regexp_constructor(njs_vm_t *vm, njs_param_t *param)
+njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
size_t length;
njs_regexp_t *regexp;
flags = 0;
- switch (param->nargs) {
+ switch (nargs) {
default:
- length = njs_string_prop(&string, ¶m->args[2]);
+ length = njs_string_prop(&string, &args[2]);
flags = njs_regexp_flags(&string.start, string.start + length, 1);
if (nxt_slow_path(flags < 0)) {
/* Fall through. */
case 2:
- string.length = njs_string_prop(&string, ¶m->args[1]);
+ string.length = njs_string_prop(&string, &args[1]);
if (string.length != 0) {
break;
static njs_ret_t
-njs_regexp_prototype_to_string(njs_vm_t *vm, njs_param_t *param)
+njs_regexp_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
u_char *source;
size_t length, size;
njs_regexp_pattern_t *pattern;
- pattern = param->args[0].data.u.regexp->pattern;
+ pattern = args[0].data.u.regexp->pattern;
source = pattern->source;
size = strlen((char *) source);
static njs_ret_t
-njs_regexp_prototype_test(njs_vm_t *vm, njs_param_t *param)
+njs_regexp_prototype_test(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_ret_t ret;
nxt_uint_t n;
njs_string_prop_t string;
njs_regexp_pattern_t *pattern;
- if (!njs_is_regexp(¶m->args[0])) {
+ if (!njs_is_regexp(&args[0])) {
vm->exception = &njs_exception_type_error;
return NXT_ERROR;
}
retval = &njs_value_false;
- if (param->nargs > 1) {
- value = ¶m->args[1];
+ if (nargs > 1) {
+ value = &args[1];
} else {
value = (njs_value_t *) &njs_string_void;
n = (string.length != 0 && string.length != string.size);
- pattern = param->args[0].data.u.regexp->pattern;
+ pattern = args[0].data.u.regexp->pattern;
if (pattern->code[n] != NULL) {
ret = pcre_exec(pattern->code[n], pattern->extra[n],
njs_ret_t
-njs_regexp_prototype_exec(njs_vm_t *vm, njs_param_t *param)
+njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
int *captures, ncaptures;
njs_ret_t ret;
njs_string_prop_t string;
njs_regexp_pattern_t *pattern;
- if (!njs_is_regexp(¶m->args[0])) {
+ if (!njs_is_regexp(&args[0])) {
vm->exception = &njs_exception_type_error;
return NXT_ERROR;
}
- if (param->nargs > 1) {
- value = ¶m->args[1];
+ if (nargs > 1) {
+ value = &args[1];
} else {
value = (njs_value_t *) &njs_string_void;
}
- regexp = param->args[0].data.u.regexp;
+ regexp = args[0].data.u.regexp;
regexp->string = *value;
(void) njs_string_prop(&string, value);
};
-njs_ret_t njs_regexp_constructor(njs_vm_t *vm, njs_param_t *param);
+njs_ret_t njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
nxt_int_t njs_regexp_literal(njs_vm_t *vm, njs_parser_t *parser,
njs_value_t *value);
njs_regexp_pattern_t *njs_regexp_pattern_create(njs_vm_t *vm,
u_char *string, size_t length, njs_regexp_flags_t flags);
njs_regexp_t *njs_regexp_alloc(njs_vm_t *vm, njs_regexp_pattern_t *pattern);
-njs_ret_t njs_regexp_prototype_exec(njs_vm_t *vm, njs_param_t *param);
+njs_ret_t njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
void njs_regexp_pattern_free(njs_regexp_pattern_t *pattern);
extern const njs_object_init_t njs_regexp_constructor_init;
#include <string.h>
-static nxt_noinline void njs_string_slice_prop(njs_param_t *param,
- njs_string_prop_t *string, njs_slice_prop_t *slice);
-static nxt_noinline void njs_string_slice_params(njs_param_t *param,
- njs_slice_prop_t *slice);
+static nxt_noinline void njs_string_slice_prop(njs_string_prop_t *string,
+ njs_slice_prop_t *slice, njs_value_t *args, nxt_uint_t nargs);
+static nxt_noinline void njs_string_slice_args(njs_slice_prop_t *slice,
+ njs_value_t *args, nxt_uint_t nargs);
static nxt_noinline ssize_t njs_string_index_of(njs_vm_t *vm,
njs_value_t *src, njs_value_t *search_string, size_t index);
njs_ret_t
-njs_string_constructor(njs_vm_t *vm, njs_param_t *param)
+njs_string_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_object_t *object;
const njs_value_t *value;
- if (param->nargs == 1) {
+ if (nargs == 1) {
value = &njs_string_empty;
} else {
- value = ¶m->args[1];
+ value = &args[1];
}
if (vm->frame->ctor) {
static njs_ret_t
-njs_string_prototype_value_of(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_value_t *value;
- value = ¶m->args[0];
+ value = &args[0];
if (value->type != NJS_STRING) {
*/
static njs_ret_t
-njs_string_prototype_concat(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
u_char *p, *start;
size_t size, length, mask;
- uintptr_t nargs;
nxt_uint_t i;
- njs_value_t *args;
njs_string_prop_t string;
- args = param->args;
-
if (njs_is_null_or_void(&args[0])) {
vm->exception = &njs_exception_type_error;
return NXT_ERROR;
}
- nargs = param->nargs;
-
for (i = 0; i < nargs; i++) {
if (!njs_is_string(&args[i])) {
*/
static njs_ret_t
-njs_string_prototype_from_utf8(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_from_utf8(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
u_char *p;
ssize_t length;
njs_slice_prop_t slice;
njs_string_prop_t string;
- njs_string_slice_prop(param, &string, &slice);
+ njs_string_slice_prop(&string, &slice, args, nargs);
if (string.length != 0) {
/* ASCII or UTF8 string. */
*/
static njs_ret_t
-njs_string_prototype_to_utf8(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_to_utf8(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_slice_prop_t slice;
njs_string_prop_t string;
- (void) njs_string_prop(&string, ¶m->args[0]);
+ (void) njs_string_prop(&string, &args[0]);
string.length = 0;
slice.string_length = string.size;
- njs_string_slice_params(param, &slice);
+ njs_string_slice_args(&slice, args, nargs);
return njs_string_slice(vm, &vm->retval, &string, &slice);
}
*/
static njs_ret_t
-njs_string_prototype_from_bytes(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_from_bytes(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
u_char *p, *s, *start, *end;
size_t size;
njs_slice_prop_t slice;
njs_string_prop_t string;
- njs_string_slice_prop(param, &string, &slice);
+ njs_string_slice_prop(&string, &slice, args, nargs);
if (string.length != 0) {
/* ASCII or UTF8 string. */
*/
static njs_ret_t
-njs_string_prototype_to_bytes(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_to_bytes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
u_char *p;
size_t length;
njs_slice_prop_t slice;
njs_string_prop_t string;
- njs_string_slice_prop(param, &string, &slice);
+ njs_string_slice_prop(&string, &slice, args, nargs);
if (string.length == 0) {
/* Byte string. */
*/
static nxt_noinline njs_ret_t
-njs_string_prototype_slice(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_slice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
njs_slice_prop_t slice;
njs_string_prop_t string;
- njs_string_slice_prop(param, &string, &slice);
+ njs_string_slice_prop(&string, &slice, args, nargs);
return njs_string_slice(vm, &vm->retval, &string, &slice);
}
*/
static njs_ret_t
-njs_string_prototype_substring(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_substring(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
ssize_t start, end, length;
- uintptr_t nargs;
njs_slice_prop_t slice;
njs_string_prop_t string;
- length = njs_string_prop(&string, ¶m->args[0]);
+ length = njs_string_prop(&string, &args[0]);
slice.string_length = length;
start = 0;
- nargs = param->nargs;
if (nargs > 1) {
- start = param->args[1].data.u.number;
+ start = args[1].data.u.number;
if (start < 0) {
start = 0;
}
if (nargs > 2) {
- end = param->args[2].data.u.number;
+ end = args[2].data.u.number;
if (end < 0) {
end = 0;
*/
static njs_ret_t
-njs_string_prototype_substr(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_substr(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
ssize_t start, length;
- uintptr_t nargs;
njs_slice_prop_t slice;
njs_string_prop_t string;
- length = njs_string_prop(&string, ¶m->args[0]);
+ length = njs_string_prop(&string, &args[0]);
slice.string_length = length;
start = 0;
- nargs = param->nargs;
if (nargs > 1) {
- start = param->args[1].data.u.number;
+ start = args[1].data.u.number;
if (start < 0) {
}
if (nargs > 2) {
- length = param->args[2].data.u.number;
+ length = args[2].data.u.number;
}
}
static njs_ret_t
-njs_string_prototype_char_at(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_char_at(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
ssize_t start, length;
njs_slice_prop_t slice;
njs_string_prop_t string;
- slice.string_length = njs_string_prop(&string, ¶m->args[0]);
+ slice.string_length = njs_string_prop(&string, &args[0]);
start = 0;
length = 1;
- if (param->nargs > 1) {
- start = param->args[1].data.u.number;
+ if (nargs > 1) {
+ start = args[1].data.u.number;
if (start < 0) {
length = 0;
static nxt_noinline void
-njs_string_slice_prop(njs_param_t *param, njs_string_prop_t *string,
- njs_slice_prop_t *slice)
+njs_string_slice_prop(njs_string_prop_t *string, njs_slice_prop_t *slice,
+ njs_value_t *args, nxt_uint_t nargs)
{
- slice->string_length = njs_string_prop(string, ¶m->args[0]);
+ slice->string_length = njs_string_prop(string, &args[0]);
- njs_string_slice_params(param, slice);
+ njs_string_slice_args(slice, args, nargs);
}
static nxt_noinline void
-njs_string_slice_params(njs_param_t *param, njs_slice_prop_t *slice)
+njs_string_slice_args(njs_slice_prop_t *slice, njs_value_t *args,
+ nxt_uint_t nargs)
{
ssize_t start, end, length;
- uintptr_t nargs;
length = slice->string_length;
start = 0;
- nargs = param->nargs;
if (nargs > 1) {
- start = param->args[1].data.u.number;
+ start = args[1].data.u.number;
if (start < 0) {
start += length;
end = length;
if (nargs > 2) {
- end = param->args[2].data.u.number;
+ end = args[2].data.u.number;
if (end < 0) {
end += length;
static njs_ret_t
-njs_string_prototype_char_code_at(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_char_code_at(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
double num;
ssize_t index, length;
const u_char *start, *end;
njs_string_prop_t string;
- length = njs_string_prop(&string, ¶m->args[0]);
+ length = njs_string_prop(&string, &args[0]);
index = 0;
- if (param->nargs > 1) {
- index = param->args[1].data.u.number;
+ if (nargs > 1) {
+ index = args[1].data.u.number;
if (nxt_slow_path(index < 0 || index >= length)) {
num = NJS_NAN;
static njs_ret_t
-njs_string_prototype_index_of(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
- ssize_t start, index;
- uintptr_t nargs;
- njs_value_t *args;
+ ssize_t start, index;
index = -1;
- args = param->args;
- nargs = param->nargs;
if (nargs > 1) {
start = 0;
static njs_ret_t
-njs_string_prototype_last_index_of(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused)
{
- ssize_t ret, index, last;
- uintptr_t nargs;
- njs_value_t *args;
+ ssize_t ret, index, last;
index = -1;
- args = param->args;
- nargs = param->nargs;
if (nargs > 1) {
last = NJS_STRING_MAX_LENGTH;
static njs_ret_t
-njs_string_prototype_search(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_search(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
int ret;
nxt_int_t index;
index = 0;
- if (param->nargs > 1) {
+ if (nargs > 1) {
- switch (param->args[1].type) {
+ switch (args[1].type) {
case NJS_VOID:
goto done;
case NJS_STRING:
- (void) njs_string_prop(&string, ¶m->args[1]);
+ (void) njs_string_prop(&string, &args[1]);
if (string.size == 0) {
goto done;
break;
default: /* NJS_REGEXP */
- pattern = param->args[1].data.u.regexp->pattern;
+ pattern = args[1].data.u.regexp->pattern;
}
index = -1;
- (void) njs_string_prop(&string, ¶m->args[0]);
+ (void) njs_string_prop(&string, &args[0]);
n = (string.length != 0 && string.length != string.size);
*/
static njs_ret_t
-njs_string_prototype_match(njs_vm_t *vm, njs_param_t *param)
+njs_string_prototype_match(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
u_char *start;
int32_t size, length;
njs_ret_t ret;
nxt_uint_t n, utf8;
- njs_value_t *args, tmp;
+ njs_value_t tmp;
njs_array_t *array;
njs_string_prop_t string;
njs_regexp_pattern_t *pattern;
int captures[3];
- if (param->nargs == 1) {
+ if (nargs == 1) {
goto empty;
}
- args = param->args;
-
switch (args[1].type) {
case NJS_VOID:
args[0] = args[1];
args[1] = tmp;
- return njs_regexp_prototype_exec(vm, param);
+ return njs_regexp_prototype_exec(vm, args, nargs, unused);
}
}
vm->retval = njs_value_null;
- (void) njs_string_prop(&string, ¶m->args[0]);
+ (void) njs_string_prop(&string, &args[0]);
utf8 = 0;
n = 0;
njs_value_t *value);
nxt_noinline size_t njs_string_prop(njs_string_prop_t *string,
njs_value_t *value);
-njs_ret_t njs_string_constructor(njs_vm_t *vm, njs_param_t *param);
+njs_ret_t njs_string_constructor(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
void njs_string_offset_map_init(const u_char *start, size_t size);
nxt_bool_t njs_string_eq(const njs_value_t *val1, const njs_value_t *val2);
nxt_int_t njs_string_cmp(const njs_value_t *val1, const njs_value_t *val2);
njs_vmcode_function_call(njs_vm_t *vm, njs_value_t *invld, njs_value_t *retval)
{
njs_ret_t ret;
+ nxt_uint_t nargs;
njs_value_t *args;
- njs_param_t param;
- njs_native_t native;
njs_function_t *function;
njs_native_frame_t *frame, *previous, *skip;
njs_continuation_t *continuation;
+ njs_function_native_t native;
njs_vmcode_function_call_t *call;
function = vm->frame->function;
}
call = (njs_vmcode_function_call_t *) vm->current;
- args = vm->scopes[NJS_SCOPE_CALLEE_ARGUMENTS];
+ args = vm->scopes[NJS_SCOPE_CALLEE_ARGUMENTS] - function->args_offset;
continuation = vm->frame->continuation;
if (continuation == NULL) {
- ret = njs_normalize_args(vm, args - 1, function->args_types,
- call->code.nargs);
+ nargs = call->code.nargs;
+
+ ret = njs_normalize_args(vm, args, function->args_types, nargs);
if (ret != NJS_OK) {
return ret;
}
- param.args = args - 1;
- param.nargs = call->code.nargs;
- param.retval = (njs_index_t) retval;
-
native = function->u.native;
} else {
- param.args = continuation->args;
- param.retval = (njs_index_t) retval;
- param.nargs = continuation->nargs;
-
+ args = continuation->args;
+ nargs = continuation->nargs;
native = continuation->function;
}
- ret = native(vm, ¶m);
+ ret = native(vm, args, nargs, (njs_index_t) retval);
+
/*
* A native method can return:
* NXT_OK on method success;
njs_primitive_value(njs_vm_t *vm, njs_value_t *value, nxt_uint_t hint)
{
njs_ret_t ret;
- njs_param_t param;
njs_value_t *retval;
+ njs_function_t *function;
njs_object_prop_t *prop;
nxt_lvlhsh_query_t lhq;
njs_continuation_t *continuation;
continuation = vm->frame->continuation;
if (continuation != NULL) {
- param.args = continuation->args;
- param.nargs = continuation->nargs;
- param.retval = (njs_index_t) &vm->frame->trap_scratch;
-
- ret = continuation->function(vm, ¶m);
-
+ ret = continuation->function(vm, continuation->args,
+ continuation->nargs,
+ (njs_index_t) &vm->frame->trap_scratch);
if (ret != NXT_OK) {
return ret;
}
continue;
}
- param.retval = (njs_index_t) retval;
- param.args = value;
- param.nargs = 0;
+ function = prop->value.data.u.function;
- ret = njs_function_apply(vm,
- prop->value.data.u.function,
- value, ¶m);
+ ret = njs_function_apply(vm, function, value, 1,
+ (njs_index_t) retval);
/*
* njs_function_apply() can return
* NXT_OK, NJS_APPLIED, NXT_ERROR, NXT_AGAIN.
typedef struct njs_parser_s njs_parser_t;
typedef njs_ret_t (*njs_getter_t) (njs_vm_t *vm, njs_value_t *obj);
-typedef njs_ret_t (*njs_native_t) (njs_vm_t *vm, njs_param_t *param);
+typedef njs_ret_t (*njs_function_native_t) (njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t retval);
typedef struct njs_string_s njs_string_t;
union {
njs_function_lambda_t *lambda;
- njs_native_t native;
+ njs_function_native_t native;
} u;
njs_value_t *args;
typedef union njs_value_s njs_value_t;
typedef struct njs_vm_shared_s njs_vm_shared_t;
-typedef struct {
- njs_value_t *args;
- uintptr_t nargs;
- njs_index_t retval;
-} njs_param_t;
-
/* sizeof(njs_value_t) is 16 bytes. */
#define njs_argument(args, n) \
typedef njs_ret_t (*njs_extern_foreach_t)(njs_vm_t *vm, void *obj, void *next);
typedef njs_ret_t (*njs_extern_next_t)(njs_vm_t *vm, njs_value_t *value,
void *obj, void *next);
-typedef njs_ret_t (*njs_extern_method_t)(njs_vm_t *vm, njs_param_t *param);
+typedef njs_ret_t (*njs_extern_method_t)(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
typedef struct njs_external_s njs_external_t;
"a.forEach(function(v, i, a) { a[i+3] = a.length }); a"),
nxt_string("1,2,3,3,4,5") },
+ { nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
+ "[].forEach.call(a, function(v, i, a) { this.sum += v }, s);"
+ "s.sum"),
+ nxt_string("6") },
+
+ { nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
+ "[].forEach.apply(a,"
+ "[ function(v, i, a) { this.sum += v }, s ]);"
+ "s.sum"),
+ nxt_string("6") },
+
{ nxt_string("var a = [];"
"a.some(function(v, i, a) { return v > 1 })"),
nxt_string("false") },
static njs_ret_t
-njs_unit_test_method_external(njs_vm_t *vm, njs_param_t *param)
+njs_unit_test_method_external(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
{
nxt_int_t ret;
nxt_str_t s;
next = 0;
- if (param->nargs > 1) {
+ if (nargs > 1) {
- ret = njs_value_string_copy(vm, &s, njs_argument(param->args, 1),
- &next);
+ ret = njs_value_string_copy(vm, &s, njs_argument(args, 1), &next);
if (ret == NXT_OK && s.len == 3 && memcmp(s.data, "YES", 3) == 0) {
- r = njs_value_data(njs_argument(param->args, 0));
+ r = njs_value_data(njs_argument(args, 0));
njs_vm_return_string(vm, r->uri.data, r->uri.len);
return NXT_OK;