static njs_int_t njs_buffer_digest(njs_vm_t *vm, njs_value_t *value,
const njs_str_t *src);
static njs_int_t njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t hmac);
+ njs_uint_t nargs, njs_index_t hmac, njs_value_t *retval);
static njs_int_t njs_hash_prototype_digest(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t hmac);
+ njs_uint_t nargs, njs_index_t hmac, njs_value_t *retval);
static njs_int_t njs_hash_prototype_copy(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t hmac);
+ njs_uint_t nargs, njs_index_t hmac, njs_value_t *retval);
static njs_int_t njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_crypto_init(njs_vm_t *vm);
static njs_int_t
njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_digest_t *dgst;
njs_hash_alg_t *alg;
alg->init(&dgst->u);
- return njs_vm_external_create(vm, &vm->retval, njs_crypto_hash_proto_id,
+ return njs_vm_external_create(vm, retval, njs_crypto_hash_proto_id,
dgst, 0);
}
static njs_int_t
njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t hmac)
+ njs_index_t hmac, njs_value_t *retval)
{
njs_str_t data;
njs_int_t ret;
switch (value->type) {
case NJS_STRING:
- encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, 2));
+ encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, 2), 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
ctx->alg->update(&ctx->u, data.start, data.length);
}
- vm->retval = *this;
+ njs_value_assign(retval, this);
return NJS_OK;
}
static njs_int_t
njs_hash_prototype_digest(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t hmac)
+ njs_index_t hmac, njs_value_t *retval)
{
njs_str_t str;
njs_hmac_t *ctx;
str.start = digest;
str.length = alg->size;
- return enc->encode(vm, &vm->retval, &str);
+ return enc->encode(vm, retval, &str);
exception:
static njs_int_t
njs_hash_prototype_copy(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_digest_t *dgst, *copy;
memcpy(copy, dgst, sizeof(njs_digest_t));
- return njs_vm_external_create(vm, njs_vm_retval(vm),
+ return njs_vm_external_create(vm, retval,
njs_crypto_hash_proto_id, copy, 0);
}
static njs_int_t
njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_str_t key;
njs_uint_t i;
alg->init(&ctx->u);
alg->update(&ctx->u, key_buf, 64);
- return njs_vm_external_create(vm, &vm->retval, njs_crypto_hmac_proto_id,
+ return njs_vm_external_create(vm, retval, njs_crypto_hmac_proto_id,
ctx, 0);
}
static njs_int_t njs_fs_access(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_mkdir(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_open(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype);
+ njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_close(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype);
+ njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_read(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype);
+ njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_read_file(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_readdir(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_realpath(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_rename(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_rmdir(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_stat(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_symlink(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_unlink(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_write(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype);
+ njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_write_file(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t calltype);
+ njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
static njs_int_t njs_fs_constants(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *unused, njs_value_t *retval);
njs_value_t *value, njs_value_t *unused, njs_value_t *retval);
static njs_int_t njs_fs_dirent_constructor(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_fs_dirent_test(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t testtype);
+ njs_uint_t nargs, njs_index_t testtype, njs_value_t *retval);
static njs_int_t njs_fs_stats_test(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t testtype);
+ njs_uint_t nargs, njs_index_t testtype, njs_value_t *retval);
static njs_int_t njs_fs_stats_prop(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
static njs_int_t njs_fs_stats_create(njs_vm_t *vm, struct stat *st,
njs_value_t *retval);
static njs_int_t njs_fs_filehandle_close(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_fs_filehandle_value_of(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_fs_filehandle_create(njs_vm_t *vm, int fd,
njs_bool_t shadow, njs_value_t *retval);
static njs_int_t njs_fs_fd_read(njs_vm_t *vm, int fd, njs_str_t *data);
static njs_int_t njs_fs_error(njs_vm_t *vm, const char *syscall,
- const char *desc, const char *path, int errn, njs_value_t *retval);
+ const char *desc, const char *path, int errn, njs_value_t *result);
static njs_int_t njs_fs_result(njs_vm_t *vm, njs_value_t *result,
- njs_index_t calltype, const njs_value_t* callback, njs_uint_t nargs);
+ njs_index_t calltype, const njs_value_t* callback, njs_uint_t nargs,
+ njs_value_t *retval);
static njs_int_t njs_file_tree_walk(const char *path,
njs_file_tree_walk_cb_t cb, int fd_limit, njs_ftw_flags_t flags);
static njs_int_t
njs_fs_access(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
int md;
njs_int_t ret;
const char *path;
- njs_value_t retval, *callback, *mode;
+ njs_value_t result, *callback, *mode;
char path_buf[NJS_MAX_PATH + 1];
path = njs_fs_path(vm, path_buf, njs_arg(args, nargs, 1), "path");
return NJS_ERROR;
}
- njs_set_undefined(&retval);
+ njs_set_undefined(&result);
ret = access(path, md);
if (njs_slow_path(ret != 0)) {
- ret = njs_fs_error(vm, "access", strerror(errno), path, errno, &retval);
+ ret = njs_fs_error(vm, "access", strerror(errno), path, errno, &result);
}
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, callback, 1);
+ return njs_fs_result(vm, &result, calltype, callback, 1, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_open(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
int fd, flags;
mode_t md;
njs_int_t ret;
const char *path;
- njs_value_t retval, *value;
+ njs_value_t result, *value;
char path_buf[NJS_MAX_PATH + 1];
path = njs_fs_path(vm, path_buf, njs_arg(args, nargs, 1), "path");
fd = open(path, flags, md);
if (njs_slow_path(fd < 0)) {
- ret = njs_fs_error(vm, "open", strerror(errno), path, errno, &retval);
+ ret = njs_fs_error(vm, "open", strerror(errno), path, errno, &result);
goto done;
}
- ret = njs_fs_filehandle_create(vm, fd, calltype == NJS_FS_DIRECT, &retval);
+ ret = njs_fs_filehandle_create(vm, fd, calltype == NJS_FS_DIRECT, &result);
if (njs_slow_path(ret != NJS_OK)) {
goto done;
}
if (calltype == NJS_FS_DIRECT) {
- njs_value_number_set(&retval, fd);
+ njs_value_number_set(&result, fd);
}
done:
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, NULL, 2);
+ return njs_fs_result(vm, &result, calltype, NULL, 2, retval);
}
if (fd != -1) {
static njs_int_t
njs_fs_close(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
int64_t fd;
njs_int_t ret;
- njs_value_t retval, *fh;
+ njs_value_t result, *fh;
fh = njs_arg(args, nargs, 1);
return ret;
}
- njs_set_undefined(&retval);
+ njs_set_undefined(&result);
ret = close((int) fd);
if (njs_slow_path(ret != 0)) {
- ret = njs_fs_error(vm, "close", strerror(errno), NULL, errno, &retval);
+ ret = njs_fs_error(vm, "close", strerror(errno), NULL, errno, &result);
}
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, NULL, 1);
+ return njs_fs_result(vm, &result, calltype, NULL, 1, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_mkdir(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
char *path;
mode_t md;
njs_int_t ret;
- njs_value_t mode, recursive, retval, *callback, *options;
+ njs_value_t mode, recursive, result, *callback, *options;
char path_buf[NJS_MAX_PATH + 1];
path = (char *) njs_fs_path(vm, path_buf, njs_arg(args, nargs, 1), "path");
return NJS_ERROR;
}
- ret = njs_fs_make_path(vm, path, md, njs_is_true(&recursive), &retval);
+ ret = njs_fs_make_path(vm, path, md, njs_is_true(&recursive), &result);
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, callback, 1);
+ return njs_fs_result(vm, &result, calltype, callback, 1, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_read(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
int64_t fd, length, pos, offset;
ssize_t n;
njs_int_t ret;
njs_str_t data;
njs_uint_t fd_offset;
- njs_value_t retval, *buffer, *value;
+ njs_value_t result, *buffer, *value;
njs_typed_array_t *array;
njs_array_buffer_t *array_buffer;
}
if (njs_slow_path(n == -1)) {
- ret = njs_fs_error(vm, "read", strerror(errno), NULL, errno, &retval);
+ ret = njs_fs_error(vm, "read", strerror(errno), NULL, errno, &result);
goto done;
}
if (calltype == NJS_FS_PROMISE) {
- ret = njs_fs_bytes_read_create(vm, n, buffer, &retval);
+ ret = njs_fs_bytes_read_create(vm, n, buffer, &result);
if (njs_slow_path(ret != NJS_OK)) {
goto done;
}
} else {
- njs_value_number_set(&retval, n);
+ njs_value_number_set(&result, n);
}
done:
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, NULL, 1);
+ return njs_fs_result(vm, &result, calltype, NULL, 1, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
int fd, flags;
njs_str_t data;
njs_int_t ret;
const char *path;
- njs_value_t flag, encode, retval, *callback, *options;
+ njs_value_t flag, encode, result, *callback, *options;
struct stat sb;
const njs_buffer_encoding_t *encoding;
char path_buf[NJS_MAX_PATH + 1];
encoding = NULL;
if (njs_is_defined(&encode)) {
- encoding = njs_buffer_encoding(vm, &encode);
+ encoding = njs_buffer_encoding(vm, &encode, 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
fd = open(path, flags);
if (njs_slow_path(fd < 0)) {
- ret = njs_fs_error(vm, "open", strerror(errno), path, errno, &retval);
+ ret = njs_fs_error(vm, "open", strerror(errno), path, errno, &result);
goto done;
}
ret = fstat(fd, &sb);
if (njs_slow_path(ret == -1)) {
- ret = njs_fs_error(vm, "stat", strerror(errno), path, errno, &retval);
+ ret = njs_fs_error(vm, "stat", strerror(errno), path, errno, &result);
goto done;
}
if (njs_slow_path(!S_ISREG(sb.st_mode))) {
- ret = njs_fs_error(vm, "stat", "File is not regular", path, 0, &retval);
+ ret = njs_fs_error(vm, "stat", "File is not regular", path, 0, &result);
goto done;
}
if (njs_slow_path(ret != NJS_OK)) {
if (ret == NJS_DECLINED) {
ret = njs_fs_error(vm, "read", strerror(errno), path, errno,
- &retval);
+ &result);
}
goto done;
}
if (encoding == NULL) {
- ret = njs_buffer_set(vm, &retval, data.start, data.length);
+ ret = njs_buffer_set(vm, &result, data.start, data.length);
} else {
- ret = encoding->encode(vm, &retval, &data);
+ ret = encoding->encode(vm, &result, &data);
njs_mp_free(vm->mem_pool, data.start);
}
}
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, callback, 2);
+ return njs_fs_result(vm, &result, calltype, callback, 2, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_readdir(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
DIR *dir;
njs_str_t s;
njs_int_t ret;
const char *path;
- njs_value_t encode, types, ename, etype, retval,
+ njs_value_t encode, types, ename, etype, result,
*callback, *options, *value;
njs_array_t *results;
struct dirent *entry;
encoding = NULL;
if (!njs_is_string(&encode) || !njs_string_eq(&encode, &string_buffer)) {
- encoding = njs_buffer_encoding(vm, &encode);
+ encoding = njs_buffer_encoding(vm, &encode, 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
return NJS_ERROR;
}
- njs_set_array(&retval, results);
+ njs_set_array(&result, results);
dir = opendir(path);
if (njs_slow_path(dir == NULL)) {
ret = njs_fs_error(vm, "opendir", strerror(errno), path, errno,
- &retval);
+ &result);
goto done;
}
if (njs_slow_path(entry == NULL)) {
if (errno != 0) {
ret = njs_fs_error(vm, "readdir", strerror(errno), path, errno,
- &retval);
+ &result);
}
goto done;
}
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, callback, 2);
+ return njs_fs_result(vm, &result, calltype, callback, 2, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_realpath(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t s;
const char *path;
- njs_value_t encode, retval, *callback, *options;
+ njs_value_t encode, result, *callback, *options;
const njs_buffer_encoding_t *encoding;
char path_buf[NJS_MAX_PATH + 1],
dst_buf[NJS_MAX_PATH + 1];
encoding = NULL;
if (!njs_is_string(&encode) || !njs_string_eq(&encode, &string_buffer)) {
- encoding = njs_buffer_encoding(vm, &encode);
+ encoding = njs_buffer_encoding(vm, &encode, 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
s.start = (u_char *) realpath(path, dst_buf);
if (njs_slow_path(s.start == NULL)) {
ret = njs_fs_error(vm, "realpath", strerror(errno), path, errno,
- &retval);
+ &result);
goto done;
}
s.length = njs_strlen(s.start);
if (encoding == NULL) {
- ret = njs_buffer_new(vm, &retval, s.start, s.length);
+ ret = njs_buffer_new(vm, &result, s.start, s.length);
} else {
- ret = encoding->encode(vm, &retval, &s);
+ ret = encoding->encode(vm, &result, &s);
}
done:
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, callback, 2);
+ return njs_fs_result(vm, &result, calltype, callback, 2, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_rename(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
njs_int_t ret;
const char *path, *newpath;
- njs_value_t retval, *callback;
+ njs_value_t result, *callback;
char path_buf[NJS_MAX_PATH + 1], newpath_buf[NJS_MAX_PATH + 1];
callback = NULL;
return NJS_ERROR;
}
- njs_set_undefined(&retval);
+ njs_set_undefined(&result);
ret = rename(path, newpath);
if (njs_slow_path(ret != 0)) {
- ret = njs_fs_error(vm, "rename", strerror(errno), NULL, errno, &retval);
+ ret = njs_fs_error(vm, "rename", strerror(errno), NULL, errno, &result);
}
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, callback, 1);
+ return njs_fs_result(vm, &result, calltype, callback, 1, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_rmdir(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
njs_int_t ret;
const char *path;
- njs_value_t recursive, retval, *callback, *options;
+ njs_value_t recursive, result, *callback, *options;
char path_buf[NJS_MAX_PATH + 1];
path = njs_fs_path(vm, path_buf, njs_arg(args, nargs, 1), "path");
}
}
- ret = njs_fs_rmtree(vm, path, njs_is_true(&recursive), &retval);
+ ret = njs_fs_rmtree(vm, path, njs_is_true(&recursive), &result);
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, callback, 1);
+ return njs_fs_result(vm, &result, calltype, callback, 1, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_stat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t magic)
+ njs_index_t magic, njs_value_t *retval)
{
int64_t fd;
njs_int_t ret;
njs_bool_t throw;
struct stat sb;
const char *path;
- njs_value_t retval, *callback, *options;
+ njs_value_t result, *callback, *options;
njs_fs_calltype_t calltype;
char path_buf[NJS_MAX_PATH + 1];
}
ret = njs_value_property(vm, options, njs_value_arg(&string_bigint),
- &retval);
+ &result);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
- if (njs_bool(&retval)) {
+ if (njs_bool(&result)) {
njs_type_error(vm, "\"bigint\" is not supported");
return NJS_ERROR;
}
if (calltype == NJS_FS_DIRECT) {
ret = njs_value_property(vm, options, njs_value_arg(&string_throw),
- &retval);
+ &result);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
- throw = njs_bool(&retval);
+ throw = njs_bool(&result);
}
}
if (errno != ENOENT || throw) {
ret = njs_fs_error(vm,
((magic >> 2) == NJS_FS_STAT) ? "stat" : "lstat",
- strerror(errno), path, errno, &retval);
+ strerror(errno), path, errno, &result);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
} else {
- njs_set_undefined(&retval);
+ njs_set_undefined(&result);
}
- return njs_fs_result(vm, &retval, calltype, callback, 2);
+ return njs_fs_result(vm, &result, calltype, callback, 2, retval);
}
- ret = njs_fs_stats_create(vm, &sb, &retval);
+ ret = njs_fs_stats_create(vm, &sb, &result);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- return njs_fs_result(vm, &retval, calltype, callback, 2);
+ return njs_fs_result(vm, &result, calltype, callback, 2, retval);
}
static njs_int_t
njs_fs_symlink(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
njs_int_t ret;
const char *target, *path;
- njs_value_t retval, *callback, *type;
+ njs_value_t result, *callback, *type;
char target_buf[NJS_MAX_PATH + 1], path_buf[NJS_MAX_PATH + 1];
target = njs_fs_path(vm, target_buf, njs_arg(args, nargs, 1), "target");
return NJS_ERROR;
}
- njs_set_undefined(&retval);
+ njs_set_undefined(&result);
ret = symlink(target, path);
if (njs_slow_path(ret != 0)) {
ret = njs_fs_error(vm, "symlink", strerror(errno), path, errno,
- &retval);
+ &result);
}
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, callback, 1);
+ return njs_fs_result(vm, &result, calltype, callback, 1, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_unlink(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
njs_int_t ret;
const char *path;
- njs_value_t retval, *callback;
+ njs_value_t result, *callback;
char path_buf[NJS_MAX_PATH + 1];
path = njs_fs_path(vm, path_buf, njs_arg(args, nargs, 1), "path");
}
}
- njs_set_undefined(&retval);
+ njs_set_undefined(&result);
ret = unlink(path);
if (njs_slow_path(ret != 0)) {
- ret = njs_fs_error(vm, "unlink", strerror(errno), path, errno, &retval);
+ ret = njs_fs_error(vm, "unlink", strerror(errno), path, errno, &result);
}
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, callback, 1);
+ return njs_fs_result(vm, &result, calltype, callback, 1, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_write(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t calltype)
+ njs_index_t calltype, njs_value_t *retval)
{
int64_t fd, length, pos, offset;
ssize_t n;
njs_int_t ret;
njs_str_t data;
njs_uint_t fd_offset;
- njs_value_t retval, *buffer, *value;
+ njs_value_t result, *buffer, *value;
const njs_buffer_encoding_t *encoding;
fd_offset = !!(calltype == NJS_FS_DIRECT);
}
}
- encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, fd_offset + 3));
+ encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, fd_offset + 3),
+ 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
- ret = njs_buffer_decode_string(vm, buffer, &retval, encoding);
+ ret = njs_buffer_decode_string(vm, buffer, &result, encoding);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- njs_string_get(&retval, &data);
+ njs_string_get(&result, &data);
goto process;
}
}
if (njs_slow_path(n == -1)) {
- ret = njs_fs_error(vm, "write", strerror(errno), NULL, errno, &retval);
+ ret = njs_fs_error(vm, "write", strerror(errno), NULL, errno, &result);
goto done;
}
if (njs_slow_path((size_t) n != data.length)) {
ret = njs_fs_error(vm, "write", "failed to write all the data", NULL,
- 0, &retval);
+ 0, &result);
goto done;
}
if (calltype == NJS_FS_PROMISE) {
- ret = njs_fs_bytes_written_create(vm, n, buffer, &retval);
+ ret = njs_fs_bytes_written_create(vm, n, buffer, &result);
if (njs_slow_path(ret != NJS_OK)) {
goto done;
}
} else {
- njs_value_number_set(&retval, n);
+ njs_value_number_set(&result, n);
}
done:
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, NULL, 1);
+ return njs_fs_result(vm, &result, calltype, NULL, 1, retval);
}
return NJS_ERROR;
static njs_int_t
njs_fs_write_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t magic)
+ njs_index_t magic, njs_value_t *retval)
{
int fd, flags;
u_char *p, *end;
njs_str_t content;
njs_int_t ret;
const char *path;
- njs_value_t flag, mode, encode, retval, *data, *callback,
+ njs_value_t flag, mode, encode, result, *data, *callback,
*options;
njs_typed_array_t *array;
njs_fs_calltype_t calltype;
case NJS_STRING:
default:
- encoding = njs_buffer_encoding(vm, &encode);
+ encoding = njs_buffer_encoding(vm, &encode, 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
- ret = njs_value_to_string(vm, &retval, data);
+ ret = njs_value_to_string(vm, &result, data);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- ret = njs_buffer_decode_string(vm, &retval, &retval, encoding);
+ ret = njs_buffer_decode_string(vm, &result, &result, encoding);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- njs_string_get(&retval, &content);
+ njs_string_get(&result, &content);
break;
}
fd = open(path, flags, md);
if (njs_slow_path(fd < 0)) {
- ret = njs_fs_error(vm, "open", strerror(errno), path, errno, &retval);
+ ret = njs_fs_error(vm, "open", strerror(errno), path, errno, &result);
goto done;
}
}
ret = njs_fs_error(vm, "write", strerror(errno), path, errno,
- &retval);
+ &result);
goto done;
}
}
ret = NJS_OK;
- njs_set_undefined(&retval);
+ njs_set_undefined(&result);
done:
}
if (ret == NJS_OK) {
- return njs_fs_result(vm, &retval, calltype, callback, 1);
+ return njs_fs_result(vm, &result, calltype, callback, 1, retval);
}
return NJS_ERROR;
static njs_int_t
ngx_fs_promise_trampoline(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t value;
static njs_int_t
njs_fs_result(njs_vm_t *vm, njs_value_t *result, njs_index_t calltype,
- const njs_value_t *callback, njs_uint_t nargs)
+ const njs_value_t *callback, njs_uint_t nargs, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t promise, callbacks[2], arguments[2];
switch (calltype) {
case NJS_FS_DIRECT:
- vm->retval = *result;
- return njs_is_error(result) ? NJS_ERROR : NJS_OK;
+ if (njs_is_error(result)) {
+ njs_vm_throw(vm, result);
+ return NJS_ERROR;
+ }
+
+ njs_value_assign(retval, result);
+ return NJS_OK;
case NJS_FS_PROMISE:
ret = njs_vm_promise_create(vm, &promise, &callbacks[0]);
return ret;
}
- vm->retval = promise;
+ njs_value_assign(retval, &promise);
return NJS_OK;
return ret;
}
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
static njs_int_t
njs_fs_dirent_constructor(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
if (njs_slow_path(!vm->top_frame->ctor)) {
njs_type_error(vm, "the Dirent constructor must be called with new");
}
return njs_fs_dirent_create(vm, njs_arg(args, nargs, 1),
- njs_arg(args, nargs, 2), &vm->retval);
+ njs_arg(args, nargs, 2), retval);
}
static njs_int_t
njs_fs_dirent_test(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t testtype)
+ njs_index_t testtype, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t type, *this;
return NJS_ERROR;
}
- njs_set_boolean(&vm->retval,
+ njs_set_boolean(retval,
njs_is_number(&type) && testtype == njs_number(&type));
return NJS_OK;
static njs_int_t
njs_fs_stats_test(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t testtype)
+ njs_index_t testtype, njs_value_t *retval)
{
unsigned mask;
njs_stat_t *st;
mask = S_IFSOCK;
}
- njs_set_boolean(&vm->retval, (st->st_mode & S_IFMT) == mask);
+ njs_set_boolean(retval, (st->st_mode & S_IFMT) == mask);
return NJS_OK;
}
static njs_int_t
njs_fs_filehandle_close(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- njs_value_t retval;
+ njs_value_t result;
njs_filehandle_t *fh;
fh = njs_vm_external(vm, njs_fs_filehandle_proto_id, njs_argument(args, 0));
(void) close(fh->fd);
fh->fd = -1;
- njs_set_undefined(&retval);
+ njs_set_undefined(&result);
- return njs_fs_result(vm, &retval, NJS_FS_PROMISE, NULL, 1);
+ return njs_fs_result(vm, &result, NJS_FS_PROMISE, NULL, 1, retval);
}
static njs_int_t
njs_fs_filehandle_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_filehandle_t *fh;
return NJS_ERROR;
}
- njs_set_number(njs_vm_retval(vm), fh->fd);
+ njs_set_number(retval, fh->fd);
return NJS_OK;
}
u_char *end, const njs_str_t *sep, const njs_str_t *eq,
njs_function_t *decode, njs_uint_t max_keys, njs_value_t *retval);
static njs_int_t njs_query_string_parse(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_query_string_stringify(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_query_string_escape(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_query_string_unescape(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_query_string_init(njs_vm_t *vm);
static njs_int_t
njs_query_string_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t max_keys;
njs_int_t ret;
}
return njs_query_string_parser(vm, str.start, str.start + str.length,
- &sep, &eq, decode, max_keys, &vm->retval);
+ &sep, &eq, decode, max_keys, retval);
}
static njs_int_t
njs_query_string_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *p;
int64_t len;
uint64_t length;
njs_int_t ret;
njs_chb_t chain;
- njs_value_t value, retval, *string, *this, *object, *arg, *options;
+ njs_value_t value, result, *string, *this, *object, *arg, *options;
njs_array_t *keys, *array;
njs_function_t *encode;
njs_string_prop_t sep, eq;
object = njs_arg(args, nargs, 1);
if (njs_slow_path(!njs_is_object(object))) {
- vm->retval = njs_string_empty;
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
}
for (i = 0; i < len; i++) {
- ret = njs_value_property_i64(vm, &value, i, &retval);
+ ret = njs_value_property_i64(vm, &value, i, &result);
if (njs_slow_path(ret == NJS_ERROR)) {
goto failed;
}
length += sep.length;
}
- ret = njs_query_string_push(vm, &chain, string, &retval, &eq,
+ ret = njs_query_string_push(vm, &chain, string, &result, &eq,
encode);
if (njs_slow_path(ret < 0)) {
ret = NJS_ERROR;
return NJS_ERROR;
}
- p = njs_string_alloc(vm, &vm->retval, size, length);
+ p = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_query_string_escape(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *p;
ssize_t size, length;
size = njs_chb_size(&chain);
- p = njs_string_alloc(vm, &vm->retval, size, length);
+ p = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_query_string_unescape(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t str;
njs_string_get(string, &str);
- return njs_query_string_decode(vm, &vm->retval, str.start, str.length);
+ return njs_query_string_decode(vm, retval, str.start, str.length);
}
static njs_int_t njs_ext_cipher(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_cipher_pkey(njs_vm_t *vm, njs_str_t *data,
- njs_webcrypto_key_t *key, njs_index_t encrypt);
+ njs_webcrypto_key_t *key, njs_index_t encrypt, njs_value_t *retval);
static njs_int_t njs_cipher_aes_gcm(njs_vm_t *vm, njs_str_t *data,
- njs_webcrypto_key_t *key, njs_value_t *options, njs_bool_t encrypt);
+ njs_webcrypto_key_t *key, njs_value_t *options, njs_bool_t encrypt,
+ njs_value_t *retval);
static njs_int_t njs_cipher_aes_ctr(njs_vm_t *vm, njs_str_t *data,
- njs_webcrypto_key_t *key, njs_value_t *options, njs_bool_t encrypt);
+ njs_webcrypto_key_t *key, njs_value_t *options, njs_bool_t encrypt,
+ njs_value_t *retval);
static njs_int_t njs_cipher_aes_cbc(njs_vm_t *vm, njs_str_t *data,
- njs_webcrypto_key_t *key, njs_value_t *options, njs_bool_t encrypt);
+ njs_webcrypto_key_t *key, njs_value_t *options, njs_bool_t encrypt,
+ njs_value_t *retval);
static njs_int_t njs_ext_derive(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t derive_key);
+ njs_uint_t nargs, njs_index_t derive_key, njs_value_t *retval);
static njs_int_t njs_ext_digest(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_ext_export_key(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_ext_generate_key(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_ext_import_key(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_ext_sign(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t verify);
+ njs_uint_t nargs, njs_index_t verify, njs_value_t *retval);
static njs_int_t njs_ext_unwrap_key(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_ext_wrap_key(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_ext_get_random_values(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_webcrypto_key_t *njs_webcrypto_key_alloc(njs_vm_t *vm,
njs_webcrypto_algorithm_t *alg, unsigned usage, njs_bool_t extractable);
int *curve);
static njs_int_t njs_webcrypto_result(njs_vm_t *vm, njs_value_t *result,
- njs_int_t rc);
+ njs_int_t rc, njs_value_t *retval);
static njs_int_t njs_webcrypto_array_buffer(njs_vm_t *vm, njs_value_t *retval,
u_char *start, size_t length);
static void njs_webcrypto_error(njs_vm_t *vm, const char *fmt, ...);
static njs_int_t
njs_ext_cipher(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t encrypt)
+ njs_index_t encrypt, njs_value_t *retval)
{
unsigned mask;
njs_int_t ret;
njs_str_t data;
- njs_value_t *options;
+ njs_value_t *options, value;
njs_webcrypto_key_t *key;
njs_webcrypto_algorithm_t *alg;
switch (alg->type) {
case NJS_ALGORITHM_RSA_OAEP:
- ret = njs_cipher_pkey(vm, &data, key, encrypt);
+ ret = njs_cipher_pkey(vm, &data, key, encrypt, &value);
break;
case NJS_ALGORITHM_AES_GCM:
- ret = njs_cipher_aes_gcm(vm, &data, key, options, encrypt);
+ ret = njs_cipher_aes_gcm(vm, &data, key, options, encrypt, &value);
break;
case NJS_ALGORITHM_AES_CTR:
- ret = njs_cipher_aes_ctr(vm, &data, key, options, encrypt);
+ ret = njs_cipher_aes_ctr(vm, &data, key, options, encrypt, &value);
break;
case NJS_ALGORITHM_AES_CBC:
default:
- ret = njs_cipher_aes_cbc(vm, &data, key, options, encrypt);
+ ret = njs_cipher_aes_cbc(vm, &data, key, options, encrypt, &value);
}
- return njs_webcrypto_result(vm, njs_vm_retval(vm), ret);
+ return njs_webcrypto_result(vm, &value, ret, retval);
fail:
- return njs_webcrypto_result(vm, njs_vm_retval(vm), NJS_ERROR);
+ return njs_webcrypto_result(vm, NULL, NJS_ERROR, retval);
}
static njs_int_t
njs_cipher_pkey(njs_vm_t *vm, njs_str_t *data, njs_webcrypto_key_t *key,
- njs_index_t encrypt)
+ njs_index_t encrypt, njs_value_t *retval)
{
u_char *dst;
size_t outlen;
goto fail;
}
- ret = njs_vm_value_array_buffer_set(vm, njs_vm_retval(vm), dst, outlen);
+ ret = njs_vm_value_array_buffer_set(vm, retval, dst, outlen);
fail:
static njs_int_t
njs_cipher_aes_gcm(njs_vm_t *vm, njs_str_t *data, njs_webcrypto_key_t *key,
- njs_value_t *options, njs_bool_t encrypt)
+ njs_value_t *options, njs_bool_t encrypt, njs_value_t *retval)
{
int len, outlen, dstlen;
u_char *dst, *p;
outlen += taglen;
}
- ret = njs_vm_value_array_buffer_set(vm, njs_vm_retval(vm), dst, outlen);
+ ret = njs_vm_value_array_buffer_set(vm, retval, dst, outlen);
fail:
static njs_int_t
njs_cipher_aes_ctr(njs_vm_t *vm, njs_str_t *data, njs_webcrypto_key_t *key,
- njs_value_t *options, njs_bool_t encrypt)
+ njs_value_t *options, njs_bool_t encrypt, njs_value_t *retval)
{
int len, len2;
u_char *dst;
done:
- ret = njs_vm_value_array_buffer_set(vm, njs_vm_retval(vm), dst, len);
+ ret = njs_vm_value_array_buffer_set(vm, retval, dst, len);
fail:
static njs_int_t
njs_cipher_aes_cbc(njs_vm_t *vm, njs_str_t *data, njs_webcrypto_key_t *key,
- njs_value_t *options, njs_bool_t encrypt)
+ njs_value_t *options, njs_bool_t encrypt, njs_value_t *retval)
{
int olen_max, olen, olen2;
u_char *dst;
olen += olen2;
- ret = njs_vm_value_array_buffer_set(vm, njs_vm_retval(vm), dst, olen);
+ ret = njs_vm_value_array_buffer_set(vm, retval, dst, olen);
fail:
static njs_int_t
njs_ext_derive(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t derive_key)
+ njs_index_t derive_key, njs_value_t *retval)
{
u_char *k;
size_t olen;
goto fail;
}
- return njs_webcrypto_result(vm, &value, NJS_OK);
+ return njs_webcrypto_result(vm, &value, NJS_OK, retval);
fail:
- return njs_webcrypto_result(vm, njs_vm_retval(vm), NJS_ERROR);
+ return njs_webcrypto_result(vm, NULL, NJS_ERROR, retval);
}
static njs_int_t
njs_ext_digest(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
unsigned olen;
u_char *dst;
goto fail;
}
- return njs_webcrypto_result(vm, &value, NJS_OK);
+ return njs_webcrypto_result(vm, &value, NJS_OK, retval);
fail:
- return njs_webcrypto_result(vm, njs_vm_retval(vm), NJS_ERROR);
+ return njs_webcrypto_result(vm, NULL, NJS_ERROR, retval);
}
static njs_int_t
njs_ext_export_key(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
BIO *bio;
BUF_MEM *mem;
break;
}
- return njs_webcrypto_result(vm, &value, NJS_OK);
+ return njs_webcrypto_result(vm, &value, NJS_OK, retval);
fail:
- return njs_webcrypto_result(vm, njs_vm_retval(vm), NJS_ERROR);
+ return njs_webcrypto_result(vm, NULL, NJS_ERROR, retval);
}
static njs_int_t
njs_ext_generate_key(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int nid;
unsigned usage;
return NJS_ERROR;
}
- return njs_webcrypto_result(vm, &value, NJS_OK);
+ return njs_webcrypto_result(vm, &value, NJS_OK, retval);
fail:
EVP_PKEY_CTX_free(ctx);
}
- return njs_webcrypto_result(vm, njs_vm_retval(vm), NJS_ERROR);
+ return njs_webcrypto_result(vm, NULL, NJS_ERROR, retval);
}
static njs_int_t
njs_ext_import_key(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int nid;
BIO *bio;
goto fail;
}
- return njs_webcrypto_result(vm, &value, NJS_OK);
+ return njs_webcrypto_result(vm, &value, NJS_OK, retval);
fail:
EVP_PKEY_free(pkey);
}
- return njs_webcrypto_result(vm, njs_vm_retval(vm), NJS_ERROR);
+ return njs_webcrypto_result(vm, NULL, NJS_ERROR, retval);
}
static njs_int_t
njs_ext_sign(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t verify)
+ njs_index_t verify, njs_value_t *retval)
{
u_char *dst, *p;
size_t olen, outlen;
njs_set_boolean(&value, ret != 0);
}
- return njs_webcrypto_result(vm, &value, NJS_OK);
+ return njs_webcrypto_result(vm, &value, NJS_OK, retval);
fail:
EVP_PKEY_CTX_free(pctx);
}
- return njs_webcrypto_result(vm, njs_vm_retval(vm), NJS_ERROR);
+ return njs_webcrypto_result(vm, NULL, NJS_ERROR, retval);
}
static njs_int_t
njs_ext_unwrap_key(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_internal_error(vm, "\"unwrapKey\" not implemented");
return NJS_ERROR;
static njs_int_t
njs_ext_wrap_key(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_internal_error(vm, "\"wrapKey\" not implemented");
return NJS_ERROR;
static njs_int_t
njs_ext_get_random_values(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t fill;
static njs_int_t
njs_key_usage_array_handler(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *value, int64_t index)
+ njs_value_t *value, int64_t index, njs_value_t *retval)
{
unsigned *mask;
njs_str_t u;
{
int64_t length;
njs_int_t ret;
+ njs_value_t retval;
njs_iterator_args_t args;
if (!njs_value_is_object(value)) {
args.to = length;
args.data = mask;
- return njs_object_iterate(vm, &args, njs_key_usage_array_handler);
+ return njs_object_iterate(vm, &args, njs_key_usage_array_handler,
+ &retval);
}
static njs_int_t
njs_promise_trampoline(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_function_t *callback;
callback = njs_value_function(njs_argument(args, 1));
if (callback != NULL) {
- return njs_vm_call(vm, callback, njs_argument(args, 2), 1);
+ return njs_vm_invoke(vm, callback, njs_argument(args, 2), 1, retval);
}
return NJS_OK;
static njs_int_t
-njs_webcrypto_result(njs_vm_t *vm, njs_value_t *result, njs_int_t rc)
+njs_webcrypto_result(njs_vm_t *vm, njs_value_t *result, njs_int_t rc,
+ njs_value_t *retval)
{
njs_int_t ret;
- njs_value_t retval, arguments[2];
+ njs_value_t promise, arguments[2];
njs_function_t *callback;
njs_vm_event_t vm_event;
- ret = njs_vm_promise_create(vm, &retval, njs_value_arg(&arguments));
+ ret = njs_vm_promise_create(vm, &promise, njs_value_arg(&arguments));
if (ret != NJS_OK) {
goto error;
}
}
njs_value_assign(&arguments[0], &arguments[(rc != NJS_OK)]);
- njs_value_assign(&arguments[1], result);
+
+ if (rc != NJS_OK) {
+ njs_vm_exception_get(vm, njs_value_arg(&arguments[1]));
+
+ } else {
+ njs_value_assign(&arguments[1], result);
+ }
ret = njs_vm_post_event(vm, vm_event, njs_value_arg(&arguments), 2);
if (ret == NJS_ERROR) {
goto error;
}
- njs_vm_retval_set(vm, njs_value_arg(&retval));
+ njs_value_assign(retval, &promise);
return NJS_OK;
}
}
- njs_vm_value_error_set(vm, njs_vm_retval(vm), "%*s", p - errstr, errstr);
+ njs_vm_error(vm, "%*s", p - errstr, errstr);
}
};
static njs_int_t njs_xml_ext_parse(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_xml_ext_canonicalization(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t magic);
+ njs_uint_t nargs, njs_index_t magic, njs_value_t *retval);
static njs_int_t njs_xml_doc_ext_prop_keys(njs_vm_t *vm, njs_value_t *value,
njs_value_t *keys);
static njs_int_t njs_xml_doc_ext_root(njs_vm_t *vm, njs_object_prop_t *prop,
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *unused,
njs_value_t *retval);
static njs_int_t njs_xml_node_ext_add_child(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_xml_node_ext_attrs(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
static njs_int_t njs_xml_node_ext_name(njs_vm_t *vm, njs_object_prop_t *prop,
static njs_int_t njs_xml_node_ext_parent(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
static njs_int_t njs_xml_node_ext_remove_all_attributes(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_xml_node_ext_remove_attribute(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_xml_node_ext_remove_children(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_xml_node_ext_remove_text(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_xml_node_ext_set_attribute(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_xml_node_ext_set_text(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_xml_node_ext_tags(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
static njs_int_t njs_xml_node_ext_text(njs_vm_t *vm, njs_object_prop_t *prop,
static njs_int_t
njs_xml_ext_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t data;
cln->handler = njs_xml_doc_cleanup;
cln->data = tree;
- return njs_vm_external_create(vm, njs_vm_retval(vm), njs_xml_doc_proto_id,
+ return njs_vm_external_create(vm, retval, njs_xml_doc_proto_id,
tree, 0);
}
static njs_int_t
njs_xml_node_ext_add_child(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
xmlNode *current, *node, *copy, *rnode;
njs_int_t ret;
goto error;
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return njs_xml_replace_node(vm, current, copy);
static njs_int_t
njs_xml_node_ext_remove_attribute(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- return njs_xml_node_ext_set_attribute(vm, args, nargs, 1);
+ return njs_xml_node_ext_set_attribute(vm, args, nargs, 1, retval);
}
static njs_int_t
njs_xml_node_ext_remove_all_attributes(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused)
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
xmlNode *current;
current->properties = NULL;
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
njs_xml_node_ext_remove_children(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
xmlNode *current, *copy;
njs_str_t name;
selector = njs_arg(args, nargs, 1);
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
if (!njs_value_is_null_or_undefined(selector)) {
if (njs_slow_path(!njs_value_is_string(selector))) {
static njs_int_t
njs_xml_node_ext_remove_text(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
return njs_xml_node_ext_text(vm, NULL, njs_argument(args, 0), NULL, NULL);
}
static njs_int_t
njs_xml_node_ext_set_attribute(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t remove)
+ njs_uint_t nargs, njs_index_t remove, njs_value_t *retval)
{
xmlNode *current;
njs_str_t str;
njs_value_string_get(name, &str);
return njs_xml_node_attr_handler(vm, current, &str, njs_arg(args, nargs, 2),
- !remove ? njs_vm_retval(vm) : NULL);
+ !remove ? retval : NULL);
}
static njs_int_t
njs_xml_node_ext_set_text(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
return njs_xml_node_ext_text(vm, NULL, njs_argument(args, 0),
- njs_arg(args, nargs, 1), njs_vm_retval(vm));
+ njs_arg(args, nargs, 1), retval);
}
static njs_int_t
njs_xml_ext_canonicalization(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t magic)
+ njs_index_t magic, njs_value_t *retval)
{
u_char **prefix_list;
ssize_t size;
}
if (magic & 0x2) {
- ret = njs_vm_value_string_create_chb(vm, njs_vm_retval(vm), &chain);
+ ret = njs_vm_value_string_create_chb(vm, retval, &chain);
} else {
size = njs_chb_size(&chain);
goto error;
}
- ret = njs_vm_value_buffer_set(vm, njs_vm_retval(vm), data.start,
+ ret = njs_vm_value_buffer_set(vm, retval, data.start,
data.length);
}
err->int2);
}
- njs_vm_value_error_set(vm, njs_vm_retval(vm), "%*s", p - errstr, errstr);
+ njs_vm_error(vm, "%s", p - errstr, errstr);
}
#define NJS_ZLIB_CHUNK_SIZE 1024
static njs_int_t njs_zlib_ext_deflate(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_zlib_ext_inflate(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_int_t njs_zlib_contant(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
static njs_int_t njs_zlib_init(njs_vm_t *vm);
static njs_int_t
njs_zlib_ext_deflate(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t raw)
+ njs_index_t raw, njs_value_t *retval)
{
int rc, level, mem_level, strategy, window_bits;
u_char *buffer;
njs_chb_destroy(&chain);
- return njs_vm_value_buffer_set(vm, njs_vm_retval(vm), buffer, size);
+ return njs_vm_value_buffer_set(vm, retval, buffer, size);
fail:
static njs_int_t
njs_zlib_ext_inflate(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t raw)
+ njs_index_t raw, njs_value_t *retval)
{
int rc, window_bits;
u_char *buffer;
njs_chb_destroy(&chain);
- return njs_vm_value_buffer_set(vm, njs_vm_retval(vm), buffer, size);
+ return njs_vm_value_buffer_set(vm, retval, buffer, size);
fail:
static njs_int_t ngx_http_js_ext_status(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
static njs_int_t ngx_http_js_ext_send_header(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_http_js_ext_send(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_http_js_ext_send_buffer(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_http_js_ext_set_return_value(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t ngx_http_js_ext_done(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_http_js_ext_finish(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_http_js_ext_return(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_http_js_ext_internal_redirect(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t ngx_http_js_ext_get_http_version(njs_vm_t *vm,
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
njs_value_t *retval);
static njs_int_t ngx_http_js_ext_subrequest(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static ngx_int_t ngx_http_js_subrequest(ngx_http_request_t *r,
njs_str_t *uri_arg, njs_str_t *args_arg, njs_function_t *callback,
ngx_http_request_t **sr);
pending = njs_vm_pending(ctx->vm);
- rc = ngx_js_call(ctx->vm, fname, r->connection->log, &ctx->request, 1);
+ rc = ngx_js_invoke(ctx->vm, fname, r->connection->log, &ctx->request, 1,
+ &ctx->retval);
if (rc == NGX_ERROR) {
v->not_found = 1;
}
}
- if (njs_vm_start(ctx->vm) == NJS_ERROR) {
+ if (njs_vm_start(ctx->vm, njs_value_arg(&retval)) == NJS_ERROR) {
ngx_js_retval(ctx->vm, NULL, &exception);
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
r->headers_out.status = n;
+ njs_value_undefined_set(retval);
+
return NJS_OK;
}
static njs_int_t
ngx_http_js_ext_send_header(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
ngx_http_request_t *r;
return NJS_ERROR;
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_http_js_ext_send(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t s;
return NJS_ERROR;
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_http_js_ext_send_buffer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
unsigned last_buf, flush;
njs_str_t buffer;
*ctx->last_out = cl;
ctx->last_out = &cl->next;
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_http_js_ext_set_return_value(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
ngx_http_js_ctx_t *ctx;
ngx_http_request_t *r;
ctx = ngx_http_get_module_ctx(r, ngx_http_js_module);
njs_value_assign(&ctx->retval, njs_arg(args, nargs, 1));
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_http_js_ext_done(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
ngx_http_js_ctx_t *ctx;
ngx_http_request_t *r;
ctx->done = 1;
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_http_js_ext_finish(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
ngx_http_js_ctx_t *ctx;
ngx_http_request_t *r;
ctx->status = NGX_OK;
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_http_js_ext_return(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_str_t text;
ngx_int_t status;
ctx->status = status;
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_http_js_ext_internal_redirect(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_str_t uri;
ngx_http_js_ctx_t *ctx;
ctx->status = NGX_DONE;
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_http_js_promise_trampoline(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
ngx_uint_t i;
njs_function_t *callback;
static njs_int_t
ngx_http_js_ext_subrequest(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
ngx_int_t rc, promise;
njs_str_t uri_arg, args_arg, method_name, body_arg;
cb->request = sr;
- return njs_vm_promise_create(vm, njs_vm_retval(vm),
+ return njs_vm_promise_create(vm, retval,
njs_value_arg(&cb->callbacks));
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
ngx_int_t
ngx_js_call(njs_vm_t *vm, ngx_str_t *fname, ngx_log_t *log,
njs_opaque_value_t *args, njs_uint_t nargs)
+{
+ njs_opaque_value_t unused;
+
+ return ngx_js_invoke(vm, fname, log, args, nargs, &unused);
+}
+
+
+ngx_int_t
+ngx_js_invoke(njs_vm_t *vm, ngx_str_t *fname, ngx_log_t *log,
+ njs_opaque_value_t *args, njs_uint_t nargs, njs_opaque_value_t *retval)
{
njs_int_t ret;
njs_str_t name;
return NGX_ERROR;
}
- ret = njs_vm_call(vm, func, njs_value_arg(args), nargs);
+ ret = njs_vm_invoke(vm, func, njs_value_arg(args), nargs,
+ njs_value_arg(retval));
if (ret == NJS_ERROR) {
ngx_js_retval(vm, NULL, &exception);
ret = njs_vm_value_string(vm, &str, njs_value_arg(retval));
} else {
- ret = njs_vm_retval_string(vm, &str);
+ ret = njs_vm_exception_string(vm, &str);
}
if (ret != NJS_OK) {
njs_int_t
ngx_js_ext_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t level)
+ njs_index_t level, njs_value_t *retval)
{
char *p;
ngx_int_t lvl;
c->log->handler = handler;
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
njs_int_t ret;
ngx_uint_t i;
njs_vm_opt_t options;
+ njs_opaque_value_t retval;
ngx_js_named_path_t *preload;
njs_vm_opt_init(&options);
goto error;
}
- ret = njs_vm_start(vm);
+ ret = njs_vm_start(vm, njs_value_arg(&retval));
if (ret != NJS_OK) {
goto error;
}
rc = njs_vm_compile(conf->vm, &start, end);
if (rc != NJS_OK) {
- njs_value_assign(&exception, njs_vm_retval(conf->vm));
- njs_vm_retval_string(conf->vm, &text);
+ njs_vm_exception_get(conf->vm, njs_value_arg(&exception));
+ njs_vm_value_string(conf->vm, &text, njs_value_arg(&exception));
value = njs_vm_object_prop(conf->vm, njs_value_arg(&exception),
&file_name_key, &lvalue);
ngx_int_t ngx_js_call(njs_vm_t *vm, ngx_str_t *fname, ngx_log_t *log,
njs_opaque_value_t *args, njs_uint_t nargs);
+ngx_int_t ngx_js_invoke(njs_vm_t *vm, ngx_str_t *fname, ngx_log_t *log,
+ njs_opaque_value_t *args, njs_uint_t nargs, njs_opaque_value_t *retval);
ngx_int_t ngx_js_retval(njs_vm_t *vm, njs_opaque_value_t *retval,
ngx_str_t *s);
njs_int_t ngx_js_ext_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t level);
+ njs_index_t level, njs_value_t *retval);
void ngx_js_logger(njs_vm_t *vm, njs_external_ptr_t external,
njs_log_level_t level, const u_char *start, size_t length);
char * ngx_js_import(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
#define ngx_js_http_error(http, err, fmt, ...) \
do { \
- njs_vm_value_error_set((http)->vm, \
- njs_value_arg(&(http)->response_value), \
- fmt, ##__VA_ARGS__); \
+ njs_vm_error((http)->vm, fmt, ##__VA_ARGS__); \
+ njs_vm_exception_get((http)->vm, \
+ njs_value_arg(&(http)->response_value)); \
ngx_js_http_fetch_done(http, &(http)->response_value, NJS_ERROR); \
} while (0)
njs_host_event_t host);
static void ngx_js_resolve_handler(ngx_resolver_ctx_t *ctx);
static njs_int_t ngx_js_fetch_promissified_result(njs_vm_t *vm,
- njs_value_t *result, njs_int_t rc);
+ njs_value_t *result, njs_int_t rc, njs_value_t *retval);
static void ngx_js_http_fetch_done(ngx_js_http_t *http,
njs_opaque_value_t *retval, njs_int_t rc);
static njs_int_t ngx_js_http_promise_trampoline(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static void ngx_js_http_connect(ngx_js_http_t *http);
static void ngx_js_http_next(ngx_js_http_t *http);
static void ngx_js_http_write_handler(ngx_event_t *wev);
static void ngx_js_http_dummy_handler(ngx_event_t *ev);
static njs_int_t ngx_headers_js_ext_append(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_headers_js_ext_delete(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_headers_js_ext_for_each(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t as_array);
+ njs_uint_t nargs, njs_index_t as_array, njs_value_t *retval);
static njs_int_t ngx_headers_js_ext_get(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t as_array);
+ njs_uint_t nargs, njs_index_t as_array, njs_value_t *retval);
static njs_int_t ngx_headers_js_ext_has(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_headers_js_ext_prop(njs_vm_t *vm,
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
njs_value_t *retval);
static njs_int_t ngx_headers_js_ext_keys(njs_vm_t *vm, njs_value_t *value,
njs_value_t *keys);
static njs_int_t ngx_headers_js_ext_set(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_request_js_ext_body(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_request_js_ext_body_used(njs_vm_t *vm,
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
njs_value_t *retval);
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
njs_value_t *retval);
static njs_int_t ngx_response_js_ext_body(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
#if (NGX_SSL)
static void ngx_js_http_ssl_init_connection(ngx_js_http_t *http);
njs_int_t
ngx_js_ext_fetch(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
ngx_url_t u;
return NJS_ERROR;
}
- njs_vm_retval_set(vm, njs_value_arg(&http->promise));
+ njs_value_assign(retval, njs_value_arg(&http->promise));
return NJS_OK;
}
ngx_js_http_connect(http);
- njs_vm_retval_set(vm, njs_value_arg(&http->promise));
+ njs_value_assign(retval, njs_value_arg(&http->promise));
return NJS_OK;
fail:
- ngx_js_http_fetch_done(http, (njs_opaque_value_t *) njs_vm_retval(vm),
- NJS_ERROR);
- njs_vm_retval_set(vm, njs_value_arg(&http->promise));
+ njs_vm_exception_get(vm, njs_value_arg(&lvalue));
+
+ ngx_js_http_fetch_done(http, &lvalue, NJS_ERROR);
+
+ njs_value_assign(retval, njs_value_arg(&http->promise));
return NJS_OK;
}
static njs_int_t
ngx_js_ext_headers_constructor(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
ngx_int_t rc;
njs_int_t ret;
}
}
- return njs_vm_external_create(vm, njs_vm_retval(vm),
+ return njs_vm_external_create(vm, retval,
ngx_http_js_fetch_headers_proto_id, headers,
0);
}
static njs_int_t
ngx_js_ext_request_constructor(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
ngx_url_t u;
return NJS_ERROR;
}
- return njs_vm_external_create(vm, njs_vm_retval(vm),
+ return njs_vm_external_create(vm, retval,
ngx_http_js_fetch_request_proto_id, request,
0);
}
static njs_int_t
ngx_js_ext_response_constructor(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
u_char *p, *end;
ngx_int_t rc;
}
}
- return njs_vm_external_create(vm, njs_vm_retval(vm),
+ return njs_vm_external_create(vm, retval,
ngx_http_js_fetch_response_proto_id, response,
0);
}
static njs_int_t
ngx_js_fetch_promissified_result(njs_vm_t *vm, njs_value_t *result,
- njs_int_t rc)
+ njs_int_t rc, njs_value_t *retval)
{
njs_int_t ret;
njs_function_t *callback;
njs_vm_event_t vm_event;
- njs_opaque_value_t retval, arguments[2];
+ njs_opaque_value_t promise, arguments[2];
- ret = njs_vm_promise_create(vm, njs_value_arg(&retval),
+ ret = njs_vm_promise_create(vm, njs_value_arg(&promise),
njs_value_arg(&arguments));
if (ret != NJS_OK) {
goto error;
}
njs_value_assign(&arguments[0], &arguments[(rc != NJS_OK)]);
- njs_value_assign(&arguments[1], result);
+
+ if (rc != NJS_OK) {
+ njs_vm_exception_get(vm, njs_value_arg(&arguments[1]));
+
+ } else {
+ njs_value_assign(&arguments[1], result);
+ }
ret = njs_vm_post_event(vm, vm_event, njs_value_arg(&arguments), 2);
if (ret == NJS_ERROR) {
goto error;
}
- njs_vm_retval_set(vm, njs_value_arg(&retval));
+ njs_value_assign(retval, &promise);
return NJS_OK;
static njs_int_t
ngx_js_http_promise_trampoline(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_function_t *callback;
static njs_int_t
ngx_headers_js_ext_append(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t name, value;
return NJS_ERROR;
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_headers_js_ext_delete(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t name;
}
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_headers_js_ext_for_each(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t length;
njs_int_t ret;
static njs_int_t
ngx_headers_js_ext_get(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t as_array)
+ njs_index_t as_array, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t name;
}
ret = ngx_headers_js_get(vm, njs_argument(args, 0), &name,
- njs_vm_retval(vm), as_array);
+ retval, as_array);
return (ret != NJS_ERROR) ? NJS_OK : NJS_ERROR;
}
static njs_int_t
ngx_headers_js_ext_has(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t name;
}
ret = ngx_headers_js_get(vm, njs_argument(args, 0), &name,
- njs_vm_retval(vm), 0);
+ retval, 0);
if (ret == NJS_ERROR) {
return NJS_ERROR;
}
- njs_value_boolean_set(njs_vm_retval(vm), ret == NJS_OK);
+ njs_value_boolean_set(retval, ret == NJS_OK);
return NJS_OK;
}
static njs_int_t
ngx_headers_js_ext_set(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t name, value;
}
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_request_js_ext_body(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t type)
+ njs_index_t type, njs_value_t *retval)
{
njs_int_t ret;
ngx_js_request_t *request;
- njs_opaque_value_t retval;
+ njs_opaque_value_t result;
request = njs_vm_external(vm, ngx_http_js_fetch_request_proto_id,
njs_argument(args, 0));
if (request == NULL) {
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_DECLINED;
}
switch (type) {
case NGX_JS_BODY_ARRAY_BUFFER:
- ret = njs_vm_value_array_buffer_set(vm, njs_value_arg(&retval),
+ ret = njs_vm_value_array_buffer_set(vm, njs_value_arg(&result),
request->body.start,
request->body.length);
if (ret != NJS_OK) {
case NGX_JS_BODY_JSON:
case NGX_JS_BODY_TEXT:
default:
- ret = njs_vm_value_string_set(vm, njs_value_arg(&retval),
+ ret = njs_vm_value_string_set(vm, njs_value_arg(&result),
request->body.start,
request->body.length);
if (ret != NJS_OK) {
}
if (type == NGX_JS_BODY_JSON) {
- ret = njs_vm_json_parse(vm, njs_value_arg(&retval), 1);
- njs_value_assign(&retval, njs_vm_retval(vm));
+ ret = njs_vm_json_parse(vm, njs_value_arg(&result), 1,
+ njs_value_arg(&result));
}
}
- return ngx_js_fetch_promissified_result(vm, njs_value_arg(&retval), ret);
+ return ngx_js_fetch_promissified_result(vm, njs_value_arg(&result), ret,
+ retval);
}
static njs_int_t
ngx_response_js_ext_body(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t type)
+ njs_uint_t nargs, njs_index_t type, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t string;
ngx_js_response_t *response;
- njs_opaque_value_t retval;
+ njs_opaque_value_t result;
response = njs_vm_external(vm, ngx_http_js_fetch_response_proto_id,
njs_argument(args, 0));
if (response == NULL) {
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_DECLINED;
}
switch (type) {
case NGX_JS_BODY_ARRAY_BUFFER:
- ret = njs_vm_value_array_buffer_set(vm, njs_value_arg(&retval),
+ ret = njs_vm_value_array_buffer_set(vm, njs_value_arg(&result),
string.start, string.length);
if (ret != NJS_OK) {
njs_vm_memory_error(vm);
case NGX_JS_BODY_JSON:
case NGX_JS_BODY_TEXT:
default:
- ret = njs_vm_value_string_set(vm, njs_value_arg(&retval),
+ ret = njs_vm_value_string_set(vm, njs_value_arg(&result),
string.start, string.length);
if (ret != NJS_OK) {
njs_vm_memory_error(vm);
}
if (type == NGX_JS_BODY_JSON) {
- ret = njs_vm_json_parse(vm, njs_value_arg(&retval), 1);
- njs_value_assign(&retval, njs_vm_retval(vm));
+ ret = njs_vm_json_parse(vm, njs_value_arg(&result), 1, retval);
+ njs_value_assign(&result, retval);
}
}
- return ngx_js_fetch_promissified_result(vm, njs_value_arg(&retval), ret);
+ return ngx_js_fetch_promissified_result(vm, njs_value_arg(&result), ret,
+ retval);
}
njs_int_t ngx_js_ext_fetch(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t level);
+ njs_index_t level, njs_value_t *retval);
ngx_int_t ngx_js_fetch_init(njs_vm_t *vm, ngx_log_t *log);
njs_value_t *retval);
static njs_int_t ngx_stream_js_ext_done(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_stream_js_ext_on(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_stream_js_ext_off(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t ngx_stream_js_ext_send(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t from_upstream);
+ njs_uint_t nargs, njs_index_t from_upstream, njs_value_t *retval);
static njs_int_t ngx_stream_js_ext_set_return_value(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t ngx_stream_js_ext_variables(njs_vm_t *vm,
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
pending = njs_vm_pending(ctx->vm);
- rc = ngx_js_call(ctx->vm, fname, s->connection->log, &ctx->args[0], 1);
+ rc = ngx_js_invoke(ctx->vm, fname, s->connection->log, &ctx->args[0], 1,
+ &ctx->retval);
if (rc == NGX_ERROR) {
v->not_found = 1;
}
}
- if (njs_vm_start(ctx->vm) == NJS_ERROR) {
+ if (njs_vm_start(ctx->vm, njs_value_arg(&retval)) == NJS_ERROR) {
ngx_js_retval(ctx->vm, NULL, &exception);
ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
static njs_int_t
ngx_stream_js_ext_done(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t magic)
+ njs_index_t magic, njs_value_t *retval)
{
ngx_int_t status;
njs_value_t *code;
ngx_stream_js_drop_events(ctx);
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_stream_js_ext_on(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_str_t name;
njs_value_t *callback;
return NJS_ERROR;
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_stream_js_ext_off(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_str_t name;
njs_vm_event_t *event;
*event = NULL;
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
static njs_int_t
ngx_stream_js_ext_send(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t from_upstream)
+ njs_index_t from_upstream, njs_value_t *retval)
{
unsigned last_buf, flush;
njs_str_t buffer;
}
}
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
static njs_int_t
ngx_stream_js_ext_set_return_value(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
ngx_stream_js_ctx_t *ctx;
ngx_stream_session_t *s;
ctx = ngx_stream_get_module_ctx(s, ngx_stream_js_module);
njs_value_assign(&ctx->retval, njs_arg(args, nargs, 1));
- njs_value_undefined_set(njs_vm_retval(vm));
+ njs_value_undefined_set(retval);
return NJS_OK;
}
((n < nargs) ? njs_argument(args, n) \
: (njs_value_assign(lvalue, &njs_value_undefined), lvalue))
-#define njs_vm_error(vm, fmt, ...) \
- njs_vm_value_error_set(vm, njs_vm_retval(vm), fmt, ##__VA_ARGS__)
-
#define njs_vm_log(vm, fmt, ...) njs_vm_logger(vm, NJS_LOG_LEVEL_INFO, fmt, \
##__VA_ARGS__)
#define njs_vm_warn(vm, fmt, ...) njs_vm_logger(vm, NJS_LOG_LEVEL_WARN, fmt, \
* NJS_OK - handler executed successfully;
* NJS_DECLINED - handler was applied to inappropriate object, retval
* contains undefined value;
- * NJS_ERROR - some error, vm->retval contains appropriate exception.
+ * NJS_ERROR - some error, njs_vm_exception_get(vm) can be used to get
+ * the exception value.
*/
typedef njs_int_t (*njs_prop_handler_t) (njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
typedef njs_int_t (*njs_exotic_keys_t)(njs_vm_t *vm, njs_value_t *value,
njs_value_t *retval);
typedef njs_int_t (*njs_function_native_t) (njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t magic8);
+ njs_uint_t nargs, njs_index_t magic8, njs_value_t *retval);
typedef enum {
* NJS_OK successful run.
* NJS_ERROR some exception or internal error happens.
*
- * njs_vm_retval(vm) can be used to get the retval or exception value.
+ * njs_vm_exception_get(vm) can be used to get the exception value.
*/
NJS_EXPORT njs_int_t njs_vm_call(njs_vm_t *vm, njs_function_t *function,
const njs_value_t *args, njs_uint_t nargs);
* NJS_AGAIN successfully processed all events, some posted events are
* still pending.
* NJS_ERROR some exception or internal error happens.
- * njs_vm_retval(vm) can be used to get the retval or exception value.
+ * njs_vm_exception_get(vm) can be used to get the exception value.
*/
NJS_EXPORT njs_int_t njs_vm_run(njs_vm_t *vm);
* NJS_OK successful run.
* NJS_ERROR some exception or internal error happens.
*
- * njs_vm_retval(vm) can be used to get the retval or exception value.
+ * njs_vm_exception_get(vm) can be used to get the exception value.
*/
-NJS_EXPORT njs_int_t njs_vm_start(njs_vm_t *vm);
+NJS_EXPORT njs_int_t njs_vm_start(njs_vm_t *vm, njs_value_t *retval);
NJS_EXPORT njs_int_t njs_vm_add_path(njs_vm_t *vm, const njs_str_t *path);
NJS_EXPORT njs_function_t *njs_vm_function(njs_vm_t *vm, const njs_str_t *name);
NJS_EXPORT njs_value_t *njs_vm_retval(njs_vm_t *vm);
-NJS_EXPORT void njs_vm_retval_set(njs_vm_t *vm, const njs_value_t *value);
+NJS_EXPORT void njs_vm_throw(njs_vm_t *vm, const njs_value_t *value);
+NJS_EXPORT void njs_vm_error(njs_vm_t *vm, const char *fmt, ...);
+NJS_EXPORT void njs_vm_exception_get(njs_vm_t *vm, njs_value_t *retval);
NJS_EXPORT njs_mp_t *njs_vm_memory_pool(njs_vm_t *vm);
NJS_EXPORT njs_external_ptr_t njs_vm_external_ptr(njs_vm_t *vm);
* the terminating zero byte.
*/
NJS_EXPORT const char *njs_vm_value_to_c_string(njs_vm_t *vm,
- njs_value_t *value);
-NJS_EXPORT njs_int_t njs_vm_retval_string(njs_vm_t *vm, njs_str_t *dst);
+ njs_value_t *value);
+NJS_EXPORT njs_int_t njs_vm_exception_string(njs_vm_t *vm, njs_str_t *dst);
NJS_EXPORT njs_int_t njs_vm_value_dump(njs_vm_t *vm, njs_str_t *dst,
njs_value_t *value, njs_uint_t console, njs_uint_t indent);
-NJS_EXPORT njs_int_t njs_vm_retval_dump(njs_vm_t *vm, njs_str_t *dst,
- njs_uint_t indent);
-NJS_EXPORT void njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value,
- const char *fmt, ...);
NJS_EXPORT void njs_vm_memory_error(njs_vm_t *vm);
NJS_EXPORT void njs_vm_logger(njs_vm_t *vm, njs_log_level_t level,
NJS_EXPORT njs_value_t *njs_vm_array_push(njs_vm_t *vm, njs_value_t *value);
NJS_EXPORT njs_int_t njs_vm_json_parse(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs);
+ njs_uint_t nargs, njs_value_t *retval);
NJS_EXPORT njs_int_t njs_vm_json_stringify(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs);
+ njs_uint_t nargs, njs_value_t *retval);
NJS_EXPORT njs_int_t njs_vm_query_string_parse(njs_vm_t *vm, u_char *start,
u_char *end, njs_value_t *retval);
static njs_int_t njs_array_prototype_slice_copy(njs_vm_t *vm,
- njs_value_t *this, int64_t start, int64_t length);
+ njs_value_t *this, int64_t start, int64_t length, njs_value_t *retval);
njs_array_t *
static njs_int_t
njs_array_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double num;
uint32_t size;
}
}
- njs_set_array(&vm->retval, array);
+ njs_set_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_array_is_array(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- const njs_value_t *value;
-
- if (nargs > 1 && njs_is_array(&args[1])) {
- value = &njs_value_true;
-
- } else {
- value = &njs_value_false;
- }
-
- vm->retval = *value;
+ njs_set_boolean(retval, nargs > 1 && njs_is_array(&args[1]));
return NJS_OK;
}
static njs_int_t
njs_array_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint32_t length, i;
njs_array_t *array;
return NJS_ERROR;
}
- njs_set_array(&vm->retval, array);
+ njs_set_array(retval, array);
if (array->object.fast_array) {
for (i = 0; i < length; i++) {
array->length = length;
- *retval = *setval;
+ njs_value_assign(retval, setval);
return NJS_OK;
}
static njs_int_t
njs_array_prototype_slice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t start, end, length, object_length;
njs_int_t ret;
}
}
- return njs_array_prototype_slice_copy(vm, this, start, length);
+ return njs_array_prototype_slice_copy(vm, this, start, length, retval);
}
static njs_int_t
njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this,
- int64_t start, int64_t length)
+ int64_t start, int64_t length, njs_value_t *retval)
{
size_t size;
u_char *dst;
uint32_t n;
njs_int_t ret;
njs_array_t *array, *keys;
- njs_value_t *value, *last, retval, self;
+ njs_value_t *value, *last, val, self;
const u_char *src, *end;
njs_slice_prop_t string_slice;
njs_string_prop_t string;
if (njs_fast_object(length)) {
do {
- ret = njs_value_property_i64(vm, this, start++, &retval);
+ ret = njs_value_property_i64(vm, this, start++, &val);
if (njs_slow_path(ret == NJS_ERROR)) {
return NJS_ERROR;
}
if (ret == NJS_OK) {
- ret = njs_value_property_i64_set(vm, &self, start, &retval);
+ ret = njs_value_property_i64_set(vm, &self, start, &val);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
}
for (n = 0; n < keys->length; n++) {
- ret = njs_value_property(vm, this, &keys->start[n], &retval);
+ ret = njs_value_property(vm, this, &keys->start[n], &val);
if (njs_slow_path(ret == NJS_ERROR)) {
goto done;
}
- ret = njs_value_property_set(vm, &self, &keys->start[n], &retval);
+ ret = njs_value_property_set(vm, &self, &keys->start[n], &val);
if (njs_slow_path(ret == NJS_ERROR)) {
goto done;
}
njs_array_destroy(vm, keys);
}
- njs_set_array(&vm->retval, array);
+ njs_set_array(retval, array);
return ret;
}
static njs_int_t
njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t length;
njs_int_t ret;
}
}
- njs_set_number(&vm->retval, array->length);
+ njs_set_number(retval, array->length);
return NJS_OK;
}
return ret;
}
- njs_set_number(&vm->retval, length);
+ njs_set_number(retval, length);
return NJS_OK;
}
static njs_int_t
njs_array_prototype_pop(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t length;
njs_int_t ret;
return ret;
}
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
- ret = njs_value_property_i64(vm, this, --length, &vm->retval);
+ ret = njs_value_property_i64(vm, this, --length, retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
static njs_int_t
njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double idx;
int64_t from, to, length;
} while (n > 1);
}
- njs_set_number(&vm->retval, array->length);
+ njs_set_number(retval, array->length);
return NJS_OK;
}
return ret;
}
- njs_set_number(&vm->retval, length);
+ njs_set_number(retval, length);
return NJS_OK;
}
static njs_int_t
njs_array_prototype_shift(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t i, length;
njs_int_t ret;
return ret;
}
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
- ret = njs_value_property_i64(vm, this, 0, &vm->retval);
+ ret = njs_value_property_i64(vm, this, 0, retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return NJS_ERROR;
}
} else {
- ret = njs_value_property_i64_delete(vm, this, 0, &vm->retval);
+ ret = njs_value_property_i64_delete(vm, this, 0, retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
static njs_int_t
njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t i, n, start, length, items, delta, delete;
njs_int_t ret;
return NJS_ERROR;
}
- njs_set_array(&vm->retval, deleted);
+ njs_set_array(retval, deleted);
return NJS_OK;
}
static njs_int_t
njs_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t length, l, h;
njs_int_t ret, lret, hret;
}
if (njs_slow_path(length < 2)) {
- vm->retval = *this;
+ njs_value_assign(retval, this);
return NJS_OK;
}
}
}
- vm->retval = *this;
+ njs_value_assign(retval, this);
return NJS_OK;
}
njs_int_t
njs_array_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t value;
if (njs_is_function(&value)) {
return njs_function_apply(vm, njs_function(&value), args, nargs,
- &vm->retval);
+ retval);
}
}
- return njs_object_prototype_to_string(vm, args, nargs, unused);
+ return njs_object_prototype_to_string(vm, args, nargs, unused, retval);
}
static njs_int_t
njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *p, *last;
int64_t i, size, len, length;
(void) njs_string_prop(&separator, value);
if (njs_slow_path(!njs_is_object(this))) {
- vm->retval = njs_string_empty;
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
}
if (njs_slow_path(len == 0)) {
- vm->retval = njs_string_empty;
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
length -= separator.length;
- p = njs_string_alloc(vm, &vm->retval, size, utf8 ? length : 0);
+ p = njs_string_alloc(vm, retval, size, utf8 ? length : 0);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_array_prototype_concat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double idx;
int64_t k, len, length;
njs_int_t ret;
njs_uint_t i;
- njs_value_t this, retval, *e;
+ njs_value_t this, value, *e;
njs_array_t *array, *keys;
ret = njs_value_to_object(vm, &args[0]);
if (njs_is_fast_array(e) || njs_fast_object(len)) {
for (k = 0; k < len; k++, length++) {
- ret = njs_value_property_i64(vm, e, k, &retval);
+ ret = njs_value_property_i64(vm, e, k, &value);
if (njs_slow_path(ret != NJS_OK)) {
if (ret == NJS_ERROR) {
return NJS_ERROR;
}
- njs_set_invalid(&retval);
+ njs_set_invalid(&value);
}
ret = njs_value_property_i64_set(vm, &this, length,
- &retval);
+ &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
}
for (k = 0; k < keys->length; k++) {
- ret = njs_value_property(vm, e, &keys->start[k], &retval);
+ ret = njs_value_property(vm, e, &keys->start[k], &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
if (ret == NJS_OK) {
idx = njs_string_to_index(&keys->start[k]) + length;
- ret = njs_value_property_i64_set(vm, &this, idx, &retval);
+ ret = njs_value_property_i64_set(vm, &this, idx, &value);
if (njs_slow_path(ret == NJS_ERROR)) {
njs_array_destroy(vm, keys);
return ret;
return NJS_ERROR;
}
- vm->retval = this;
+ njs_value_assign(retval, &this);
return NJS_OK;
}
static njs_int_t
njs_array_prototype_fill(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t i, length, start, end;
njs_int_t ret;
njs_value_assign(&array->start[i], value);
}
- njs_value_assign(&vm->retval, this);
+ njs_value_assign(retval, this);
return NJS_OK;
}
}
}
- njs_value_assign(&vm->retval, this);
+ njs_value_assign(retval, this);
return NJS_OK;
}
njs_inline njs_int_t
njs_array_iterator_call(njs_vm_t *vm, njs_iterator_args_t *args,
- const njs_value_t *entry, uint32_t n)
+ const njs_value_t *entry, uint32_t n, njs_value_t *retval)
{
njs_value_t arguments[3];
arguments[2] = *args->value;
return njs_function_call(vm, args->function, args->argument, arguments, 3,
- &vm->retval);
+ retval);
}
static njs_int_t
njs_array_handler_every(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *entry, int64_t n)
+ njs_value_t *entry, int64_t n, njs_value_t *retval)
{
njs_int_t ret;
if (njs_is_valid(entry)) {
- ret = njs_array_iterator_call(vm, args, entry, n);
+ ret = njs_array_iterator_call(vm, args, entry, n, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- if (!njs_is_true(&vm->retval)) {
- vm->retval = njs_value_false;
+ if (!njs_is_true(retval)) {
+ njs_value_assign(retval, &njs_value_false);
return NJS_DONE;
}
}
static njs_int_t
njs_array_handler_some(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *entry, int64_t n)
+ njs_value_t *entry, int64_t n, njs_value_t *retval)
{
njs_int_t ret;
if (njs_is_valid(entry)) {
- ret = njs_array_iterator_call(vm, args, entry, n);
+ ret = njs_array_iterator_call(vm, args, entry, n, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- if (njs_is_true(&vm->retval)) {
- vm->retval = njs_value_true;
+ if (njs_is_true(retval)) {
+ njs_value_assign(retval, &njs_value_true);
return NJS_DONE;
}
}
static njs_int_t
njs_array_handler_includes(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *entry, int64_t n)
+ njs_value_t *entry, int64_t n, njs_value_t *retval)
{
if (!njs_is_valid(entry)) {
entry = njs_value_arg(&njs_value_undefined);
}
if (njs_values_same_zero(args->argument, entry)) {
- njs_set_true(&vm->retval);
+ njs_set_true(retval);
return NJS_DONE;
}
static njs_int_t
njs_array_handler_index_of(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *entry, int64_t n)
+ njs_value_t *entry, int64_t n, njs_value_t *retval)
{
if (njs_values_strict_equal(args->argument, entry)) {
- njs_set_number(&vm->retval, n);
+ njs_set_number(retval, n);
return NJS_DONE;
}
static njs_int_t
njs_array_handler_for_each(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *entry, int64_t n)
+ njs_value_t *entry, int64_t n, njs_value_t *retval)
{
if (njs_is_valid(entry)) {
- return njs_array_iterator_call(vm, args, entry, n);
+ return njs_array_iterator_call(vm, args, entry, n, retval);
}
return NJS_OK;
static njs_int_t
njs_array_handler_find(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *entry, int64_t n)
+ njs_value_t *entry, int64_t n, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t copy;
njs_set_undefined(©);
}
- ret = njs_array_iterator_call(vm, args, ©, n);
+ ret = njs_array_iterator_call(vm, args, ©, n, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- if (njs_is_true(&vm->retval)) {
- vm->retval = copy;
+ if (njs_is_true(retval)) {
+ njs_value_assign(retval, ©);
return NJS_DONE;
}
static njs_int_t
njs_array_handler_find_index(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *entry, int64_t n)
+ njs_value_t *entry, int64_t n, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t copy;
njs_set_undefined(©);
}
- ret = njs_array_iterator_call(vm, args, ©, n);
+ ret = njs_array_iterator_call(vm, args, ©, n, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- if (njs_is_true(&vm->retval)) {
- njs_set_number(&vm->retval, n);
+ if (njs_is_true(retval)) {
+ njs_set_number(retval, n);
return NJS_DONE;
}
static njs_int_t
njs_array_handler_reduce(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *entry, int64_t n)
+ njs_value_t *entry, int64_t n, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t arguments[5];
static njs_int_t
njs_array_handler_filter(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *entry, int64_t n)
+ njs_value_t *entry, int64_t n, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t copy;
if (njs_is_valid(entry)) {
copy = *entry;
- ret = njs_array_iterator_call(vm, args, ©, n);
+ ret = njs_array_iterator_call(vm, args, ©, n, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- if (njs_is_true(&vm->retval)) {
+ if (njs_is_true(retval)) {
ret = njs_array_add(vm, args->data, ©);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
static njs_int_t
njs_array_handler_map(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *entry, int64_t n)
+ njs_value_t *entry, int64_t n, njs_value_t *retval)
{
njs_int_t ret;
- njs_array_t *retval;
+ njs_array_t *array;
njs_value_t this;
- retval = args->data;
+ array = args->data;
- if (retval->object.fast_array) {
- njs_set_invalid(&retval->start[n]);
+ if (array->object.fast_array) {
+ njs_set_invalid(&array->start[n]);
}
if (njs_is_valid(entry)) {
- ret = njs_array_iterator_call(vm, args, entry, n);
+ ret = njs_array_iterator_call(vm, args, entry, n, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- if (njs_is_valid(&vm->retval)) {
- if (retval->object.fast_array) {
- retval->start[n] = vm->retval;
+ if (njs_is_valid(retval)) {
+ if (array->object.fast_array) {
+ njs_value_assign(&array->start[n], retval);
} else {
- njs_set_array(&this, retval);
+ njs_set_array(&this, array);
- ret = njs_value_property_i64_set(vm, &this, n, &vm->retval);
+ ret = njs_value_property_i64_set(vm, &this, n, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
static njs_int_t
njs_array_prototype_iterator(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t magic)
+ njs_index_t magic, njs_value_t *retval)
{
int64_t i, length;
njs_int_t ret;
break;
}
- ret = njs_object_iterate(vm, &iargs, handler);
+ ret = njs_object_iterate(vm, &iargs, handler, retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
switch (njs_array_type(magic)) {
case NJS_ARRAY_EVERY:
- vm->retval = njs_value_true;
+ njs_set_boolean(retval, 1);
break;
case NJS_ARRAY_SOME:
case NJS_ARRAY_INCLUDES:
- vm->retval = njs_value_false;
+ njs_set_boolean(retval, 0);
break;
case NJS_ARRAY_INDEX_OF:
case NJS_ARRAY_FIND_INDEX:
- njs_set_number(&vm->retval, -1);
+ njs_set_number(retval, -1);
break;
case NJS_ARRAY_FOR_EACH:
case NJS_ARRAY_FIND:
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
break;
case NJS_ARRAY_REDUCE:
return NJS_ERROR;
}
- vm->retval = accumulator;
+ njs_value_assign(retval, &accumulator);
break;
case NJS_ARRAY_FILTER:
case NJS_ARRAY_MAP:
default:
- njs_set_array(&vm->retval, iargs.data);
+ njs_set_array(retval, iargs.data);
}
return NJS_OK;
static njs_int_t
njs_array_prototype_reverse_iterator(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t type)
+ njs_uint_t nargs, njs_index_t type, njs_value_t *retval)
{
int64_t from, length;
njs_int_t ret;
iargs.from = from;
iargs.to = 0;
- ret = njs_object_iterate_reverse(vm, &iargs, handler);
+ ret = njs_object_iterate_reverse(vm, &iargs, handler, retval);
if (njs_fast_path(ret == NJS_ERROR)) {
return NJS_ERROR;
}
switch (type) {
case NJS_ARRAY_LAST_INDEX_OF:
- njs_set_number(&vm->retval, -1);
+ njs_set_number(retval, -1);
break;
case NJS_ARRAY_REDUCE_RIGHT:
return NJS_ERROR;
}
- vm->retval = accumulator;
+ njs_value_assign(retval, &accumulator);
break;
}
static njs_int_t
njs_array_prototype_sort(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t i, und, len, nlen, length;
njs_int_t ret, fast_path;
}
if (njs_slow_path(length < 2)) {
- vm->retval = *this;
+ njs_value_assign(retval, this);
return NJS_OK;
}
}
}
- vm->retval = *this;
+ njs_value_assign(retval, this);
ret = NJS_OK;
static njs_int_t
njs_array_prototype_copy_within(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
int64_t length, count, to, from, end;
njs_int_t ret;
count = njs_min(end - from, length - to);
- njs_vm_retval_set(vm, this);
+ njs_value_assign(retval, this);
return njs_array_copy_within(vm, this, to, from, count,
!(from < to && to < from + count));
static njs_int_t
njs_array_prototype_iterator_obj(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t kind)
+ njs_uint_t nargs, njs_index_t kind, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *this;
return ret;
}
- return njs_array_iterator_create(vm, this, &vm->retval, kind);
+ return njs_array_iterator_create(vm, this, retval, kind);
}
njs_int_t njs_array_expand(njs_vm_t *vm, njs_array_t *array, uint32_t prepend,
uint32_t append);
njs_int_t njs_array_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_inline njs_value_t *
static njs_int_t
njs_array_buffer_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint64_t size;
njs_int_t ret;
return NJS_ERROR;
}
- njs_set_array_buffer(&vm->retval, array);
+ njs_set_array_buffer(retval, array);
return NJS_OK;
}
static njs_int_t
njs_array_buffer_get_this(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- vm->retval = args[0];
+ njs_value_assign(retval, njs_argument(args, 0));
return NJS_OK;
}
static njs_int_t
njs_array_buffer_is_view(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- njs_set_boolean(&vm->retval, njs_is_typed_array(njs_arg(args, nargs, 1)));
+ njs_set_boolean(retval, njs_is_typed_array(njs_arg(args, nargs, 1)));
return NJS_OK;
}
static njs_int_t
njs_array_buffer_prototype_byte_length(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
njs_array_buffer_t *array;
return NJS_ERROR;
}
- njs_set_number(&vm->retval, array->size);
+ njs_set_number(retval, array->size);
return NJS_OK;
}
static njs_int_t
njs_array_buffer_prototype_slice(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
int64_t len, start, end;
njs_int_t ret;
return NJS_ERROR;
}
- njs_set_array_buffer(&vm->retval, buffer);
+ njs_set_array_buffer(retval, buffer);
return NJS_OK;
}
{
njs_int_t ret;
njs_value_t ctor;
- njs_native_frame_t *frame;
njs_promise_capability_t *capability;
- frame = vm->top_frame;
- frame->retval = retval;
-
njs_set_function(&ctor, &vm->constructors[NJS_OBJ_TYPE_PROMISE]);
capability = njs_promise_new_capability(vm, &ctor);
return NJS_ERROR;
}
- ret = njs_function_lambda_call(vm, capability);
+ ret = njs_function_lambda_call(vm, retval, capability);
if (ret == NJS_OK) {
ret = njs_function_call(vm, njs_function(&capability->resolve),
- &njs_value_undefined, retval, 1, &vm->retval);
+ &njs_value_undefined, retval, 1, retval);
} else if (ret == NJS_AGAIN) {
ret = NJS_OK;
} else if (ret == NJS_ERROR) {
- if (njs_is_memory_error(vm, &vm->retval)) {
+ if (njs_is_memory_error(vm, &vm->exception)) {
return NJS_ERROR;
}
+ *retval = njs_vm_exception(vm);
+
ret = njs_function_call(vm, njs_function(&capability->reject),
- &njs_value_undefined, &vm->retval, 1,
- &vm->retval);
+ &njs_value_undefined, retval, 1,
+ retval);
}
- *retval = capability->promise;
+ njs_value_assign(retval, &capability->promise);
return ret;
}
njs_int_t
njs_await_fulfilled(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t exception, njs_value_t *retval)
{
njs_int_t ret;
- njs_value_t **cur_local, **cur_closures, *value;
+ njs_value_t **cur_local, **cur_closures, *value, result;
njs_frame_t *frame, *async_frame;
njs_async_ctx_t *ctx;
njs_native_frame_t *top, *async;
vm->top_frame = async;
vm->active_frame = async_frame;
- *njs_scope_value(vm, ctx->index) = *value;
- vm->retval = *value;
+ if (exception) {
+ njs_vm_throw(vm, value);
- vm->top_frame->retval = &vm->retval;
+ } else {
+ *njs_scope_value(vm, ctx->index) = *value;
+ }
- ret = njs_vmcode_interpreter(vm, ctx->pc, ctx->capability, ctx);
+ ret = njs_vmcode_interpreter(vm, ctx->pc, &result, ctx->capability, ctx);
vm->levels[NJS_LEVEL_LOCAL] = cur_local;
vm->levels[NJS_LEVEL_CLOSURE] = cur_closures;
if (ret == NJS_OK) {
ret = njs_function_call(vm, njs_function(&ctx->capability->resolve),
- &njs_value_undefined, &vm->retval, 1, &vm->retval);
+ &njs_value_undefined, &result, 1, retval);
njs_async_context_free(vm, ctx);
ret = NJS_OK;
} else if (ret == NJS_ERROR) {
- if (njs_is_memory_error(vm, &vm->retval)) {
+ if (njs_is_memory_error(vm, &vm->exception)) {
return NJS_ERROR;
}
- value = &vm->retval;
-
- goto failed;
- }
-
- return ret;
+ result = njs_vm_exception(vm);
-failed:
+ (void) njs_function_call(vm, njs_function(&ctx->capability->reject),
+ &njs_value_undefined, &result, 1, retval);
- (void) njs_function_call(vm, njs_function(&ctx->capability->reject),
- &njs_value_undefined, value, 1, &vm->retval);
+ njs_async_context_free(vm, ctx);
- njs_async_context_free(vm, ctx);
+ return NJS_ERROR;
+ }
- return NJS_ERROR;
+ return ret;
}
njs_int_t
njs_await_rejected(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
njs_async_ctx_t *ctx;
if (ctx->await->native.pc == ctx->pc) {
/* No catch block was set before await. */
(void) njs_function_call(vm, njs_function(&ctx->capability->reject),
- &njs_value_undefined, value, 1, &vm->retval);
+ &njs_value_undefined, value, 1, retval);
njs_async_context_free(vm, ctx);
ctx->pc = ctx->await->native.pc;
- return njs_await_fulfilled(vm, args, nargs, unused);
+ return njs_await_fulfilled(vm, args, nargs, 1, retval);
}
njs_int_t njs_async_function_frame_invoke(njs_vm_t *vm, njs_value_t *retval);
njs_int_t njs_await_fulfilled(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused);
+ njs_index_t unused, njs_value_t *retval);
njs_int_t njs_await_rejected(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused);
+ njs_index_t unused, njs_value_t *retval);
extern const njs_object_type_init_t njs_async_function_type_init;
static njs_int_t
njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
const njs_value_t *value;
njs_object_value_t *object;
return NJS_ERROR;
}
- njs_set_object_value(&vm->retval, object);
+ njs_set_object_value(retval, object);
} else {
- vm->retval = *value;
+ njs_value_assign(retval, value);
}
return NJS_OK;
static njs_int_t
njs_boolean_prototype_value_of(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
}
}
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
static njs_int_t
njs_boolean_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
}
}
- vm->retval = njs_is_true(value) ? njs_string_true : njs_string_false;
+ njs_value_assign(retval, njs_is_true(value) ? &njs_string_true
+ : &njs_string_false);
return NJS_OK;
}
};
-static njs_int_t njs_buffer_from_object(njs_vm_t *vm, njs_value_t *value);
+static njs_int_t njs_buffer_from_object(njs_vm_t *vm, njs_value_t *value,
+ njs_value_t *retval);
static njs_int_t njs_buffer_from_array_buffer(njs_vm_t *vm, njs_value_t *value,
- njs_value_t *length, njs_value_t *offset);
-static njs_int_t njs_buffer_from_typed_array(njs_vm_t *vm, njs_value_t *value);
+ njs_value_t *length, njs_value_t *offset, njs_value_t *retval);
+static njs_int_t njs_buffer_from_typed_array(njs_vm_t *vm, njs_value_t *value,
+ njs_value_t *retval);
static njs_int_t njs_buffer_from_string(njs_vm_t *vm, njs_value_t *value,
- const njs_buffer_encoding_t *encoding);
+ const njs_buffer_encoding_t *encoding, njs_value_t *retval);
static njs_int_t njs_buffer_write_string(njs_vm_t *vm, njs_value_t *value,
njs_typed_array_t *array, const njs_buffer_encoding_t *encoding,
- uint64_t offset, uint64_t length);
+ uint64_t offset, uint64_t length, njs_value_t *retval);
static njs_int_t njs_buffer_fill(njs_vm_t *vm, njs_typed_array_t *array,
const njs_value_t *fill, const njs_value_t *encoding, uint64_t offset,
uint64_t end);
static njs_int_t
njs_buffer_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_type_error(vm, "Buffer is not a constructor");
static njs_int_t
njs_buffer_alloc_safe(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t safe)
+ njs_index_t safe, njs_value_t *retval)
{
double size;
njs_int_t ret;
}
}
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_buffer_from(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
- njs_value_t *value, retval;
+ njs_value_t *value;
const njs_buffer_encoding_t *encoding;
value = njs_arg(args, nargs, 1);
switch (value->type) {
case NJS_TYPED_ARRAY:
- return njs_buffer_from_typed_array(vm, value);
+ return njs_buffer_from_typed_array(vm, value, retval);
case NJS_ARRAY_BUFFER:
return njs_buffer_from_array_buffer(vm, value, njs_arg(args, nargs, 2),
- njs_arg(args, nargs, 3));
+ njs_arg(args, nargs, 3), retval);
case NJS_STRING:
- encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, 2));
+ encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, 2), 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
- return njs_buffer_from_string(vm, value, encoding);
+ return njs_buffer_from_string(vm, value, encoding, retval);
default:
if (njs_is_object(value)) {
- ret = njs_value_of(vm, value, &retval);
+ ret = njs_value_of(vm, value, retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
- if (ret == NJS_OK && !njs_is_null(&retval)
- && !(njs_is_object(&retval)
- && njs_object(&retval) == njs_object(value)))
+ if (ret == NJS_OK && !njs_is_null(retval)
+ && !(njs_is_object(retval)
+ && njs_object(retval) == njs_object(value)))
{
- njs_value_assign(value, &retval);
+ njs_value_assign(value, retval);
goto next;
}
- ret = njs_buffer_from_object(vm, value);
+ ret = njs_buffer_from_object(vm, value, retval);
if (njs_slow_path(ret != NJS_DECLINED)) {
return ret;
}
static njs_int_t
-njs_buffer_from_object(njs_vm_t *vm, njs_value_t *value)
+njs_buffer_from_object(njs_vm_t *vm, njs_value_t *value, njs_value_t *retval)
{
double num;
int64_t len;
uint32_t i;
njs_str_t str;
njs_int_t ret;
- njs_value_t data, retval, length;
+ njs_value_t val, data, length;
njs_typed_array_t *buffer;
static const njs_value_t string_length = njs_string("length");
if (ret == NJS_DECLINED) {
ret = njs_value_property(vm, value, njs_value_arg(&njs_string_type),
- &retval);
+ &val);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- ret = njs_value_to_string(vm, &retval, &retval);
+ ret = njs_value_to_string(vm, &val, &val);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- njs_string_get(&retval, &str);
+ njs_string_get(&val, &str);
if (!njs_strstr_eq(&str, &str_buffer)) {
return NJS_DECLINED;
}
ret = njs_value_property(vm, value, njs_value_arg(&njs_string_data),
- &retval);
+ &val);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- if (njs_is_object(&retval)) {
- njs_value_assign(&data, &retval);
+ if (njs_is_object(&val)) {
+ njs_value_assign(&data, &val);
value = &data;
goto next;
}
p = njs_typed_array_buffer(buffer)->u.u8;
for (i = 0; i < len; i++) {
- ret = njs_value_property_i64(vm, value, i, &retval);
+ ret = njs_value_property_i64(vm, value, i, &val);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
- ret = njs_value_to_number(vm, &retval, &num);
+ ret = njs_value_to_number(vm, &val, &num);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
*p++ = njs_number_to_int32(num);
}
- njs_set_typed_array(&vm->retval, buffer);
+ njs_set_typed_array(retval, buffer);
return NJS_OK;
}
static njs_int_t
njs_buffer_from_array_buffer(njs_vm_t *vm, njs_value_t *value,
- njs_value_t *offset, njs_value_t *length)
+ njs_value_t *offset, njs_value_t *length, njs_value_t *retval)
{
int64_t off, len;
njs_int_t ret;
buffer->offset = off;
buffer->byte_length = len;
- njs_set_typed_array(&vm->retval, buffer);
+ njs_set_typed_array(retval, buffer);
return NJS_OK;
}
static njs_int_t
-njs_buffer_from_typed_array(njs_vm_t *vm, njs_value_t *value)
+njs_buffer_from_typed_array(njs_vm_t *vm, njs_value_t *value,
+ njs_value_t *retval)
{
uint8_t *p;
uint32_t i, length;
*p++ = njs_number_to_int32(njs_typed_array_prop(array, i));
}
- njs_set_typed_array(&vm->retval, buffer);
+ njs_set_typed_array(retval, buffer);
return NJS_OK;
}
static njs_int_t
njs_buffer_from_string(njs_vm_t *vm, njs_value_t *value,
- const njs_buffer_encoding_t *encoding)
+ const njs_buffer_encoding_t *encoding, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t str;
memcpy(njs_typed_array_buffer(buffer)->u.u8, str.start, str.length);
- njs_set_typed_array(&vm->retval, buffer);
+ njs_set_typed_array(retval, buffer);
return NJS_OK;
}
static njs_int_t
njs_buffer_byte_length(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
size_t size;
njs_value_t *value;
switch (value->type) {
case NJS_TYPED_ARRAY:
- njs_set_number(&vm->retval, njs_typed_array(value)->byte_length);
+ njs_set_number(retval, njs_typed_array(value)->byte_length);
return NJS_OK;
case NJS_ARRAY_BUFFER:
- njs_set_number(&vm->retval, njs_array_buffer(value)->size);
+ njs_set_number(retval, njs_array_buffer(value)->size);
return NJS_OK;
case NJS_DATA_VIEW:
- njs_set_number(&vm->retval, njs_data_view(value)->byte_length);
+ njs_set_number(retval, njs_data_view(value)->byte_length);
return NJS_OK;
case NJS_STRING:
- encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, 2));
+ encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, 2), 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
size = njs_buffer_decode_string_length(value, encoding);
- njs_set_number(&vm->retval, size);
+ njs_set_number(retval, size);
return NJS_OK;
static njs_int_t
njs_buffer_compare_array(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2,
const njs_value_t *target_start, const njs_value_t *target_end,
- const njs_value_t *source_start, const njs_value_t *source_end)
+ const njs_value_t *source_start, const njs_value_t *source_end,
+ njs_value_t *retval)
{
size_t size, src_size, trg_size;
uint8_t *src, *src_end, *trg, *trg_end;
ret = memcmp(trg, src, size);
if (ret != 0) {
- njs_set_number(&vm->retval, (ret < 0) ? 1 : -1);
+ njs_set_number(retval, (ret < 0) ? 1 : -1);
return NJS_OK;
}
ret = 1;
}
- njs_set_number(&vm->retval, ret);
+ njs_set_number(retval, ret);
return NJS_OK;
}
static njs_int_t
njs_buffer_compare(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
return njs_buffer_compare_array(vm, njs_arg(args, nargs, 1),
njs_arg(args, nargs, 2),
&njs_value_undefined, &njs_value_undefined,
- &njs_value_undefined, &njs_value_undefined);
+ &njs_value_undefined, &njs_value_undefined,
+ retval);
}
static njs_int_t
njs_buffer_concat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *p, *src;
size_t n;
int64_t i, len, list_len;
njs_int_t ret;
- njs_value_t *list, *value, *length, retval;
+ njs_value_t *list, *value, *length, val;
njs_array_t *array;
njs_typed_array_t *buffer, *arr;
} else {
for (i = 0; i < list_len; i++) {
- ret = njs_value_property_i64(vm, list, i, &retval);
+ ret = njs_value_property_i64(vm, list, i, &val);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
- if (njs_slow_path(!njs_is_typed_array(&retval))) {
+ if (njs_slow_path(!njs_is_typed_array(&val))) {
njs_type_error(vm, "\"list[%L]\" argument must be an "
"instance of Buffer or Uint8Array", i);
return NJS_ERROR;
}
- arr = njs_typed_array(&retval);
+ arr = njs_typed_array(&val);
if (njs_slow_path(njs_is_detached_buffer(arr->buffer))) {
njs_type_error(vm, "detached buffer");
return NJS_ERROR;
} else {
for (i = 0; len != 0 && i < list_len; i++) {
- ret = njs_value_property_i64(vm, list, i, &retval);
+ ret = njs_value_property_i64(vm, list, i, &val);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
- arr = njs_typed_array(&retval);
+ arr = njs_typed_array(&val);
n = njs_min((size_t) len, arr->byte_length);
src = &njs_typed_array_buffer(arr)->u.u8[arr->offset];
njs_memzero(p, len);
}
- njs_set_typed_array(&vm->retval, buffer);
+ njs_set_typed_array(retval, buffer);
return NJS_OK;
}
static njs_int_t
njs_buffer_is_buffer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_bool_t is;
njs_typed_array_t *array;
is = 0;
- array = njs_buffer_slot(vm, njs_arg(args, nargs, 1), "source");
+ array = njs_buffer_slot_internal(vm, njs_arg(args, nargs, 1));
if (njs_fast_path(array != NULL && array->object.__proto__
== &vm->prototypes[NJS_OBJ_TYPE_BUFFER].object))
is = 1;
}
- njs_set_boolean(&vm->retval, is);
+ njs_set_boolean(retval, is);
return NJS_OK;
}
static njs_int_t
njs_buffer_is_encoding(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
const njs_value_t *value;
value = njs_arg(args, nargs, 1);
- njs_set_boolean(&vm->retval, njs_is_defined(value)
- && njs_buffer_encoding(vm, value) != NULL);
+ njs_set_boolean(retval, njs_is_defined(value)
+ && njs_buffer_encoding(vm, value, 0) != NULL);
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_read_int(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t magic)
+ njs_index_t magic, njs_value_t *retval)
{
double v;
uint32_t u32;
break;
}
- njs_set_number(&vm->retval, v);
+ njs_set_number(retval, v);
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_read_float(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t magic)
+ njs_uint_t nargs, njs_index_t magic, njs_value_t *retval)
{
double v;
uint32_t u32;
v = conv_f64.f;
}
- njs_set_number(&vm->retval, v);
+ njs_set_number(retval, v);
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_write_int(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t magic)
+ njs_uint_t nargs, njs_index_t magic, njs_value_t *retval)
{
uint8_t *u8;
int64_t i64;
break;
}
- njs_set_number(&vm->retval, index + size);
+ njs_set_number(retval, index + size);
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_write_float(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t magic)
+ njs_uint_t nargs, njs_index_t magic, njs_value_t *retval)
{
double v;
uint8_t *u8;
*((uint64_t *) u8) = conv_f64.u;
}
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_write(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint64_t offset, length;
njs_int_t ret;
encoding:
- encoding = njs_buffer_encoding(vm, enc);
+ encoding = njs_buffer_encoding(vm, enc, 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
return NJS_ERROR;
}
- return njs_buffer_write_string(vm, value, array, encoding, offset, length);
+ return njs_buffer_write_string(vm, value, array, encoding, offset, length,
+ retval);
}
static njs_int_t
njs_buffer_write_string(njs_vm_t *vm, njs_value_t *value,
njs_typed_array_t *array, const njs_buffer_encoding_t *encoding,
- uint64_t offset, uint64_t length)
+ uint64_t offset, uint64_t length, njs_value_t *retval)
{
uint8_t *start;
njs_int_t ret;
done:
- njs_set_number(&vm->retval, length);
+ njs_set_number(retval, length);
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_fill(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint64_t offset, end;
njs_int_t ret;
done:
- njs_vm_retval_set(vm, this);
+ njs_value_assign(retval, this);
return NJS_OK;
}
switch (fill->type) {
case NJS_STRING:
- encoding = njs_buffer_encoding(vm, encode);
+ encoding = njs_buffer_encoding(vm, encode, 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_buffer_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
uint64_t start, end;
njs_int_t ret;
start = 0;
end = array->byte_length;
- encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, 1));
+ encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, 1), 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
str.length = end - start;
if (njs_slow_path(str.length == 0)) {
- njs_vm_retval_set(vm, &njs_string_empty);
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
- return encoding->encode(vm, &vm->retval, &str);
+ return encoding->encode(vm, retval, &str);
}
static njs_int_t
njs_buffer_prototype_compare(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
return njs_buffer_compare_array(vm, njs_argument(args, 0),
njs_arg(args, nargs, 1), njs_arg(args, nargs, 2),
njs_arg(args, nargs, 3), njs_arg(args, nargs, 4),
- njs_arg(args, nargs, 5));
+ njs_arg(args, nargs, 5), retval);
}
static njs_int_t
njs_buffer_prototype_copy(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
size_t size;
uint8_t *src, *src_end, *trg, *trg_end;
memmove(trg, src, size);
}
- njs_set_number(&vm->retval, size);
+ njs_set_number(retval, size);
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_equals(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
ret = njs_buffer_compare_array(vm, njs_argument(args, 0),
njs_arg(args, nargs, 1), &njs_value_undefined,
&njs_value_undefined, &njs_value_undefined,
- &njs_value_undefined);
+ &njs_value_undefined, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- njs_set_boolean(&vm->retval, njs_number(&vm->retval) == 0);
+ njs_set_boolean(retval, njs_number(retval) == 0);
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_index_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t last)
+ njs_index_t last, njs_value_t *retval)
{
uint8_t byte;
int64_t from, to, increment, length, offset, index, i;
encoding:
- encoding = njs_buffer_encoding(vm, enc);
+ encoding = njs_buffer_encoding(vm, enc, 1);
if (njs_slow_path(encoding == NULL)) {
return NJS_ERROR;
}
done:
- njs_set_number(&vm->retval, index);
+ njs_set_number(retval, index);
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_includes(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
- ret = njs_buffer_prototype_index_of(vm, args, nargs, unused);
+ ret = njs_buffer_prototype_index_of(vm, args, nargs, unused, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- njs_set_boolean(&vm->retval, (njs_number(&vm->retval) != -1));
+ njs_set_boolean(retval, (njs_number(retval) != -1));
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_slice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_typed_array_t *array;
- ret = njs_typed_array_prototype_slice(vm, args, nargs, unused);
+ ret = njs_typed_array_prototype_slice(vm, args, nargs, unused, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- array = njs_typed_array(&vm->retval);
+ array = njs_typed_array(retval);
array->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_BUFFER].object;
return NJS_OK;
static njs_int_t
njs_buffer_prototype_swap(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t size)
+ njs_index_t size, njs_value_t *retval)
{
uint8_t *p, *end;
njs_typed_array_t *array;
}
}
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_buffer_prototype_to_json(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *p, *end;
njs_int_t ret;
return NJS_ERROR;
}
- njs_set_object(&vm->retval, obj);
+ njs_set_object(retval, obj);
return NJS_OK;
}
const njs_buffer_encoding_t *
-njs_buffer_encoding(njs_vm_t *vm, const njs_value_t *value)
+njs_buffer_encoding(njs_vm_t *vm, const njs_value_t *value, njs_bool_t throw)
{
njs_str_t name;
njs_buffer_encoding_t *encoding;
}
}
- njs_type_error(vm, "\"%V\" encoding is not supported", &name);
+ if (throw) {
+ njs_type_error(vm, "\"%V\" encoding is not supported", &name);
+ }
return NULL;
}
njs_bool_t zeroing);
const njs_buffer_encoding_t *njs_buffer_encoding(njs_vm_t *vm,
- const njs_value_t *value);
+ const njs_value_t *value, njs_bool_t thrw);
njs_int_t njs_buffer_decode_string(njs_vm_t *vm, const njs_value_t *value,
njs_value_t *dst, const njs_buffer_encoding_t *encoding);
static njs_int_t
njs_ext_dump(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint32_t n;
njs_int_t ret;
return NJS_ERROR;
}
- return njs_string_new(vm, &vm->retval, str.start, str.length, 0);
+ return njs_string_new(vm, retval, str.start, str.length, 0);
}
static njs_int_t
njs_ext_on(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_str_t type;
njs_uint_t i, n;
static njs_int_t
njs_262_detach_array_buffer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
njs_array_buffer_t *buffer;
buffer->u.data = NULL;
buffer->size = 0;
- njs_set_null(&vm->retval);
+ njs_set_null(retval);
return NJS_OK;
}
static njs_int_t
njs_date_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double time;
njs_int_t ret;
int64_t tm[NJS_DATE_MAX_FIELDS];
if (!vm->top_frame->ctor) {
- return njs_date_string(vm, &vm->retval, NJS_DATE_FMT_TO_STRING,
+ return njs_date_string(vm, retval, NJS_DATE_FMT_TO_STRING,
njs_gettime());
}
return NJS_ERROR;
}
- njs_set_date(&vm->retval, date);
+ njs_set_date(retval, date);
return NJS_OK;
}
static njs_int_t
njs_date_utc(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double time;
njs_int_t ret;
time = njs_make_date(tm, 0);
}
- njs_set_number(&vm->retval, time);
+ njs_set_number(retval, time);
return NJS_OK;
}
static njs_int_t
njs_date_now(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- njs_set_number(&vm->retval, njs_gettime());
+ njs_set_number(retval, njs_gettime());
return NJS_OK;
}
static njs_int_t
njs_date_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double time;
njs_int_t ret;
time = NAN;
}
- njs_set_number(&vm->retval, time);
+ njs_set_number(retval, time);
return NJS_OK;
}
static njs_int_t
njs_date_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
if (njs_slow_path(!njs_is_date(&args[0]))) {
njs_type_error(vm, "cannot convert %s to date",
return NJS_ERROR;
}
- njs_set_number(&vm->retval, njs_date(&args[0])->time);
+ njs_set_number(retval, njs_date(&args[0])->time);
return NJS_OK;
}
static njs_int_t
njs_date_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t fmt)
+ njs_index_t fmt, njs_value_t *retval)
{
double time;
return NJS_ERROR;
}
- return njs_date_string(vm, &vm->retval, fmt, time);
+ return njs_date_string(vm, retval, fmt, time);
}
static njs_int_t
njs_date_prototype_get_field(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t magic)
+ njs_uint_t nargs, njs_index_t magic, njs_value_t *retval)
{
double value;
int64_t tm[NJS_DATE_MAX_FIELDS];
value = njs_destruct_date(value, tm, magic & 0xf, magic & 0x40);
}
- njs_set_number(&vm->retval, value);
+ njs_set_number(retval, value);
return NJS_OK;
}
static njs_int_t
njs_date_prototype_get_timezone_offset(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
double value;
value = njs_tz_offset(value);
}
- njs_set_number(&vm->retval, value);
+ njs_set_number(retval, value);
return NJS_OK;
}
static njs_int_t
njs_date_prototype_set_time(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double time;
njs_int_t ret;
}
njs_date(&args[0])->time = time;
- njs_set_number(&vm->retval, time);
+ njs_set_number(retval, time);
return NJS_OK;
}
static njs_int_t
njs_date_prototype_set_fields(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t magic)
+ njs_uint_t nargs, njs_index_t magic, njs_value_t *retval)
{
double time, num;
njs_int_t ret;
done:
njs_date(&args[0])->time = time;
- njs_set_number(&vm->retval, time);
+ njs_set_number(retval, time);
return NJS_OK;
}
static njs_int_t
njs_date_prototype_to_json(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t retval)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t value;
if (njs_is_function(&value)) {
return njs_function_apply(vm, njs_function(&value), args, nargs,
- &vm->retval);
+ retval);
}
}
static njs_int_t njs_text_encoder_encode_utf8(njs_vm_t *vm,
- njs_string_prop_t *prop);
+ njs_string_prop_t *prop, njs_value_t *retval);
static njs_int_t njs_text_decoder_arg_encoding(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_encoding_decode_t *data);
static njs_int_t njs_text_decoder_arg_options(njs_vm_t *vm, njs_value_t *args,
static njs_int_t
njs_text_encoder_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_object_value_t *encoder;
}
njs_set_data(&encoder->value, NULL, NJS_DATA_TAG_TEXT_ENCODER);
- njs_set_object_value(&vm->retval, encoder);
+ njs_set_object_value(retval, encoder);
return NJS_OK;
}
static njs_int_t
njs_text_encoder_encode(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *dst;
size_t size;
(void) njs_string_prop(&prop, input);
if (prop.length != 0) {
- return njs_text_encoder_encode_utf8(vm, &prop);
+ return njs_text_encoder_encode_utf8(vm, &prop, retval);
}
start = prop.start;
(void) njs_utf8_stream_encode(&ctx, start, end, dst, 1, 0);
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
return NJS_OK;
}
static njs_int_t
-njs_text_encoder_encode_utf8(njs_vm_t *vm, njs_string_prop_t *prop)
+njs_text_encoder_encode_utf8(njs_vm_t *vm, njs_string_prop_t *prop,
+ njs_value_t *retval)
{
njs_value_t value;
njs_typed_array_t *array;
memcpy(njs_typed_array_buffer(array)->u.u8, prop->start, prop->size);
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_text_encoder_encode_into(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *to, *to_end;
size_t size;
uint32_t cp;
njs_int_t ret;
njs_str_t str;
- njs_value_t *this, *input, *dest, retval, read, written;
+ njs_value_t *this, *input, *dest, value, read, written;
const u_char *start, *end;
njs_typed_array_t *array;
njs_unicode_decode_t ctx;
}
if (njs_slow_path(!njs_is_string(input))) {
- ret = njs_value_to_string(vm, &retval, input);
+ ret = njs_value_to_string(vm, &value, input);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- input = &retval;
+ input = &value;
}
if (njs_slow_path(!njs_is_typed_array_uint8(dest))) {
to = njs_utf8_encode(to, cp);
}
- return njs_vm_object_alloc(vm, &vm->retval, &read_str, &read,
+ return njs_vm_object_alloc(vm, retval, &read_str, &read,
&written_str, &written, NULL);
}
static njs_int_t
njs_text_decoder_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_object_value_t *decoder;
njs_utf8_decode_init(&data->ctx);
njs_set_data(&decoder->value, data, NJS_DATA_TAG_TEXT_DECODER);
- njs_set_object_value(&vm->retval, decoder);
+ njs_set_object_value(retval, decoder);
return NJS_OK;
}
static njs_int_t
njs_text_decoder_decode(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *dst;
size_t size;
ssize_t length;
njs_int_t ret;
njs_bool_t stream;
- njs_value_t retval, *this, *value, *options;
+ njs_value_t *this, *value, *options;
const u_char *start, *end;
njs_unicode_decode_t ctx;
njs_encoding_decode_t *data;
}
ret = njs_value_property(vm, options, njs_value_arg(&stream_str),
- &retval);
+ retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
- stream = njs_bool(&retval);
+ stream = njs_bool(retval);
}
data = njs_object_data(this);
return NJS_ERROR;
}
- dst = njs_string_alloc(vm, &vm->retval, size, length);
+ dst = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(dst == NULL)) {
return NJS_ERROR;
}
njs_set_object(dst, error);
}
+void
+njs_throw_error_va(njs_vm_t *vm, njs_object_type_t type, const char *fmt,
+ va_list args)
+{
+ u_char buf[NJS_MAX_ERROR_STR], *p;
+
+ p = buf;
+
+ if (fmt != NULL) {
+ p = njs_vsprintf(buf, buf + sizeof(buf), fmt, args);
+ }
+
+ njs_error_new(vm, &vm->exception, type, buf, p - buf);
+}
+
+
+void
+njs_throw_error(njs_vm_t *vm, njs_object_type_t type, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ njs_throw_error_va(vm, type, fmt, args);
+ va_end(args);
+}
+
void
njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst, njs_object_type_t type,
njs_int_t
-njs_error_stack_attach(njs_vm_t *vm, njs_value_t *value)
+njs_error_stack_attach(njs_vm_t *vm, njs_value_t value)
{
njs_int_t ret;
njs_value_t stack;
- if (njs_slow_path(!njs_is_error(value))
- || njs_object(value)->stack_attached)
+ if (njs_slow_path(!njs_is_error(&value))
+ || njs_object(&value)->stack_attached)
{
return NJS_DECLINED;
}
return NJS_OK;
}
- ret = njs_error_stack_new(vm, njs_object(value), &stack);
+ ret = njs_error_stack_new(vm, njs_object(&value), &stack);
if (njs_slow_path(ret != NJS_OK)) {
njs_internal_error(vm, "njs_error_stack_new() failed");
return NJS_ERROR;
}
- njs_object(value)->stack_attached = 1;
+ njs_object(&value)->stack_attached = 1;
- return njs_object_prop_define(vm, value,
+ return njs_object_prop_define(vm, &value,
njs_value_arg(&njs_error_stack_string),
&stack, NJS_OBJECT_PROP_VALUE_CW,
NJS_STACK_HASH);
static njs_int_t
njs_error_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t type)
+ njs_index_t type, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *iterator, *value, list;
return NJS_ERROR;
}
- array = njs_iterator_to_array(vm, iterator);
+ array = njs_iterator_to_array(vm, iterator, retval);
if (njs_slow_path(array == NULL)) {
return NJS_ERROR;
}
return NJS_ERROR;
}
- njs_set_object(&vm->retval, error);
+ njs_set_object(retval, error);
return NJS_OK;
}
void
njs_memory_error(njs_vm_t *vm)
{
- njs_memory_error_set(vm, &vm->retval);
+ njs_memory_error_set(vm, &vm->exception);
}
static njs_int_t
njs_memory_error_constructor(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- njs_memory_error_set(vm, &vm->retval);
+ njs_memory_error_set(vm, retval);
return NJS_OK;
}
static njs_int_t
njs_error_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- vm->retval = args[0];
+ njs_value_assign(retval, njs_argument(args, 0));
return NJS_OK;
}
static njs_int_t
njs_error_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
if (nargs < 1 || !njs_is_object(&args[0])) {
njs_type_error(vm, "\"this\" argument is not an object");
return NJS_ERROR;
}
- return njs_error_to_string2(vm, &vm->retval, &args[0], 0);
+ return njs_error_to_string2(vm, retval, &args[0], 0);
}
static njs_int_t
njs_internal_error_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- if (nargs >= 1 && njs_is_object(&args[0])) {
+ static const njs_value_t name = njs_string("MemoryError");
+ if (nargs >= 1 && njs_is_object(&args[0])) {
/* MemoryError is a nonextensible internal error. */
if (!njs_object(&args[0])->extensible) {
- static const njs_value_t name = njs_string("MemoryError");
-
- vm->retval = name;
-
+ njs_value_assign(retval, &name);
return NJS_OK;
}
}
- return njs_error_prototype_to_string(vm, args, nargs, unused);
+ return njs_error_prototype_to_string(vm, args, nargs, unused, retval);
}
#define njs_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_ERROR, fmt, ##__VA_ARGS__)
+ njs_throw_error(vm, NJS_OBJ_TYPE_ERROR, fmt, ##__VA_ARGS__)
#define njs_eval_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_EVAL_ERROR, fmt, \
- ##__VA_ARGS__)
+ njs_throw_error(vm, NJS_OBJ_TYPE_EVAL_ERROR, fmt, ##__VA_ARGS__)
#define njs_internal_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_INTERNAL_ERROR, fmt, \
- ##__VA_ARGS__)
+ njs_throw_error(vm, NJS_OBJ_TYPE_INTERNAL_ERROR, fmt, ##__VA_ARGS__)
#define njs_range_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_RANGE_ERROR, fmt, \
- ##__VA_ARGS__)
+ njs_throw_error(vm, NJS_OBJ_TYPE_RANGE_ERROR, fmt, ##__VA_ARGS__)
#define njs_reference_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_REF_ERROR, fmt, \
- ##__VA_ARGS__)
+ njs_throw_error(vm, NJS_OBJ_TYPE_REF_ERROR, fmt, ##__VA_ARGS__)
#define njs_syntax_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_SYNTAX_ERROR, fmt, \
- ##__VA_ARGS__)
+ njs_throw_error(vm, NJS_OBJ_TYPE_SYNTAX_ERROR, fmt, ##__VA_ARGS__)
#define njs_type_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_TYPE_ERROR, fmt, \
- ##__VA_ARGS__)
+ njs_throw_error(vm, NJS_OBJ_TYPE_TYPE_ERROR, fmt, ##__VA_ARGS__)
#define njs_uri_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_URI_ERROR, fmt, \
- ##__VA_ARGS__)
+ njs_throw_error(vm, NJS_OBJ_TYPE_URI_ERROR, fmt, ##__VA_ARGS__)
void njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_object_type_t type,
u_char *start, size_t size);
void njs_noinline njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst,
njs_object_type_t type, const char *fmt, ...);
+void njs_throw_error(njs_vm_t *vm, njs_object_type_t type, const char *fmt,
+ ...);
+void njs_throw_error_va(njs_vm_t *vm, njs_object_type_t type, const char *fmt,
+ va_list args);
void njs_memory_error(njs_vm_t *vm);
void njs_memory_error_set(njs_vm_t *vm, njs_value_t *value);
njs_int_t njs_error_to_string(njs_vm_t *vm, njs_value_t *retval,
const njs_value_t *error);
njs_int_t njs_error_stack(njs_vm_t *vm, njs_value_t *value, njs_value_t *stack);
-njs_int_t njs_error_stack_attach(njs_vm_t *vm, njs_value_t *value);
+njs_int_t njs_error_stack_attach(njs_vm_t *vm, njs_value_t value);
extern const njs_object_type_init_t njs_error_type_init;
#include <njs_main.h>
+static njs_int_t njs_function_native_call(njs_vm_t *vm, njs_value_t *retval);
+
+
njs_function_t *
njs_function_alloc(njs_vm_t *vm, njs_function_lambda_t *lambda,
njs_bool_t async)
static njs_int_t
njs_function_prototype_thrower(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_type_error(vm, "\"caller\", \"callee\", \"arguments\" "
"properties may not be accessed");
njs_int_t
-njs_function_lambda_call(njs_vm_t *vm, void *promise_cap)
+njs_function_lambda_call(njs_vm_t *vm, njs_value_t *retval, void *promise_cap)
{
uint32_t n;
njs_int_t ret;
}
}
- ret = njs_vmcode_interpreter(vm, lambda->start, promise_cap, NULL);
+ ret = njs_vmcode_interpreter(vm, lambda->start, retval, promise_cap, NULL);
/* Restore current level. */
vm->levels[NJS_LEVEL_LOCAL] = cur_local;
njs_int_t
-njs_function_native_call(njs_vm_t *vm)
+njs_function_native_call(njs_vm_t *vm, njs_value_t *retval)
{
njs_int_t ret;
njs_function_t *function;
call = function->u.native;
ret = call(vm, &native->arguments[-1], 1 /* this */ + native->nargs,
- function->magic8);
+ function->magic8, retval);
#ifdef NJS_DEBUG_OPCODE
if (vm->options.opcode_debug) {
njs_vm_scopes_restore(vm, native);
- *native->retval = vm->retval;
-
njs_function_frame_free(vm, native);
return NJS_OK;
njs_native_frame_t *frame;
frame = vm->top_frame;
- frame->retval = retval;
if (njs_function_object_type(vm, frame->function)
== NJS_OBJ_TYPE_ASYNC_FUNCTION)
}
if (frame->native) {
- return njs_function_native_call(vm);
+ return njs_function_native_call(vm, retval);
} else {
- return njs_function_lambda_call(vm, NULL);
+ return njs_function_lambda_call(vm, retval, NULL);
}
}
njs_int_t
njs_function_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t async)
+ njs_index_t async, njs_value_t *retval)
{
njs_chb_t chain;
njs_int_t ret;
code = njs_generate_scope(vm, &generator, parser.scope,
&njs_entry_anonymous);
if (njs_slow_path(code == NULL)) {
- if (!njs_is_error(&vm->retval)) {
+ if (!njs_is_error(retval)) {
njs_internal_error(vm, "njs_generate_scope() failed");
}
return ret;
}
- njs_set_function(&vm->retval, function);
+ njs_set_function(retval, function);
return NJS_OK;
static njs_int_t
njs_function_prototype_call(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- njs_int_t ret;
- njs_value_t retval;
const njs_value_t *this;
if (!njs_is_function(&args[0])) {
nargs = 0;
}
- ret = njs_function_call(vm, njs_function(&args[0]), this, &args[2], nargs,
- &retval);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- njs_value_assign(&vm->retval, &retval);
-
- return NJS_OK;
+ return njs_function_call(vm, njs_function(&args[0]), this, &args[2], nargs,
+ retval);
}
static njs_int_t
njs_function_prototype_apply(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t i, length;
njs_int_t ret;
- njs_value_t retval, *this, *arr_like;
+ njs_value_t *this, *arr_like;
njs_array_t *arr;
njs_function_t *func;
activate:
- ret = njs_function_call(vm, func, this, args, length, &retval);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- njs_value_assign(&vm->retval, &retval);
-
- return NJS_OK;
+ return njs_function_call(vm, func, this, args, length, retval);
}
static njs_int_t
njs_function_bound_call(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *p;
njs_int_t ret;
if (nargs == 1) {
return njs_function_apply(vm, bound, function->bound, args_count,
- &vm->retval);
+ retval);
}
arguments = njs_mp_alloc(vm->mem_pool,
memcpy(p, &args[1], (nargs - 1) * sizeof(njs_value_t));
ret = njs_function_apply(vm, bound, arguments, args_count + nargs - 1,
- &vm->retval);
+ retval);
njs_mp_free(vm->mem_pool, arguments);
static njs_int_t
njs_function_prototype_bind(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
size_t size;
njs_int_t ret;
memcpy(values, args, size);
- njs_set_function(&vm->retval, function);
+ njs_set_function(retval, function);
return NJS_OK;
}
njs_int_t
njs_eval_function(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_internal_error(vm, "Not implemented");
static njs_int_t
njs_prototype_function(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
uint32_t size;
uint32_t free_size;
- njs_value_t *retval;
-
/* Number of allocated args on the frame. */
uint32_t nargs;
/* Number of already put args. */
njs_int_t njs_function_prototype_create(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
njs_int_t njs_function_constructor(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_int_t njs_function_instance_length(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
njs_int_t njs_function_instance_name(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
njs_int_t njs_eval_function(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused);
+ njs_index_t unused, njs_value_t *retval);
njs_int_t njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
const njs_value_t *this, const njs_value_t *args, njs_uint_t nargs,
njs_bool_t ctor);
njs_int_t njs_function_call2(njs_vm_t *vm, njs_function_t *function,
const njs_value_t *this, const njs_value_t *args,
njs_uint_t nargs, njs_value_t *retval, njs_bool_t ctor);
-njs_int_t njs_function_lambda_call(njs_vm_t *vm, void *promise_cap);
-njs_int_t njs_function_native_call(njs_vm_t *vm);
+njs_int_t njs_function_lambda_call(njs_vm_t *vm, njs_value_t *retval,
+ void *promise_cap);
njs_native_frame_t *njs_function_frame_alloc(njs_vm_t *vm, size_t size);
void njs_function_frame_free(njs_vm_t *vm, njs_native_frame_t *frame);
njs_int_t njs_function_frame_save(njs_vm_t *vm, njs_frame_t *native,
code = njs_generate_scope(vm, &generator, node->scope, name);
if (njs_slow_path(code == NULL)) {
- if (!njs_is_error(&vm->retval)) {
+ if (!njs_is_error(&vm->exception)) {
njs_internal_error(vm, "njs_generate_scope() failed");
}
static njs_int_t njs_iterator_object_handler(njs_vm_t *vm,
njs_iterator_handler_t handler, njs_iterator_args_t *args,
- njs_value_t *key, int64_t i);
+ njs_value_t *key, int64_t i, njs_value_t *retval);
static njs_int_t njs_iterator_to_array_handler(njs_vm_t *vm,
- njs_iterator_args_t *args, njs_value_t *value, int64_t index);
+ njs_iterator_args_t *args, njs_value_t *value, int64_t index,
+ njs_value_t *retval);
njs_int_t
static njs_int_t
njs_iterator_prototype_get_this(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- vm->retval = args[0];
+ njs_value_assign(retval, njs_argument(args, 0));
return NJS_OK;
}
static njs_int_t
njs_array_iterator_prototype_next(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t tag)
+ njs_uint_t nargs, njs_index_t tag, njs_value_t *retval)
{
njs_int_t ret;
njs_bool_t check;
return NJS_ERROR;
}
- njs_set_object(&vm->retval, object);
+ njs_set_object(retval, object);
- prop_value = njs_object_property_add(vm, &vm->retval,
+ prop_value = njs_object_property_add(vm, retval,
njs_value_arg(&string_value), 0);
if (njs_slow_path(prop_value == NULL)) {
return NJS_ERROR;
}
- prop_done = njs_object_property_add(vm, &vm->retval,
+ prop_done = njs_object_property_add(vm, retval,
njs_value_arg(&string_done), 0);
if (njs_slow_path(prop_done == NULL)) {
return NJS_ERROR;
njs_int_t
njs_object_iterate(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_iterator_handler_t handler)
+ njs_iterator_handler_t handler, njs_value_t *retval)
{
double idx;
int64_t length, i, from, to;
if (njs_fast_path(from < array->length
&& njs_is_valid(&array->start[from])))
{
- ret = handler(vm, args, &array->start[from], from);
+ ret = handler(vm, args, &array->start[from], from, retval);
} else {
entry = njs_value_arg(&njs_value_invalid);
entry = ∝
}
- ret = handler(vm, args, entry, from);
+ ret = handler(vm, args, entry, from, retval);
}
if (njs_slow_path(ret != NJS_OK)) {
/* This cannot fail. */
(void) njs_string_new(vm, &character, p + i, 1, 1);
- ret = handler(vm, args, &character, i);
+ ret = handler(vm, args, &character, i, retval);
if (njs_slow_path(ret != NJS_OK)) {
if (ret == NJS_DONE) {
return NJS_DONE;
/* This cannot fail. */
(void) njs_string_new(vm, &character, p, pos - p, 1);
- ret = handler(vm, args, &character, i);
+ ret = handler(vm, args, &character, i, retval);
if (njs_slow_path(ret != NJS_OK)) {
if (ret == NJS_DONE) {
return NJS_DONE;
continue;
}
- ret = njs_iterator_object_handler(vm, handler, args, &keys->start[i],
- idx);
+ ret = njs_iterator_object_handler(vm, handler, args,
+ &keys->start[i], idx, retval);
if (njs_slow_path(ret != NJS_OK)) {
njs_array_destroy(vm, keys);
return ret;
}
for (i = from; i < to; i++) {
- ret = njs_iterator_object_handler(vm, handler, args, NULL, i);
+ ret = njs_iterator_object_handler(vm, handler, args, NULL, i, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
njs_int_t
njs_object_iterate_reverse(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_iterator_handler_t handler)
+ njs_iterator_handler_t handler, njs_value_t *retval)
{
double idx;
int64_t i, from, to, length;
if (njs_fast_path(from < array->length
&& njs_is_valid(&array->start[from])))
{
- ret = handler(vm, args, &array->start[from], from);
+ ret = handler(vm, args, &array->start[from], from, retval);
} else {
entry = njs_value_arg(&njs_value_invalid);
entry = ∝
}
- ret = handler(vm, args, entry, from);
+ ret = handler(vm, args, entry, from, retval);
}
if (njs_slow_path(ret != NJS_OK)) {
/* This cannot fail. */
(void) njs_string_new(vm, &character, p, 1, 1);
- ret = handler(vm, args, &character, i);
+ ret = handler(vm, args, &character, i, retval);
if (njs_slow_path(ret != NJS_OK)) {
if (ret == NJS_DONE) {
return NJS_DONE;
/* This cannot fail. */
(void) njs_string_new(vm, &character, pos, p - pos , 1);
- ret = handler(vm, args, &character, i);
+ ret = handler(vm, args, &character, i, retval);
if (njs_slow_path(ret != NJS_OK)) {
if (ret == NJS_DONE) {
return NJS_DONE;
}
ret = njs_iterator_object_handler(vm, handler, args,
- &keys->start[i], idx);
+ &keys->start[i], idx, retval);
if (njs_slow_path(ret != NJS_OK)) {
njs_array_destroy(vm, keys);
return ret;
i = from + 1;
while (i-- > to) {
- ret = njs_iterator_object_handler(vm, handler, args, NULL, i);
+ ret = njs_iterator_object_handler(vm, handler, args, NULL, i, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
static njs_int_t
njs_iterator_object_handler(njs_vm_t *vm, njs_iterator_handler_t handler,
- njs_iterator_args_t *args, njs_value_t *key, int64_t i)
+ njs_iterator_args_t *args, njs_value_t *key, int64_t i, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t prop, *entry;
entry = (ret == NJS_OK) ? &prop : njs_value_arg(&njs_value_invalid);
- ret = handler(vm, args, entry, i);
+ ret = handler(vm, args, entry, i, retval);
if (njs_slow_path(ret != NJS_OK)) {
if (ret == NJS_DONE) {
return NJS_DONE;
njs_array_t *
-njs_iterator_to_array(njs_vm_t *vm, njs_value_t *iterator)
+njs_iterator_to_array(njs_vm_t *vm, njs_value_t *iterator, njs_value_t *retval)
{
int64_t length;
njs_int_t ret;
args.value = iterator;
args.to = length;
- ret = njs_object_iterate(vm, &args, njs_iterator_to_array_handler);
+ ret = njs_object_iterate(vm, &args, njs_iterator_to_array_handler, retval);
if (njs_slow_path(ret == NJS_ERROR)) {
njs_mp_free(vm->mem_pool, args.data);
return NULL;
static njs_int_t
njs_iterator_to_array_handler(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *value, int64_t index)
+ njs_value_t *value, int64_t index, njs_value_t *retval)
{
njs_value_t array;
typedef njs_int_t (*njs_iterator_handler_t)(njs_vm_t *vm,
- njs_iterator_args_t *args, njs_value_t *entry, int64_t n);
+ njs_iterator_args_t *args, njs_value_t *entry, int64_t n,
+ njs_value_t *retval);
njs_int_t njs_array_iterator_create(njs_vm_t *vm, const njs_value_t *src,
njs_value_t *retval);
njs_int_t njs_object_iterate(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_iterator_handler_t handler);
+ njs_iterator_handler_t handler, njs_value_t *retval);
njs_int_t njs_object_iterate_reverse(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_iterator_handler_t handler);
+ njs_iterator_handler_t handler, njs_value_t *retval);
-njs_array_t *njs_iterator_to_array(njs_vm_t *vm, njs_value_t *iterator);
+njs_array_t *njs_iterator_to_array(njs_vm_t *vm, njs_value_t *iterator,
+ njs_value_t *retval);
extern const njs_object_type_init_t njs_iterator_type_init;
const char *msg, const u_char *pos);
static njs_int_t njs_json_stringify_iterator(njs_vm_t *vm,
- njs_json_stringify_t *stringify, njs_value_t *value);
+ njs_json_stringify_t *stringify, njs_value_t *value, njs_value_t *retval);
static njs_function_t *njs_object_to_json_function(njs_vm_t *vm,
njs_value_t *value);
static njs_int_t njs_json_stringify_to_json(njs_json_stringify_t* stringify,
static njs_int_t
njs_json_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *text, value, lvalue, wrapper;
return njs_json_internalize_property(vm, njs_function(reviver),
&wrapper,
njs_value_arg(&njs_string_empty),
- 0, &vm->retval);
+ 0, retval);
}
- vm->retval = value;
+ njs_value_assign(retval, &value);
return NJS_OK;
}
njs_int_t
-njs_vm_json_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs)
+njs_vm_json_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+ njs_value_t *retval)
{
njs_function_t *parse;
parse = njs_function(&njs_json_object_properties[1].u.value);
- return njs_vm_call(vm, parse, args, nargs);
+ return njs_vm_invoke(vm, parse, args, nargs, retval);
}
static njs_int_t
njs_json_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
size_t length;
int64_t i64;
break;
}
- return njs_json_stringify_iterator(vm, stringify, njs_arg(args, nargs, 1));
+ return njs_json_stringify_iterator(vm, stringify, njs_arg(args, nargs, 1),
+ retval);
memory_error:
njs_int_t
-njs_vm_json_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs)
+njs_vm_json_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+ njs_value_t *retval)
{
njs_function_t *stringify;
stringify = njs_function(&njs_json_object_properties[2].u.value);
- return njs_vm_call(vm, stringify, args, nargs);
+ return njs_vm_invoke(vm, stringify, args, nargs, retval);
}
static njs_int_t
njs_json_stringify_iterator(njs_vm_t *vm, njs_json_stringify_t *stringify,
- njs_value_t *object)
+ njs_value_t *object, njs_value_t *retval)
{
int64_t size;
njs_int_t ret;
}
if (size == 0) {
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
goto release;
}
- ret = njs_string_create_chb(vm, &vm->retval, &chain);
+ ret = njs_string_create_chb(vm, retval, &chain);
if (njs_slow_path(ret != NJS_OK)) {
njs_chb_destroy(&chain);
goto memory_error;
njs_int_t ret;
njs_chb_t chain;
njs_str_t str;
- njs_value_t *key, *val, tag;
+ njs_value_t *key, *val, tag, exception;
njs_json_state_t *state;
njs_string_prop_t string;
njs_object_prop_t *prop;
stringify->vm = vm;
stringify->depth = 0;
+ if (njs_slow_path(vm->top_frame == NULL)) {
+ /* An exception was thrown during compilation. */
+ njs_vm_init(vm);
+ }
+
+ if (njs_is_valid(&vm->exception)) {
+ exception = njs_vm_exception(vm);
+ value = &exception;
+ }
+
njs_chb_init(&chain, vm->mem_pool);
if (!njs_dump_is_recursive(value)) {
exception:
- njs_vm_value_string(vm, retval, &vm->retval);
+ njs_vm_value_string(vm, retval, &vm->exception);
return NJS_OK;
}
static njs_int_t
njs_object_math_func(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t magic)
+ njs_index_t magic, njs_value_t *retval)
{
double num, num2;
uint8_t sign;
}
}
- njs_set_number(&vm->retval, num);
+ njs_set_number(retval, num);
return NJS_OK;
}
static njs_int_t
njs_object_math_hypot(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double num;
njs_int_t ret;
}
}
- njs_set_number(&vm->retval, num);
+ njs_set_number(retval, num);
return NJS_OK;
}
static njs_int_t
njs_object_math_min_max(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t max)
+ njs_index_t max, njs_value_t *retval)
{
double num, value;
njs_int_t ret;
value = max ? njs_fmax(value, num) : njs_fmin(value, num);
}
- njs_set_number(&vm->retval, value);
+ njs_set_number(retval, value);
return NJS_OK;
}
static njs_int_t
njs_object_math_random(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double num;
num = njs_random(&vm->random) / 4294967296.0;
- njs_set_number(&vm->retval, num);
+ njs_set_number(retval, num);
return NJS_OK;
}
njs_int_t
njs_module_require(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t name;
return NJS_ERROR;
}
- njs_value_assign(&vm->retval, &module->value);
+ njs_value_assign(retval, &module->value);
return NJS_OK;
}
njs_bool_t shared);
njs_mod_t *njs_parser_module(njs_parser_t *parser, njs_str_t *name);
njs_int_t njs_module_require(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
extern njs_module_t *njs_modules[];
static njs_int_t
njs_number_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *value;
return NJS_ERROR;
}
- njs_set_object_value(&vm->retval, object);
+ njs_set_object_value(retval, object);
} else {
- njs_set_number(&vm->retval, njs_number(value));
+ njs_set_number(retval, njs_number(value));
}
return NJS_OK;
static njs_int_t
njs_number_is_integer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- double num;
- const njs_value_t *value;
+ double num;
+ njs_bool_t integer;
- value = &njs_value_false;
+ integer = 0;
if (nargs > 1 && njs_is_number(&args[1])) {
num = njs_number(&args[1]);
if (num == trunc(num) && !isinf(num)) {
- value = &njs_value_true;
+ integer = 1;
}
}
- vm->retval = *value;
+ njs_set_boolean(retval, integer);
return NJS_OK;
}
static njs_int_t
njs_number_is_safe_integer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- double num;
- const njs_value_t *value;
+ double num;
+ njs_bool_t integer;
- value = &njs_value_false;
+ integer = 0;
if (nargs > 1 && njs_is_number(&args[1])) {
num = njs_number(&args[1]);
if (num == (int64_t) num && fabs(num) <= NJS_MAX_SAFE_INTEGER) {
- value = &njs_value_true;
+ integer = 1;
}
}
- vm->retval = *value;
+ njs_set_boolean(retval, integer);
return NJS_OK;
}
static njs_int_t
njs_number_is_nan(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- const njs_value_t *value;
+ njs_bool_t nan;
- value = &njs_value_false;
+ nan = 0;
if (nargs > 1
&& njs_is_number(&args[1])
&& isnan(njs_number(&args[1])))
{
- value = &njs_value_true;
+ nan = 1;
}
- vm->retval = *value;
+ njs_set_boolean(retval, nan);
return NJS_OK;
}
static njs_int_t
njs_number_is_finite(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- double num;
- const njs_value_t *value;
+ double num;
+ njs_bool_t finite;
- value = &njs_value_false;
+ finite = 0;
if (nargs > 1 && njs_is_number(&args[1])) {
num = njs_number(&args[1]);
if (!isnan(num) && !isinf(num)) {
- value = &njs_value_true;
+ finite = 1;
}
}
- vm->retval = *value;
+ njs_set_boolean(retval, finite);
return NJS_OK;
}
static njs_int_t
njs_number_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
- value = &args[0];
+ value = njs_argument(args, 0);
if (value->type != NJS_NUMBER) {
}
}
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
static njs_int_t
njs_number_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
double number;
int32_t radix;
number = njs_number(value);
if (radix != 10 && !isnan(number) && !isinf(number) && number != 0) {
- return njs_number_to_string_radix(vm, &vm->retval, number, radix);
+ return njs_number_to_string_radix(vm, retval, number, radix);
}
}
- return njs_number_to_string(vm, &vm->retval, value);
+ return njs_number_to_string(vm, retval, value);
}
static njs_int_t
njs_number_prototype_to_fixed(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
u_char *p;
int64_t frac;
number = njs_number(value);
if (njs_slow_path(isnan(number) || fabs(number) >= 1e21)) {
- return njs_number_to_string(vm, &vm->retval, value);
+ return njs_number_to_string(vm, retval, value);
}
point = 0;
*p++ = '0';
}
- p = njs_string_alloc(vm, &vm->retval, size, size);
+ p = njs_string_alloc(vm, retval, size, size);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_number_prototype_to_precision(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
double number;
size_t size;
}
if (njs_is_undefined(njs_arg(args, nargs, 1))) {
- return njs_number_to_string(vm, &vm->retval, value);
+ return njs_number_to_string(vm, retval, value);
}
ret = njs_value_to_integer(vm, njs_argument(args, 1), &precision);
number = njs_number(value);
if (njs_slow_path(isnan(number) || isinf(number))) {
- return njs_number_to_string(vm, &vm->retval, value);
+ return njs_number_to_string(vm, retval, value);
}
if (njs_slow_path(precision < 1 || precision > 100)) {
size = njs_dtoa_precision(number, (char *) buf, (size_t) precision);
- return njs_string_new(vm, &vm->retval, buf, size, size);
+ return njs_string_new(vm, retval, buf, size, size);
}
static njs_int_t
njs_number_prototype_to_exponential(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
double number;
size_t size;
number = njs_number(value);
if (njs_slow_path(isnan(number) || isinf(number))) {
- return njs_number_to_string(vm, &vm->retval, value);
+ return njs_number_to_string(vm, retval, value);
}
if (njs_is_defined(value_frac)) {
size = njs_dtoa_exponential(number, (char *) buf, (njs_int_t) frac);
- return njs_string_new(vm, &vm->retval, buf, size, size);
+ return njs_string_new(vm, retval, buf, size, size);
}
njs_int_t
njs_number_global_is_nan(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double num;
njs_int_t ret;
return ret;
}
- njs_set_boolean(&vm->retval, isnan(num));
+ njs_set_boolean(retval, isnan(num));
return NJS_OK;
}
njs_int_t
njs_number_global_is_finite(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double num;
njs_int_t ret;
return ret;
}
- njs_set_boolean(&vm->retval, !(isnan(num) || isinf(num)));
+ njs_set_boolean(retval, !(isnan(num) || isinf(num)));
return NJS_OK;
}
njs_int_t
njs_number_parse_int(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double num;
int32_t radix;
done:
- njs_set_number(&vm->retval, num);
+ njs_set_number(retval, num);
return NJS_OK;
}
njs_int_t
njs_number_parse_float(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double num;
njs_int_t ret;
done:
- njs_set_number(&vm->retval, minus ? -num : num);
+ njs_set_number(retval, minus ? -num : num);
return NJS_OK;
}
njs_int_t njs_number_to_chain(njs_vm_t *vm, njs_chb_t *chain,
double number);
njs_int_t njs_number_global_is_nan(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_int_t njs_number_global_is_finite(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_int_t njs_number_parse_int(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_int_t njs_number_parse_float(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_inline njs_bool_t
const njs_object_t *object, const njs_object_t *parent, njs_array_t *items,
njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all);
static njs_int_t njs_object_define_properties(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_object_set_prototype(njs_vm_t *vm, njs_object_t *object,
const njs_value_t *value);
static njs_int_t
njs_object_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_uint_t type, index;
njs_value_t *value;
return NJS_ERROR;
}
- njs_set_object(&vm->retval, object);
+ njs_set_object(retval, object);
return NJS_OK;
}
return NJS_ERROR;
}
- njs_set_object_value(&vm->retval, obj_val);
+ njs_set_object_value(retval, obj_val);
return NJS_OK;
}
return NJS_ERROR;
}
- njs_value_assign(&vm->retval, value);
+ njs_value_assign(retval, value);
return NJS_OK;
}
static njs_int_t
njs_object_create(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value, *descs, arguments[3];
njs_object_t *object;
object->__proto__ = NULL;
}
- njs_set_object(&vm->retval, object);
-
descs = njs_arg(args, nargs, 2);
if (njs_slow_path(!njs_is_undefined(descs))) {
arguments[0] = args[0];
- arguments[1] = vm->retval;
+ njs_set_object(&arguments[1], object);
arguments[2] = *descs;
- return njs_object_define_properties(vm, arguments, 3, unused);
+ return njs_object_define_properties(vm, arguments, 3, unused,
+ retval);
}
+ njs_set_object(retval, object);
+
return NJS_OK;
}
static njs_int_t
njs_object_keys(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
njs_array_t *keys;
return NJS_ERROR;
}
- njs_set_array(&vm->retval, keys);
+ njs_set_array(retval, keys);
return NJS_OK;
}
static njs_int_t
njs_object_values(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_array_t *array;
njs_value_t *value;
return NJS_ERROR;
}
- njs_set_array(&vm->retval, array);
+ njs_set_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_object_entries(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_array_t *array;
njs_value_t *value;
return NJS_ERROR;
}
- njs_set_array(&vm->retval, array);
+ njs_set_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_object_define_property(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *value, *name, *desc, lvalue;
return NJS_ERROR;
}
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
static njs_int_t
njs_object_define_properties(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint32_t i, length;
njs_int_t ret;
}
ret = NJS_OK;
- vm->retval = *value;
+ njs_value_assign(retval, value);
done:
static njs_int_t
njs_object_get_own_property_descriptor(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_value_t lvalue, *value, *property;
property = njs_lvalue_arg(&lvalue, args, nargs, 2);
- return njs_object_prop_descriptor(vm, &vm->retval, value, property);
+ return njs_object_prop_descriptor(vm, retval, value, property);
}
static njs_int_t
njs_object_get_own_property_descriptors(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
uint32_t i, length;
}
ret = NJS_OK;
- njs_set_object(&vm->retval, descriptors);
+ njs_set_object(retval, descriptors);
done:
static njs_int_t
njs_object_get_own_property(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t type)
+ njs_uint_t nargs, njs_index_t type, njs_value_t *retval)
{
njs_array_t *names;
njs_value_t *value;
return NJS_ERROR;
}
- njs_set_array(&vm->retval, names);
+ njs_set_array(retval, names);
return NJS_OK;
}
static njs_int_t
njs_object_get_prototype_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint32_t index;
njs_value_t *value;
value = njs_arg(args, nargs, 1);
if (njs_is_object(value)) {
- njs_object_prototype_proto(vm, NULL, value, NULL, &vm->retval);
+ njs_object_prototype_proto(vm, NULL, value, NULL, retval);
return NJS_OK;
}
index = njs_primitive_prototype_index(value->type);
if (njs_is_symbol(value)) {
- njs_set_object(&vm->retval, &vm->prototypes[index].object);
+ njs_set_object(retval, &vm->prototypes[index].object);
} else {
- njs_set_object_value(&vm->retval,
+ njs_set_object_value(retval,
&vm->prototypes[index].object_value);
}
static njs_int_t
njs_object_set_prototype_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *value, *proto;
}
if (njs_slow_path(!njs_is_object(value))) {
- vm->retval = *value;
-
+ njs_value_assign(retval, value);
return NJS_OK;
}
ret = njs_object_set_prototype(vm, njs_object(value), proto);
if (njs_fast_path(ret == NJS_OK)) {
- vm->retval = *value;
-
+ njs_value_assign(retval, value);
return NJS_OK;
}
static njs_int_t
njs_object_set_integrity_level(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t level)
+ njs_uint_t nargs, njs_index_t level, njs_value_t *retval)
{
uint32_t length;
njs_int_t ret;
value = njs_arg(args, nargs, 1);
if (njs_slow_path(!njs_is_object(value))) {
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
prop->configurable = 0;
}
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
static njs_int_t
njs_object_test_integrity_level(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t level)
+ njs_uint_t nargs, njs_index_t level, njs_value_t *retval)
{
njs_value_t *value;
njs_lvlhsh_t *hash;
njs_object_t *object;
njs_object_prop_t *prop;
njs_lvlhsh_each_t lhe;
- const njs_value_t *retval;
value = njs_arg(args, nargs, 1);
if (njs_slow_path(!njs_is_object(value))) {
- vm->retval = njs_value_true;
+ njs_set_boolean(retval, 1);
return NJS_OK;
}
- retval = &njs_value_false;
+ njs_set_boolean(retval, 0);
object = njs_object(value);
}
}
- retval = &njs_value_true;
+ njs_set_boolean(retval, 1);
done:
- vm->retval = *retval;
-
return NJS_OK;
}
static njs_int_t
njs_object_prevent_extensions(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
value = njs_arg(args, nargs, 1);
if (!njs_is_object(value)) {
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
njs_object(&args[1])->extensible = 0;
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
static njs_int_t
njs_object_is_extensible(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- njs_value_t *value;
- const njs_value_t *retval;
+ njs_value_t *value;
value = njs_arg(args, nargs, 1);
if (!njs_is_object(value)) {
- vm->retval = njs_value_false;
+ njs_set_boolean(retval, 0);
return NJS_OK;
}
- retval = njs_object(value)->extensible ? &njs_value_true
- : &njs_value_false;
-
- vm->retval = *retval;
+ njs_set_boolean(retval, njs_object(value)->extensible);
return NJS_OK;
}
static njs_int_t
njs_object_assign(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint32_t i, j, length;
njs_int_t ret;
njs_array_destroy(vm, names);
}
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
static njs_int_t
njs_object_is(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- njs_set_boolean(&vm->retval, njs_values_same(njs_arg(args, nargs, 1),
+ njs_set_boolean(retval, njs_values_same(njs_arg(args, nargs, 1),
njs_arg(args, nargs, 2)));
return NJS_OK;
static njs_int_t
njs_object_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- vm->retval = *njs_argument(args, 0);
+ njs_value_assign(retval, njs_argument(args, 0));
- if (!njs_is_object(&vm->retval)) {
- return njs_value_to_object(vm, &vm->retval);
+ if (!njs_is_object(retval)) {
+ return njs_value_to_object(vm, retval);
}
return NJS_OK;
njs_int_t
njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- return njs_object_to_string(vm, &args[0], &vm->retval);
+ return njs_object_to_string(vm, &args[0], retval);
}
static njs_int_t
njs_object_prototype_has_own_property(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *value, *property, lvalue;
switch (ret) {
case NJS_OK:
- vm->retval = njs_value_true;
+ njs_set_boolean(retval, 1);
return NJS_OK;
case NJS_DECLINED:
- vm->retval = njs_value_false;
+ njs_set_boolean(retval, 0);
return NJS_OK;
case NJS_ERROR:
static njs_int_t
njs_object_prototype_prop_is_enumerable(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *value, *property, lvalue;
- const njs_value_t *retval;
njs_object_prop_t *prop;
njs_property_query_t pq;
switch (ret) {
case NJS_OK:
prop = pq.lhq.value;
- retval = prop->enumerable ? &njs_value_true : &njs_value_false;
+ njs_set_boolean(retval, prop->enumerable);
break;
case NJS_DECLINED:
- retval = &njs_value_false;
+ njs_set_boolean(retval, 0);
break;
case NJS_ERROR:
return NJS_ERROR;
}
- vm->retval = *retval;
-
return NJS_OK;
}
static njs_int_t
njs_object_prototype_is_prototype_of(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- njs_value_t *prototype, *value;
- njs_object_t *object, *proto;
- const njs_value_t *retval;
+ njs_value_t *prototype, *value;
+ njs_object_t *object, *proto;
if (njs_slow_path(njs_is_null_or_undefined(njs_argument(args, 0)))) {
njs_type_error(vm, "cannot convert undefined to object");
return NJS_ERROR;
}
- retval = &njs_value_false;
prototype = &args[0];
value = njs_arg(args, nargs, 1);
object = object->__proto__;
if (object == proto) {
- retval = &njs_value_true;
- break;
+ njs_set_boolean(retval, 1);
+ return NJS_OK;
}
} while (object != NULL);
}
- vm->retval = *retval;
+ njs_set_boolean(retval, 0);
return NJS_OK;
}
njs_int_t njs_object_to_string(njs_vm_t *vm, njs_value_t *value,
njs_value_t *retval);
njs_int_t njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_int_t njs_object_length(njs_vm_t *vm, njs_value_t *value, int64_t *dst);
njs_int_t njs_prop_private_copy(njs_vm_t *vm, njs_property_query_t *pq,
uint32_t length, index;
njs_int_t ret;
njs_array_t *array;
+ njs_value_t retval;
njs_object_prop_t *prop, *prev;
njs_property_query_t pq;
if (prev->type == NJS_PROPERTY_HANDLER) {
if (prev->writable) {
ret = njs_prop_handler(prev)(vm, prev, object,
- njs_prop_value(prop), &vm->retval);
+ njs_prop_value(prop), &retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
parser->vm = vm;
- njs_set_undefined(&vm->retval);
+ njs_set_invalid(&vm->exception);
if (parser->scope == NULL) {
ret = njs_parser_scope_begin(parser,
return NJS_ERROR;
}
- if (njs_is_error(&vm->retval)) {
+ if (njs_is_error(&vm->exception)) {
return NJS_ERROR;
}
text.length, flags);
if (njs_slow_path(pattern == NULL)) {
- ret = njs_value_property(parser->vm, &parser->vm->retval,
+ retval = njs_vm_exception(parser->vm);
+ ret = njs_value_property(parser->vm, &retval,
njs_value_arg(&string_message),
&retval);
if (njs_slow_path(ret != NJS_OK)) {
}
njs_string_get(&retval, &text);
- njs_value_undefined_set(&parser->vm->retval);
njs_parser_syntax_error(parser, "%V", &text);
return NJS_OK;
}
- if (njs_is_error(&parser->vm->retval)) {
+ if (njs_is_error(&parser->vm->exception)) {
return NJS_DONE;
}
u_char msg[NJS_MAX_ERROR_STR];
u_char *p, *end;
njs_int_t ret;
- njs_value_t value;
+ njs_value_t value, error;
static const njs_value_t file_name = njs_string("fileName");
static const njs_value_t line_number = njs_string("lineNumber");
p = njs_sprintf(p, end, " in %uD", line);
}
- njs_error_new(vm, &vm->retval, type, msg, p - msg);
+ njs_error_new(vm, &error, type, msg, p - msg);
njs_set_number(&value, line);
- njs_value_property_set(vm, &vm->retval, njs_value_arg(&line_number),
- &value);
+ njs_value_property_set(vm, &error, njs_value_arg(&line_number), &value);
if (file->length != 0) {
ret = njs_string_set(vm, &value, file->start, file->length);
if (ret == NJS_OK) {
- njs_value_property_set(vm, &vm->retval, njs_value_arg(&file_name),
+ njs_value_property_set(vm, &error, njs_value_arg(&file_name),
&value);
}
}
+
+ njs_vm_throw(vm, &error);
}
{
va_list args;
- if (njs_is_error(&parser->vm->retval)) {
+ if (njs_is_error(&parser->vm->exception)) {
return;
}
static njs_int_t njs_promise_value_constructor(njs_vm_t *vm, njs_value_t *value,
njs_value_t *dst);
static njs_int_t njs_promise_capability_executor(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t retval);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_promise_host_rejection_tracker(njs_vm_t *vm,
njs_promise_t *promise, njs_promise_rejection_type_t operation);
static njs_int_t njs_promise_resolve_function(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t retval);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_promise_reject_function(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t retval);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_promise_then_finally_function(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_promise_then_finally_return(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_promise_catch_finally_return(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_promise_reaction_job(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_promise_resolve_thenable_job(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_promise_perform_all(njs_vm_t *vm, njs_value_t *iterator,
njs_promise_iterator_args_t *pargs, njs_iterator_handler_t handler,
njs_value_t *retval);
static njs_int_t njs_promise_perform_all_handler(njs_vm_t *vm,
- njs_iterator_args_t *args, njs_value_t *value, int64_t index);
+ njs_iterator_args_t *args, njs_value_t *value, int64_t index,
+ njs_value_t *retval);
static njs_int_t njs_promise_all_resolve_element_functions(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_promise_perform_all_settled_handler(njs_vm_t *vm,
- njs_iterator_args_t *args, njs_value_t *value, int64_t index);
+ njs_iterator_args_t *args, njs_value_t *value, int64_t index,
+ njs_value_t *retval);
static njs_int_t njs_promise_all_settled_element_functions(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t rejected);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t rejected,
+ njs_value_t *retval);
static njs_int_t njs_promise_perform_any_handler(njs_vm_t *vm,
- njs_iterator_args_t *args, njs_value_t *value, int64_t index);
+ njs_iterator_args_t *args, njs_value_t *value, int64_t index,
+ njs_value_t *retval);
static njs_int_t njs_promise_any_reject_element_functions(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
static njs_int_t njs_promise_perform_race_handler(njs_vm_t *vm,
- njs_iterator_args_t *args, njs_value_t *value, int64_t index);
+ njs_iterator_args_t *args, njs_value_t *value, int64_t index,
+ njs_value_t *retval);
static const njs_value_t string_resolve = njs_string("resolve");
njs_int_t
njs_promise_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_promise_t *promise;
njs_function_t *function;
return NJS_ERROR;
}
- njs_set_promise(&vm->retval, promise);
+ njs_set_promise(retval, promise);
return NJS_OK;
}
ret = njs_function_call(vm, function, &njs_value_undefined, arguments, 2,
&retval);
if (njs_slow_path(ret != NJS_OK)) {
- if (njs_slow_path(njs_is_memory_error(vm, &vm->retval))) {
+ if (njs_slow_path(njs_is_memory_error(vm, &vm->exception))) {
return NULL;
}
+ retval = njs_vm_exception(vm);
+
ret = njs_function_call(vm, njs_function(&arguments[1]),
- &njs_value_undefined, &vm->retval, 1, &retval);
+ &njs_value_undefined, &retval, 1, &retval);
if (njs_slow_path(ret != NJS_OK)) {
return NULL;
}
static njs_int_t
njs_promise_capability_executor(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_promise_context_t *context;
njs_promise_capability_t *capability;
capability->resolve = *njs_arg(args, nargs, 1);
capability->reject = *njs_arg(args, nargs, 2);
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_value_assign(retval, &njs_value_undefined);
return NJS_OK;
}
static njs_int_t
njs_promise_invoke_then(njs_vm_t *vm, njs_value_t *promise, njs_value_t *args,
- njs_int_t nargs)
+ njs_int_t nargs, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t function;
if (njs_fast_path(njs_is_function(&function))) {
return njs_function_call(vm, njs_function(&function), promise, args,
- nargs, &vm->retval);
+ nargs, retval);
}
failed:
static njs_int_t
njs_promise_resolve_function(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *resolution, error, then, arguments[3];
promise = njs_promise(&context->promise);
if (*context->resolved_ref) {
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_value_assign(retval, &njs_value_undefined);
return NJS_OK;
}
return NJS_ERROR;
}
- njs_vm_retval_set(vm, njs_promise_reject(vm, promise, &error));
+ njs_value_assign(retval, njs_promise_reject(vm, promise, &error));
return NJS_OK;
}
ret = njs_value_property(vm, resolution, njs_value_arg(&string_then),
&then);
if (njs_slow_path(ret == NJS_ERROR)) {
- if (njs_slow_path(njs_is_memory_error(vm, &vm->retval))) {
+ if (njs_slow_path(njs_is_memory_error(vm, &vm->exception))) {
return NJS_ERROR;
}
- njs_vm_retval_set(vm, njs_promise_reject(vm, promise, &vm->retval));
- if (njs_slow_path(njs_vm_retval(vm)->type == NJS_NULL)) {
+ error = njs_vm_exception(vm);
+ njs_value_assign(retval, njs_promise_reject(vm, promise, &error));
+
+ if (njs_slow_path(njs_is_null(retval))) {
return NJS_ERROR;
}
return ret;
}
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_value_assign(retval, &njs_value_undefined);
return NJS_OK;
fulfill:
- njs_vm_retval_set(vm, njs_promise_fulfill(vm, promise, resolution));
- if (njs_slow_path(njs_vm_retval(vm)->type == NJS_NULL)) {
+ njs_value_assign(retval, njs_promise_fulfill(vm, promise, resolution));
+ if (njs_slow_path(njs_is_null(retval))) {
return NJS_ERROR;
}
static njs_int_t
njs_promise_object_resolve(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_promise_t *promise;
return NJS_ERROR;
}
- njs_set_promise(&vm->retval, promise);
+ njs_set_promise(retval, promise);
return NJS_OK;
}
static njs_int_t
njs_promise_reject_function(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
njs_native_frame_t *active_frame;
context = active_frame->function->context;
if (*context->resolved_ref) {
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_value_assign(retval, &njs_value_undefined);
return NJS_OK;
}
return NJS_ERROR;
}
- njs_vm_retval_set(vm, value);
+ njs_value_assign(retval, value);
return NJS_OK;
}
static njs_int_t
njs_promise_object_reject(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t value;
return ret;
}
- njs_vm_retval_set(vm, &capability->promise);
+ njs_value_assign(retval, &capability->promise);
return NJS_OK;
}
static njs_int_t
njs_promise_prototype_then(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *promise, *fulfilled, *rejected, constructor;
rejected = njs_arg(args, nargs, 2);
return njs_promise_perform_then(vm, promise, fulfilled, rejected,
- capability);
+ capability, retval);
failed:
njs_int_t
njs_promise_perform_then(njs_vm_t *vm, njs_value_t *value,
njs_value_t *fulfilled, njs_value_t *rejected,
- njs_promise_capability_t *capability)
+ njs_promise_capability_t *capability, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t arguments[2];
data->is_handled = 1;
if (capability == NULL) {
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_set_undefined(retval);
} else {
- njs_vm_retval_set(vm, &capability->promise);
+ njs_value_assign(retval, &capability->promise);
}
return NJS_OK;
static njs_int_t
njs_promise_prototype_catch(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t arguments[2];
arguments[0] = njs_value_undefined;
arguments[1] = *njs_arg(args, nargs, 1);
- return njs_promise_invoke_then(vm, njs_argument(args, 0), arguments, 2);
+ return njs_promise_invoke_then(vm, njs_argument(args, 0), arguments, 2,
+ retval);
}
static njs_int_t
njs_promise_prototype_finally(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *promise, *finally, constructor, arguments[2];
arguments[0] = *finally;
arguments[1] = *finally;
- return njs_promise_invoke_then(vm, promise, arguments, 2);
+ return njs_promise_invoke_then(vm, promise, arguments, 2, retval);
}
function = njs_promise_create_function(vm, sizeof(njs_promise_context_t));
njs_set_function(&arguments[1], function);
- return njs_promise_invoke_then(vm, promise, arguments, 2);
+ return njs_promise_invoke_then(vm, promise, arguments, 2, retval);
}
static njs_int_t
njs_promise_then_finally_function(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
- njs_value_t value, retval, argument;
+ njs_value_t value, argument;
njs_promise_t *promise;
njs_function_t *function;
njs_native_frame_t *frame;
context = frame->function->context;
ret = njs_function_call(vm, njs_function(&context->finally),
- &njs_value_undefined, args, 0, &retval);
+ &njs_value_undefined, args, 0, &value);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- promise = njs_promise_resolve(vm, &context->constructor, &retval);
+ promise = njs_promise_resolve(vm, &context->constructor, &value);
if (njs_slow_path(promise == NULL)) {
return NJS_ERROR;
}
njs_set_function(&argument, function);
- return njs_promise_invoke_then(vm, &value, &argument, 1);
+ return njs_promise_invoke_then(vm, &value, &argument, 1, retval);
}
static njs_int_t
njs_promise_then_finally_return(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- njs_vm_retval_set(vm, vm->top_frame->function->context);
+ njs_value_assign(retval, vm->top_frame->function->context);
return NJS_OK;
}
static njs_int_t
njs_promise_catch_finally_return(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- njs_vm_retval_set(vm, vm->top_frame->function->context);
+ njs_vm_throw(vm, vm->top_frame->function->context);
return NJS_ERROR;
}
static njs_int_t
njs_promise_reaction_job(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_bool_t is_error;
- njs_value_t *value, *argument, retval;
+ njs_value_t value, *argument;
njs_promise_reaction_t *reaction;
njs_promise_capability_t *capability;
- value = njs_arg(args, nargs, 1);
+ reaction = njs_data(njs_arg(args, nargs, 1));
argument = njs_arg(args, nargs, 2);
-
- reaction = njs_data(value);
capability = reaction->capability;
is_error = 0;
is_error = 1;
}
- retval = *argument;
+ njs_value_assign(&value, argument);
} else {
ret = njs_function_call(vm, njs_function(&reaction->handler),
- &njs_value_undefined, argument, 1, &retval);
+ &njs_value_undefined, argument, 1, &value);
if (njs_slow_path(ret != NJS_OK)) {
- if (njs_slow_path(njs_is_memory_error(vm, &vm->retval))) {
+ if (njs_slow_path(njs_is_memory_error(vm, &vm->exception))) {
return NJS_ERROR;
}
- retval = vm->retval;
+ value = njs_vm_exception(vm);
+
is_error = 1;
}
}
if (capability == NULL) {
- njs_vm_retval_set(vm, &retval);
+ njs_value_assign(retval, &value);
return NJS_OK;
}
if (is_error) {
ret = njs_function_call(vm, njs_function(&capability->reject),
- &njs_value_undefined, &retval, 1, &vm->retval);
+ &njs_value_undefined, &value, 1, retval);
} else {
ret = njs_function_call(vm, njs_function(&capability->resolve),
- &njs_value_undefined, &retval, 1, &vm->retval);
+ &njs_value_undefined, &value, 1, retval);
}
if (njs_slow_path(ret != NJS_OK)) {
static njs_int_t
njs_promise_resolve_thenable_job(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
- njs_value_t *promise, retval, arguments[2];
+ njs_value_t *promise, value, arguments[2];
promise = njs_arg(args, nargs, 1);
}
ret = njs_function_call(vm, njs_function(njs_arg(args, nargs, 3)),
- njs_arg(args, nargs, 2), arguments, 2, &retval);
+ njs_arg(args, nargs, 2), arguments, 2, &value);
if (njs_slow_path(ret != NJS_OK)) {
- if (njs_slow_path(njs_is_memory_error(vm, &vm->retval))) {
+ if (njs_slow_path(njs_is_memory_error(vm, &vm->exception))) {
return NJS_ERROR;
}
+ value = njs_vm_exception(vm);
+
ret = njs_function_call(vm, njs_function(&arguments[1]),
- &njs_value_undefined, &vm->retval, 1,
- &vm->retval);
+ &njs_value_undefined, &value, 1, retval);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
static njs_int_t
njs_promise_all(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t function_type)
+ njs_index_t function_type, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *promise_ctor, resolve;
}
return njs_promise_perform_all(vm, njs_arg(args, nargs, 1), &pargs,
- handler, &vm->retval);
+ handler, retval);
}
pargs->args.value = iterator;
pargs->args.to = length;
- ret = njs_object_iterate(vm, &pargs->args, handler);
+ ret = njs_object_iterate(vm, &pargs->args, handler, retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
}
}
- *retval = pargs->capability->promise;
+ njs_value_assign(retval, &pargs->capability->promise);
return NJS_OK;
}
static njs_int_t
njs_promise_perform_all_handler(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *value, int64_t index)
+ njs_value_t *value, int64_t index, njs_value_t *retval)
{
njs_int_t ret;
njs_array_t *array;
njs_set_function(&arguments[0], on_fulfilled);
arguments[1] = capability->reject;
- ret = njs_promise_invoke_then(vm, &next, arguments, 2);
+ ret = njs_promise_invoke_then(vm, &next, arguments, 2, retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
static njs_int_t
njs_promise_all_resolve_element_functions(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t arr_value;
context = vm->top_frame->function->context;
if (context->already_called) {
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_value_assign(retval, &njs_value_undefined);
return NJS_OK;
}
return njs_function_call(vm,
njs_function(&context->capability->resolve),
&njs_value_undefined, &arr_value, 1,
- &vm->retval);
+ retval);
}
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_value_assign(retval, &njs_value_undefined);
return NJS_OK;
}
static njs_int_t
njs_promise_perform_all_settled_handler(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *value, int64_t index)
+ njs_value_t *value, int64_t index, njs_value_t *retval)
{
njs_int_t ret;
njs_array_t *array;
njs_set_function(&arguments[0], on_fulfilled);
njs_set_function(&arguments[1], on_rejected);
- ret = njs_promise_invoke_then(vm, &next, arguments, 2);
+ ret = njs_promise_invoke_then(vm, &next, arguments, 2, retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
static njs_int_t
njs_promise_all_settled_element_functions(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t rejected)
+ njs_value_t *args, njs_uint_t nargs, njs_index_t rejected,
+ njs_value_t *retval)
{
njs_int_t ret;
njs_value_t obj_value, arr_value;
context = vm->top_frame->function->context;
if (context->already_called) {
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_value_assign(retval, &njs_value_undefined);
return NJS_OK;
}
return njs_function_call(vm,
njs_function(&context->capability->resolve),
&njs_value_undefined, &arr_value, 1,
- &vm->retval);
+ retval);
}
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_value_assign(retval, &njs_value_undefined);
return NJS_OK;
}
static njs_int_t
njs_promise_perform_any_handler(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *value, int64_t index)
+ njs_value_t *value, int64_t index, njs_value_t *retval)
{
njs_int_t ret;
njs_array_t *array;
arguments[0] = capability->resolve;
njs_set_function(&arguments[1], on_rejected);
- ret = njs_promise_invoke_then(vm, &next, arguments, 2);
+ ret = njs_promise_invoke_then(vm, &next, arguments, 2, retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
static njs_int_t
njs_promise_any_reject_element_functions(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t argument, arr_value;
context = vm->top_frame->function->context;
if (context->already_called) {
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_value_assign(retval, &njs_value_undefined);
return NJS_OK;
}
return njs_function_call(vm, njs_function(&context->capability->reject),
&njs_value_undefined, &argument, 1,
- &vm->retval);
+ retval);
}
- njs_vm_retval_set(vm, &njs_value_undefined);
+ njs_value_assign(retval, &njs_value_undefined);
return NJS_OK;
}
static njs_int_t
njs_promise_race(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t length;
njs_int_t ret;
pargs.args.value = iterator;
pargs.args.to = length;
- ret = njs_object_iterate(vm, &pargs.args, njs_promise_perform_race_handler);
+ ret = njs_object_iterate(vm, &pargs.args, njs_promise_perform_race_handler,
+ retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
- vm->retval = pargs.capability->promise;
+ njs_value_assign(retval, &pargs.capability->promise);
return NJS_OK;
}
static njs_int_t
njs_promise_perform_race_handler(njs_vm_t *vm, njs_iterator_args_t *args,
- njs_value_t *value, int64_t index)
+ njs_value_t *value, int64_t index, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t arguments[2], next;
arguments[0] = capability->resolve;
arguments[1] = capability->reject;
- (void) njs_promise_invoke_then(vm, &next, arguments, 2);
+ (void) njs_promise_invoke_then(vm, &next, arguments, 2, retval);
return NJS_OK;
}
static njs_int_t
njs_promise_species(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- njs_vm_retval_set(vm, njs_argument(args, 0));
+ njs_value_assign(retval, njs_argument(args, 0));
return NJS_OK;
}
njs_int_t njs_promise_constructor(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_promise_capability_t *njs_promise_new_capability(njs_vm_t *vm,
njs_value_t *constructor);
njs_function_t *njs_promise_create_function(njs_vm_t *vm, size_t context_size);
njs_int_t njs_promise_perform_then(njs_vm_t *vm, njs_value_t *value,
njs_value_t *fulfilled, njs_value_t *rejected,
- njs_promise_capability_t *capability);
+ njs_promise_capability_t *capability, njs_value_t *retval);
njs_promise_t *njs_promise_resolve(njs_vm_t *vm, njs_value_t *constructor,
njs_value_t *x);
static void *njs_regexp_malloc(size_t size, void *memory_data);
static void njs_regexp_free(void *p, void *memory_data);
static njs_int_t njs_regexp_prototype_source(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static int njs_regexp_pattern_compile(njs_vm_t *vm, njs_regex_t *regex,
u_char *source, size_t len, njs_regex_flags_t flags);
static u_char *njs_regexp_compile_trace_handler(njs_trace_t *trace,
static njs_int_t
njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *start;
njs_int_t ret;
pattern = njs_arg(args, nargs, 1);
if (njs_is_regexp(pattern)) {
- ret = njs_regexp_prototype_source(vm, pattern, 1, 0);
+ ret = njs_regexp_prototype_source(vm, pattern, 1, 0, &source);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- source = vm->retval;
-
re_flags = njs_regexp_value_flags(vm, pattern);
pattern = &source;
njs_string_get(pattern, &string);
- return njs_regexp_create(vm, &vm->retval, string.start, string.length,
+ return njs_regexp_create(vm, retval, string.start, string.length,
re_flags);
}
goto fail;
}
+ njs_set_invalid(&vm->exception);
+
ret = njs_regexp_pattern_compile(vm, &pattern->regex[1],
&pattern->source[0], text.length,
flags | NJS_REGEX_UTF8);
} while (n != pattern->ngroups);
}
- njs_set_undefined(&vm->retval);
-
return pattern;
fail:
if (setval != NULL) {
regexp->last_index = *setval;
- *retval = *setval;
+ njs_value_assign(retval, setval);
return NJS_OK;
}
- *retval = regexp->last_index;
+ njs_value_assign(retval, ®exp->last_index);
return NJS_OK;
}
static njs_int_t
njs_regexp_prototype_flags(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
u_char *p;
njs_int_t ret;
*p++ = 'y';
}
- return njs_string_new(vm, &vm->retval, dst, p - dst, p - dst);
+ return njs_string_new(vm, retval, dst, p - dst, p - dst);
}
static njs_int_t
njs_regexp_prototype_flag(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t flag)
+ njs_uint_t nargs, njs_index_t flag, njs_value_t *retval)
{
unsigned yn;
njs_value_t *this;
if (njs_slow_path(!njs_is_regexp(this))) {
if (njs_object(this) == &vm->prototypes[NJS_OBJ_TYPE_REGEXP].object) {
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
break;
}
- njs_set_boolean(&vm->retval, yn);
+ njs_set_boolean(retval, yn);
return NJS_OK;
}
static njs_int_t
njs_regexp_prototype_source(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_str_t src;
njs_value_t *this;
if (njs_slow_path(!njs_is_regexp(this))) {
if (njs_object(this) == &vm->prototypes[NJS_OBJ_TYPE_REGEXP].object) {
- vm->retval = njs_string_empty_regexp;
+ njs_value_assign(retval, &njs_string_empty_regexp);
return NJS_OK;
}
src.start = pattern->source;
src.length = njs_strlen(pattern->source);
- return njs_string_decode_utf8(vm, &vm->retval, &src);
+ return njs_string_decode_utf8(vm, retval, &src);
}
static njs_int_t
njs_regexp_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
u_char *p;
size_t size, length;
length = 0;
}
- p = njs_string_alloc(vm, &vm->retval, size, length);
+ p = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_regexp_prototype_test(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
- njs_value_t *r, *string, lvalue, retval;
+ njs_value_t *r, *string, lvalue, value;
r = njs_argument(args, 0);
return NJS_ERROR;
}
- ret = njs_regexp_exec(vm, r, string, &retval);
+ ret = njs_regexp_exec(vm, r, string, &value);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- njs_set_boolean(&vm->retval, !njs_is_null(&retval));
+ njs_set_boolean(retval, !njs_is_null(&value));
return NJS_OK;
}
njs_int_t
njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *r, *s;
return ret;
}
- return njs_regexp_builtin_exec(vm, r, s, &vm->retval);
+ return njs_regexp_builtin_exec(vm, r, s, retval);
}
njs_int_t
njs_regexp_prototype_symbol_replace(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
int64_t n, last_index, ncaptures, pos, next_pos, length;
njs_str_t rep, m;
njs_bool_t global;
njs_array_t *array;
njs_value_t *arguments, *r, *rx, *string, *replace;
- njs_value_t s_lvalue, r_lvalue, value, matched, groups, retval;
+ njs_value_t s_lvalue, r_lvalue, value, matched, groups;
njs_function_t *func_replace;
njs_string_prop_t s;
ret = njs_string_get_substitution(vm, &matched, string, pos,
arguments, ncaptures, &groups,
- replace, &retval);
+ replace, retval);
} else {
ret = njs_array_expand(vm, array, 0,
ret = njs_function_call(vm, func_replace,
njs_value_arg(&njs_value_undefined),
- arguments, n, &retval);
+ arguments, n, retval);
}
if (njs_slow_path(ret == NJS_ERROR)) {
return NJS_ERROR;
}
- ret = njs_value_to_string(vm, &retval, &retval);
+ ret = njs_value_to_string(vm, retval, retval);
if (njs_slow_path(ret != NJS_OK)) {
goto exception;
}
if (pos >= next_pos) {
njs_chb_append(&chain, &s.start[next_pos], pos - next_pos);
- njs_string_get(&retval, &rep);
+ njs_string_get(retval, &rep);
njs_chb_append_str(&chain, &rep);
njs_string_get(&matched, &m);
njs_chb_append(&chain, &s.start[next_pos], s.size - next_pos);
}
- ret = njs_string_create_chb(vm, &vm->retval, &chain);
+ ret = njs_string_create_chb(vm, retval, &chain);
if (njs_slow_path(ret != NJS_OK)) {
ret = NJS_ERROR;
goto exception;
static njs_int_t
njs_regexp_prototype_symbol_split(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
u_char *dst;
int64_t e, i, p, q, ncaptures, length;
njs_utf8_t utf8;
njs_array_t *array;
njs_value_t *rx, *string, *value;
- njs_value_t r, z, this, s_lvalue, retval, setval, constructor;
+ njs_value_t r, z, this, s_lvalue, setval, constructor;
njs_object_t *object;
const u_char *start, *end;
njs_string_prop_t s;
return ret;
}
- ret = njs_value_property(vm, rx, njs_value_arg(&string_flags), &retval);
+ ret = njs_value_property(vm, rx, njs_value_arg(&string_flags), retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return NJS_ERROR;
}
- ret = njs_value_to_string(vm, &retval, &retval);
+ ret = njs_value_to_string(vm, retval, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- (void) njs_string_prop(&s, &retval);
+ (void) njs_string_prop(&s, retval);
sticky = memchr(s.start, 'y', s.size) != NULL;
*dst++ = 'y';
} else {
- arguments[1] = retval;
+ njs_value_assign(&arguments[1], retval);
}
ret = njs_function_call2(vm, njs_function(&constructor), &this,
}
ret = njs_value_property(vm, rx, njs_value_arg(&string_lindex),
- &retval);
+ retval);
if (njs_slow_path(ret == NJS_ERROR)) {
return NJS_ERROR;
}
- ret = njs_value_to_length(vm, &retval, &e);
+ ret = njs_value_to_length(vm, retval, &e);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
done:
- njs_set_array(&vm->retval, array);
+ njs_set_array(retval, array);
return NJS_OK;
}
njs_int_t njs_regexp_exec(njs_vm_t *vm, njs_value_t *r, njs_value_t *s,
njs_value_t *retval);
njs_int_t njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_int_t njs_regexp_prototype_symbol_replace(njs_vm_t *vm,
- njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
+ njs_value_t *args, njs_uint_t nargs, njs_index_t unused,
+ njs_value_t *retval);
njs_int_t njs_regexp_to_string(njs_vm_t *vm, njs_value_t *retval,
const njs_value_t *regexp);
#endif
-typedef void (*njs_console_output_pt)(njs_vm_t *vm, njs_int_t ret);
+typedef void (*njs_console_output_pt)(njs_vm_t *vm, njs_value_t *value,
+ njs_int_t ret);
typedef struct {
static njs_int_t njs_console_init(njs_vm_t *vm, njs_console_t *console);
-static void njs_console_output(njs_vm_t *vm, njs_int_t ret);
+static void njs_console_output(njs_vm_t *vm, njs_value_t *value,
+ njs_int_t ret);
static njs_int_t njs_externals_init(njs_vm_t *vm);
static njs_vm_t *njs_create_vm(njs_opts_t *opts, njs_vm_opt_t *vm_options);
-static void njs_process_output(njs_vm_t *vm, njs_int_t ret);
+static void njs_process_output(njs_vm_t *vm, njs_value_t *value, njs_int_t ret);
static njs_int_t njs_process_script(njs_vm_t *vm, void *runtime,
const njs_str_t *script);
#endif
static njs_int_t njs_ext_console_log(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t indent);
+ njs_uint_t nargs, njs_index_t indent, njs_value_t *retval);
static njs_int_t njs_ext_console_time(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_host_event_t njs_console_set_timer(njs_external_ptr_t external,
uint64_t delay, njs_vm_event_t vm_event);
static void
-njs_console_output(njs_vm_t *vm, njs_int_t ret)
+njs_console_output(njs_vm_t *vm, njs_value_t *value, njs_int_t ret)
{
njs_str_t out;
if (ret == NJS_OK) {
- if (njs_vm_retval_dump(vm, &out, 1) != NJS_OK) {
+ if (njs_vm_value_dump(vm, &out, value, 0, 1) != NJS_OK) {
njs_stderror("Shell:failed to get retval from VM\n");
return;
}
}
} else {
- njs_vm_retval_string(vm, &out);
+ njs_vm_exception_string(vm, &out);
njs_stderror("Thrown:\n%V\n", &out);
}
}
static njs_int_t
njs_process_script(njs_vm_t *vm, void *runtime, const njs_str_t *script)
{
- u_char *start, *end;
- njs_int_t ret;
+ u_char *start, *end;
+ njs_int_t ret;
+ njs_value_t retval;
start = script->start;
end = start + script->length;
if (ret == NJS_OK) {
if (start == end) {
- ret = njs_vm_start(vm);
+ ret = njs_vm_start(vm, &retval);
} else {
njs_vm_error(vm, "Extra characters at the end of the script");
}
}
- njs_process_output(vm, ret);
+ njs_process_output(vm, &retval, ret);
if (!vm->options.interactive && ret == NJS_ERROR) {
return NJS_ERROR;
ret = njs_vm_run(vm);
if (ret == NJS_ERROR) {
- njs_process_output(vm, ret);
+ njs_process_output(vm, &retval, ret);
if (!vm->options.interactive) {
return NJS_ERROR;
static void
-njs_process_output(njs_vm_t *vm, njs_int_t ret)
+njs_process_output(njs_vm_t *vm, njs_value_t *value, njs_int_t ret)
{
njs_console_output_pt pt;
pt = (njs_console_output_pt) njs_vm_meta(vm, 0);
if (pt != NULL) {
- pt(vm, ret);
+ pt(vm, value, ret);
}
}
static njs_int_t
njs_ext_console_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t indent)
+ njs_index_t indent, njs_value_t *retval)
{
njs_str_t msg;
njs_uint_t n;
njs_vm_log(vm, "\n");
}
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
static njs_int_t
njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t name;
label->time = njs_time();
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
static njs_int_t
njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint64_t ns, ms;
njs_int_t ret;
njs_vm_log(vm, "Timer \"%V\" doesn’t exist.\n", &name);
}
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
static njs_int_t njs_string_slice_args(njs_vm_t *vm, njs_slice_prop_t *slice,
njs_value_t *args, njs_uint_t nargs);
static njs_int_t njs_string_from_char_code(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t is_point);
+ njs_uint_t nargs, njs_index_t is_point, njs_value_t *retval);
static njs_int_t njs_string_bytes_from(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static njs_int_t njs_string_bytes_from_array_like(njs_vm_t *vm,
- njs_value_t *value);
+ njs_value_t *value, njs_value_t *retval);
static njs_int_t njs_string_bytes_from_string(njs_vm_t *vm,
- const njs_value_t *string, const njs_value_t *encoding);
+ const njs_value_t *string, const njs_value_t *encoding,
+ njs_value_t *retval);
static njs_int_t njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args,
- njs_regexp_pattern_t *pattern);
+ njs_regexp_pattern_t *pattern, njs_value_t *retval);
#define njs_base64_encoded_length(len) (((len + 2) / 3) * 4)
njs_int_t
-njs_string_hex(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
+njs_string_hex(njs_vm_t *vm, njs_value_t *retval, const njs_str_t *src)
{
size_t length;
njs_str_t dst;
length = njs_encode_hex_length(src, &dst.length);
- dst.start = njs_string_alloc(vm, value, dst.length, length);
+ dst.start = njs_string_alloc(vm, retval, dst.length, length);
if (njs_fast_path(dst.start != NULL)) {
njs_encode_hex(&dst, src);
return NJS_OK;
njs_int_t
-njs_string_base64(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
+njs_string_base64(njs_vm_t *vm, njs_value_t *retval, const njs_str_t *src)
{
size_t length;
njs_str_t dst;
length = njs_encode_base64_length(src, &dst.length);
if (njs_slow_path(dst.length == 0)) {
- vm->retval = njs_string_empty;
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
- dst.start = njs_string_alloc(vm, value, dst.length, length);
+ dst.start = njs_string_alloc(vm, retval, dst.length, length);
if (njs_slow_path(dst.start == NULL)) {
return NJS_ERROR;
}
njs_int_t
-njs_string_base64url(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
+njs_string_base64url(njs_vm_t *vm, njs_value_t *retval, const njs_str_t *src)
{
size_t padding;
njs_str_t dst;
if (njs_slow_path(src->length == 0)) {
- vm->retval = njs_string_empty;
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
dst.length = njs_base64_encoded_length(src->length) - padding;
- dst.start = njs_string_alloc(vm, value, dst.length, dst.length);
+ dst.start = njs_string_alloc(vm, retval, dst.length, dst.length);
if (njs_slow_path(dst.start == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_string_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *value;
if (njs_slow_path(!njs_is_string(value))) {
if (!vm->top_frame->ctor && njs_is_symbol(value)) {
- return njs_symbol_descriptive_string(vm, &vm->retval, value);
+ return njs_symbol_descriptive_string(vm, retval, value);
}
ret = njs_value_to_string(vm, value, value);
return NJS_ERROR;
}
- njs_set_object_value(&vm->retval, object);
+ njs_set_object_value(retval, object);
} else {
- vm->retval = *value;
+ njs_value_assign(retval, value);
}
return NJS_OK;
static njs_int_t
njs_string_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
}
}
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
static njs_int_t
njs_string_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t enc, str;
njs_value_t value;
njs_string_prop_t string;
- ret = njs_string_prototype_value_of(vm, args, nargs, unused);
+ ret = njs_string_prototype_value_of(vm, args, nargs, unused, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
return NJS_ERROR;
}
- value = vm->retval;
+ njs_value_assign(&value, retval);
(void) njs_string_prop(&string, &value);
str.start = string.start;
if (enc.length == 3 && memcmp(enc.start, "hex", 3) == 0) {
- return njs_string_hex(vm, &vm->retval, &str);
+ return njs_string_hex(vm, retval, &str);
} else if (enc.length == 6 && memcmp(enc.start, "base64", 6) == 0) {
- return njs_string_base64(vm, &vm->retval, &str);
+ return njs_string_base64(vm, retval, &str);
} else if (enc.length == 9 && memcmp(enc.start, "base64url", 9) == 0) {
- return njs_string_base64url(vm, &vm->retval, &str);
+ return njs_string_base64url(vm, retval, &str);
}
njs_type_error(vm, "Unknown encoding: \"%V\"", &enc);
njs_int_t
njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *p, *start;
uint64_t size, length, mask;
}
if (nargs == 1) {
- njs_string_copy(&vm->retval, &args[0]);
+ njs_string_copy(retval, &args[0]);
return NJS_OK;
}
length &= mask;
- start = njs_string_alloc(vm, &vm->retval, size, length);
+ start = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(start == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_string_prototype_from_utf8(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
ssize_t length;
njs_int_t ret;
if (string.length != 0) {
/* ASCII or UTF8 string. */
- return njs_string_slice(vm, &vm->retval, &string, &slice);
+ return njs_string_slice(vm, retval, &string, &slice);
}
string.start += slice.start;
length = njs_utf8_length(string.start, slice.length);
if (length >= 0) {
- return njs_string_new(vm, &vm->retval, string.start, slice.length,
+ return njs_string_new(vm, retval, string.start, slice.length,
length);
}
- vm->retval = njs_value_null;
+ njs_set_null(retval);
return NJS_OK;
}
static njs_int_t
njs_string_prototype_to_utf8(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_slice_prop_t slice;
return ret;
}
- return njs_string_slice(vm, &vm->retval, &string, &slice);
+ return njs_string_slice(vm, retval, &string, &slice);
}
static njs_int_t
njs_string_prototype_from_bytes(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
u_char *p, *s, *start, *end;
size_t size;
if (string.length != 0) {
/* ASCII or UTF8 string. */
- return njs_string_slice(vm, &vm->retval, &string, &slice);
+ return njs_string_slice(vm, retval, &string, &slice);
}
size = 0;
size += (*p < 0x80) ? 1 : 2;
}
- start = njs_string_alloc(vm, &vm->retval, size, slice.length);
+ start = njs_string_alloc(vm, retval, size, slice.length);
if (njs_fast_path(start != NULL)) {
static njs_int_t
njs_string_prototype_to_bytes(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *p;
size_t length;
if (string.length == 0) {
/* Byte string. */
- return njs_string_slice(vm, &vm->retval, &string, &slice);
+ return njs_string_slice(vm, retval, &string, &slice);
}
- p = njs_string_alloc(vm, &vm->retval, slice.length, 0);
+ p = njs_string_alloc(vm, retval, slice.length, 0);
if (njs_fast_path(p != NULL)) {
byte = njs_utf8_decode(&ctx, &s, end);
if (njs_slow_path(byte > 0xFF)) {
- njs_release(vm, &vm->retval);
- vm->retval = njs_value_null;
+ njs_release(vm, retval);
+ njs_set_null(retval);
return NJS_OK;
}
static njs_int_t
njs_string_prototype_slice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_slice_prop_t slice;
return ret;
}
- return njs_string_slice(vm, &vm->retval, &string, &slice);
+ return njs_string_slice(vm, retval, &string, &slice);
}
static njs_int_t
njs_string_prototype_substring(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
int64_t start, end, length;
njs_int_t ret;
slice.start = start;
slice.length = length;
- return njs_string_slice(vm, &vm->retval, &string, &slice);
+ return njs_string_slice(vm, retval, &string, &slice);
}
static njs_int_t
njs_string_prototype_substr(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t start, length, n;
njs_int_t ret;
slice.start = start;
slice.length = length;
- return njs_string_slice(vm, &vm->retval, &string, &slice);
+ return njs_string_slice(vm, retval, &string, &slice);
}
static njs_int_t
njs_string_prototype_char_at(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
size_t length;
int64_t start;
slice.start = start;
slice.length = length;
- return njs_string_slice(vm, &vm->retval, &string, &slice);
+ return njs_string_slice(vm, retval, &string, &slice);
}
njs_int_t
-njs_string_slice(njs_vm_t *vm, njs_value_t *dst,
+njs_string_slice(njs_vm_t *vm, njs_value_t *retval,
const njs_string_prop_t *string, const njs_slice_prop_t *slice)
{
njs_string_prop_t prop;
njs_string_slice_string_prop(&prop, string, slice);
if (njs_fast_path(prop.size != 0)) {
- return njs_string_new(vm, dst, prop.start, prop.size, prop.length);
+ return njs_string_new(vm, retval, prop.start, prop.size, prop.length);
}
- *dst = njs_string_empty;
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
static njs_int_t
njs_string_prototype_char_code_at(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
double num;
size_t length;
done:
- njs_set_number(&vm->retval, num);
+ njs_set_number(retval, num);
return NJS_OK;
}
static njs_int_t
njs_string_bytes_from(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
value = njs_arg(args, nargs, 1);
if (njs_is_string(value)) {
- return njs_string_bytes_from_string(vm, value, njs_arg(args, nargs, 2));
+ return njs_string_bytes_from_string(vm, value, njs_arg(args, nargs, 2),
+ retval);
} else if (njs_is_object(value)) {
if (njs_is_object_string(value)) {
value = njs_object_value(value);
return njs_string_bytes_from_string(vm, value,
- njs_arg(args, nargs, 2));
+ njs_arg(args, nargs, 2),
+ retval);
}
- return njs_string_bytes_from_array_like(vm, value);
+ return njs_string_bytes_from_array_like(vm, value, retval);
}
njs_type_error(vm, "value must be a string or array-like object");
static njs_int_t
-njs_string_bytes_from_array_like(njs_vm_t *vm, njs_value_t *value)
+njs_string_bytes_from_array_like(njs_vm_t *vm, njs_value_t *value,
+ njs_value_t *retval)
{
u_char *p;
int64_t length;
}
}
- p = njs_string_alloc(vm, &vm->retval, length, 0);
+ p = njs_string_alloc(vm, retval, length, 0);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_string_bytes_from_string(njs_vm_t *vm, const njs_value_t *string,
- const njs_value_t *encoding)
+ const njs_value_t *encoding, njs_value_t *retval)
{
njs_str_t enc, str;
njs_string_get(string, &str);
if (enc.length == 3 && memcmp(enc.start, "hex", 3) == 0) {
- return njs_string_decode_hex(vm, &vm->retval, &str);
+ return njs_string_decode_hex(vm, retval, &str);
} else if (enc.length == 6 && memcmp(enc.start, "base64", 6) == 0) {
- return njs_string_decode_base64(vm, &vm->retval, &str);
+ return njs_string_decode_base64(vm, retval, &str);
} else if (enc.length == 9 && memcmp(enc.start, "base64url", 9) == 0) {
- return njs_string_decode_base64url(vm, &vm->retval, &str);
+ return njs_string_decode_base64url(vm, retval, &str);
}
njs_type_error(vm, "Unknown encoding: \"%V\"", &enc);
njs_int_t
-njs_string_decode_hex(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
+njs_string_decode_hex(njs_vm_t *vm, njs_value_t *retval, const njs_str_t *src)
{
size_t size, length;
njs_str_t dst;
length = njs_decode_hex_length(src, &size);
if (njs_slow_path(size == 0)) {
- vm->retval = njs_string_empty;
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
- dst.start = njs_string_alloc(vm, value, size, length);
+ dst.start = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(dst.start == NULL)) {
return NJS_ERROR;
}
njs_decode_hex(&dst, src);
if (njs_slow_path(dst.length != size)) {
- njs_string_truncate(value, dst.length, 0);
+ njs_string_truncate(retval, dst.length, 0);
}
return NJS_OK;
static njs_int_t
-njs_string_decode_base64_core(njs_vm_t *vm, njs_value_t *value,
+njs_string_decode_base64_core(njs_vm_t *vm, njs_value_t *retval,
const njs_str_t *src, njs_bool_t url)
{
size_t length;
length = njs_decode_base64_length_core(src, basis, &dst.length);
if (njs_slow_path(dst.length == 0)) {
- vm->retval = njs_string_empty;
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
- dst.start = njs_string_alloc(vm, value, dst.length, length);
+ dst.start = njs_string_alloc(vm, retval, dst.length, length);
if (njs_slow_path(dst.start == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_string_from_char_code(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t is_point)
+ njs_index_t is_point, njs_value_t *retval)
{
double num;
u_char *p, *start, *end;
length++;
}
- p = njs_string_alloc(vm, &vm->retval, size, length);
+ p = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_string_prototype_index_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t from, length;
njs_int_t ret;
from = njs_min(njs_max(from, 0), length);
- njs_set_number(&vm->retval, njs_string_index_of(&string, &s, from));
+ njs_set_number(retval, njs_string_index_of(&string, &s, from));
return NJS_OK;
}
static njs_int_t
njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
double pos;
int64_t index, start, length, search_length;
done:
- njs_set_number(&vm->retval, index);
+ njs_set_number(retval, index);
return NJS_OK;
}
static njs_int_t
njs_string_prototype_includes(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
int64_t index, length, search_length;
njs_int_t ret;
njs_value_t *value;
const u_char *p, *end;
- const njs_value_t *retval;
njs_string_prop_t string, search;
ret = njs_string_object_validate(vm, njs_argument(args, 0));
return ret;
}
- retval = &njs_value_true;
+ njs_set_boolean(retval, 1);
if (nargs > 1) {
value = njs_argument(args, 1);
}
if (search_length == 0) {
- goto done;
+ return NJS_OK;
}
length = njs_string_prop(&string, &args[0]);
while (p < end) {
if (memcmp(p, search.start, search.size) == 0) {
- goto done;
+ return NJS_OK;
}
p++;
}
}
- retval = &njs_value_false;
-
-done:
-
- vm->retval = *retval;
+ njs_set_boolean(retval, 0);
return NJS_OK;
}
static njs_int_t
njs_string_prototype_starts_or_ends_with(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t starts)
+ njs_uint_t nargs, njs_index_t starts, njs_value_t *retval)
{
int64_t index, length, search_length;
njs_int_t ret;
+ njs_bool_t yn;
njs_value_t *value, lvalue;
const u_char *p, *end;
- const njs_value_t *retval;
njs_string_prop_t string, search;
- retval = &njs_value_true;
+ yn = 1;
ret = njs_string_object_validate(vm, njs_argument(args, 0));
if (njs_slow_path(ret != NJS_OK)) {
small:
- retval = &njs_value_false;
+ yn = 0;
done:
- vm->retval = *retval;
+ njs_set_boolean(retval, yn);
return NJS_OK;
}
static njs_int_t
njs_string_prototype_to_lower_case(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
size_t size, length;
u_char *p;
if (njs_is_byte_or_ascii_string(&string)) {
- p = njs_string_alloc(vm, &vm->retval, string.size, string.length);
+ p = njs_string_alloc(vm, retval, string.size, string.length);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
length--;
}
- p = njs_string_alloc(vm, &vm->retval, size, string.length);
+ p = njs_string_alloc(vm, retval, size, string.length);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_string_prototype_to_upper_case(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
size_t size, length;
u_char *p;
if (njs_is_byte_or_ascii_string(&string)) {
- p = njs_string_alloc(vm, &vm->retval, string.size, string.length);
+ p = njs_string_alloc(vm, retval, string.size, string.length);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
length--;
}
- p = njs_string_alloc(vm, &vm->retval, size, string.length);
+ p = njs_string_alloc(vm, retval, size, string.length);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_string_prototype_trim(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t mode)
+ njs_index_t mode, njs_value_t *retval)
{
uint32_t trim;
njs_int_t ret;
trim = njs_string_trim(value, &string, mode);
if (trim == 0) {
- njs_value_assign(&vm->retval, value);
+ njs_value_assign(retval, value);
return NJS_OK;
}
if (string.size == 0) {
- njs_value_assign(&vm->retval, &njs_string_empty);
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
- return njs_string_new(vm, &vm->retval, string.start, string.size,
+ return njs_string_new(vm, retval, string.start, string.size,
string.length);
}
static njs_int_t
njs_string_prototype_repeat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *p;
int64_t n, max;
(void) njs_string_prop(&string, this);
if (njs_slow_path(n == 0 || string.size == 0)) {
- vm->retval = njs_string_empty;
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
size = string.size * n;
length = string.length * n;
- p = njs_string_alloc(vm, &vm->retval, size, length);
+ p = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_string_prototype_pad(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t pad_start)
+ njs_index_t pad_start, njs_value_t *retval)
{
u_char *p, *start;
size_t padding, trunc, new_size;
}
if (new_length <= length) {
- vm->retval = args[0];
+ njs_value_assign(retval, njs_argument(args, 0));
return NJS_OK;
}
pad_length = njs_string_prop(&pad_string, pad);
if (pad_string.size == 0) {
- vm->retval = args[0];
+ njs_value_assign(retval, njs_argument(args, 0));
return NJS_OK;
}
new_size = string.size + padding;
- start = njs_string_alloc(vm, &vm->retval, new_size, new_length);
+ start = njs_string_alloc(vm, retval, new_size, new_length);
if (njs_slow_path(start == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_string_prototype_search(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
size_t c;
njs_int_t ret, index;
done:
- njs_set_number(&vm->retval, index);
+ njs_set_number(retval, index);
return NJS_OK;
}
static njs_int_t
njs_string_prototype_match(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_str_t string;
njs_int_t ret;
pattern = njs_regexp_pattern(&args[1]);
if (pattern->global) {
- return njs_string_match_multiple(vm, args, pattern);
+ return njs_string_match_multiple(vm, args, pattern, retval);
}
/*
match:
- return njs_regexp_prototype_exec(vm, arguments, nargs, unused);
+ return njs_regexp_prototype_exec(vm, arguments, nargs, unused, retval);
}
static njs_int_t
njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args,
- njs_regexp_pattern_t *pattern)
+ njs_regexp_pattern_t *pattern, njs_value_t *retval)
{
size_t c0, c1;
int32_t size, length;
njs_string_prop_t string;
njs_set_number(&args[1].data.u.regexp->last_index, 0);
- vm->retval = njs_value_null;
+ njs_set_null(retval);
(void) njs_string_prop(&string, &args[0]);
} while (p <= end);
- njs_set_array(&vm->retval, array);
+ njs_set_array(retval, array);
}
return NJS_OK;
static njs_int_t
njs_string_prototype_split(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
size_t size;
uint32_t limit;
arguments[1] = *value;
return njs_function_call(vm, njs_function(&splitter), separator,
- arguments, 2, &vm->retval);
+ arguments, 2, retval);
}
}
done:
- njs_set_array(&vm->retval, array);
+ njs_set_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t replaceAll)
+ njs_index_t replaceAll, njs_value_t *retval)
{
u_char *r;
size_t length, size, increment, end_of_last_match;
njs_chb_t chain;
njs_bool_t is_byte_or_ascii_string;
njs_value_t *this, *search, *replace;
- njs_value_t search_lvalue, replace_lvalue, replacer, retval,
+ njs_value_t search_lvalue, replace_lvalue, replacer, value,
arguments[3];
const u_char *p, *p_start;
njs_function_t *func_replace;
njs_regexp_prototype_symbol_replace)
{
ret = njs_value_property(vm, search,
- njs_value_arg(&string_flags), &retval);
+ njs_value_arg(&string_flags), &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return NJS_ERROR;
}
- ret = njs_value_to_string(vm, &retval, &retval);
+ ret = njs_value_to_string(vm, &value, &value);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- njs_string_get(&retval, &str);
+ njs_string_get(&value, &str);
if (njs_strlchr(str.start, str.start + str.length, 'g')
== NULL)
}
return njs_function_call(vm, njs_function(&replacer), search,
- arguments, 2, &vm->retval);
+ arguments, 2, retval);
}
}
pos = njs_string_index_of(&string, &s, 0);
if (pos < 0) {
- njs_value_assign(&vm->retval, this);
+ njs_value_assign(retval, this);
return NJS_OK;
}
if (func_replace == NULL) {
ret = njs_string_get_substitution(vm, search, this, pos, NULL, 0,
- NULL, replace, &retval);
+ NULL, replace, &value);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
ret = njs_function_call(vm, func_replace,
njs_value_arg(&njs_value_undefined),
- arguments, 3, &retval);
+ arguments, 3, &value);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- ret = njs_value_to_string(vm, &retval, &retval);
+ ret = njs_value_to_string(vm, &value, &value);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
p = njs_string_offset(&string, pos);
- (void) njs_string_prop(&ret_string, &retval);
+ (void) njs_string_prop(&ret_string, &value);
size = string.size + ret_string.size - s.size;
length = string.length + ret_string.length - s.length;
length = 0;
}
- r = njs_string_alloc(vm, &vm->retval, size, length);
+ r = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(r == NULL)) {
return NJS_ERROR;
}
do {
if (func_replace == NULL) {
ret = njs_string_get_substitution(vm, search, this, pos, NULL, 0,
- NULL, replace, &retval);
+ NULL, replace, &value);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
ret = njs_function_call(vm, func_replace,
njs_value_arg(&njs_value_undefined),
- arguments, 3, &retval);
+ arguments, 3, &value);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- ret = njs_value_to_string(vm, &retval, &retval);
+ ret = njs_value_to_string(vm, &value, &value);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
pos);
}
- (void) njs_string_prop(&ret_string, &retval);
+ (void) njs_string_prop(&ret_string, &value);
njs_chb_append(&chain, p_start, p - p_start);
njs_chb_append(&chain, ret_string.start, ret_string.size);
njs_chb_append(&chain, p_start, string.start + string.size - p_start);
- ret = njs_string_create_chb(vm, &vm->retval, &chain);
+ ret = njs_string_create_chb(vm, retval, &chain);
if (njs_slow_path(ret != NJS_OK)) {
ret = NJS_ERROR;
goto exception;
static njs_int_t
njs_string_prototype_iterator_obj(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t kind)
+ njs_uint_t nargs, njs_index_t kind, njs_value_t *retval)
{
njs_int_t ret;
njs_value_t *this;
return ret;
}
- return njs_array_iterator_create(vm, this, &vm->retval, kind);
+ return njs_array_iterator_create(vm, this, retval, kind);
}
njs_int_t
njs_string_encode_uri(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t component)
+ njs_index_t component, njs_value_t *retval)
{
u_char byte, *dst;
uint64_t size;
};
if (nargs < 2) {
- vm->retval = njs_string_undefined;
+ njs_value_assign(retval, &njs_string_undefined);
return NJS_OK;
}
}
if (size == 0) {
- /* GC: retain src. */
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
- dst = njs_string_alloc(vm, &vm->retval, size, size);
+ dst = njs_string_alloc(vm, retval, size, size);
if (njs_slow_path(dst == NULL)) {
return NJS_ERROR;
}
njs_int_t
njs_string_decode_uri(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t component)
+ njs_index_t component, njs_value_t *retval)
{
u_char *dst;
int64_t size, length;
};
if (nargs < 2) {
- vm->retval = njs_string_undefined;
+ njs_value_assign(retval, &njs_string_undefined);
return NJS_OK;
}
}
if (size == 0) {
- /* GC: retain src. */
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
- dst = njs_string_alloc(vm, &vm->retval, size, length);
+ dst = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(dst == NULL)) {
return NJS_ERROR;
}
njs_int_t
njs_string_btoa(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char *dst;
size_t len, length;
length = njs_base64_encoded_length(len);
- dst = njs_string_alloc(vm, &vm->retval, length, length);
+ dst = njs_string_alloc(vm, retval, length, length);
if (njs_slow_path(dst == NULL)) {
return NJS_ERROR;
}
njs_int_t
njs_string_atob(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
size_t i, n, len, pad;
u_char *dst, *tmp, *p;
}
if (size == 0) {
- njs_value_assign(&vm->retval, &njs_string_empty);
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
- dst = njs_string_alloc(vm, &vm->retval, size, len);
+ dst = njs_string_alloc(vm, retval, size, len);
if (njs_slow_path(dst == NULL)) {
return NJS_ERROR;
}
void njs_string_utf8_offset_map_init(const u_char *start, size_t size);
double njs_string_to_index(const njs_value_t *value);
njs_int_t njs_string_encode_uri(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t component);
+ njs_uint_t nargs, njs_index_t component, njs_value_t *retval);
njs_int_t njs_string_decode_uri(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t component);
+ njs_uint_t nargs, njs_index_t component, njs_value_t *retval);
njs_int_t njs_string_btoa(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused);
+ njs_index_t unused, njs_value_t *retval);
njs_int_t njs_string_atob(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused);
+ njs_index_t unused, njs_value_t *retval);
njs_int_t njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_int_t njs_string_split_part_add(njs_vm_t *vm, njs_array_t *array,
njs_utf8_t utf8, const u_char *start, size_t size);
njs_int_t njs_string_get_substitution(njs_vm_t *vm, njs_value_t *matched,
static njs_int_t
njs_symbol_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint64_t key;
njs_int_t ret;
}
njs_value_assign(name, value);
- njs_set_symbol(&vm->retval, key, name);
+ njs_set_symbol(retval, key, name);
return NJS_OK;
}
static njs_int_t
njs_symbol_for(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint64_t key;
njs_int_t ret;
if (njs_is_string(&node->name)
&& njs_string_cmp(value, &node->name) == 0)
{
- njs_set_symbol(&vm->retval, node->key, &node->name);
+ njs_set_symbol(retval, node->key, &node->name);
return NJS_OK;
}
njs_rbtree_insert(&vm->global_symbols, &node->node);
- njs_set_symbol(&vm->retval, key, &node->name);
+ njs_set_symbol(retval, key, &node->name);
return NJS_OK;
}
static njs_int_t
njs_symbol_key_for(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
njs_rb_symbol_node_t query, *node;
node = (njs_rb_symbol_node_t *) njs_rbtree_find(&vm->global_symbols,
&query.node);
- njs_value_assign(&vm->retval,
+ njs_value_assign(retval,
node != NULL ? &node->name : &njs_value_undefined);
return NJS_OK;
static njs_int_t
njs_symbol_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_value_t *value;
}
}
- vm->retval = *value;
+ njs_value_assign(retval, value);
return NJS_OK;
}
static njs_int_t
njs_symbol_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
- ret = njs_symbol_prototype_value_of(vm, args, nargs, unused);
+ ret = njs_symbol_prototype_value_of(vm, args, nargs, unused, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- return njs_symbol_descriptive_string(vm, &vm->retval, &vm->retval);
+ return njs_symbol_descriptive_string(vm, retval, retval);
}
static njs_int_t
njs_symbol_prototype_description(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
- ret = njs_symbol_prototype_value_of(vm, args, nargs, unused);
+ ret = njs_symbol_prototype_value_of(vm, args, nargs, unused, retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
- njs_value_assign(&vm->retval, njs_symbol_description(&vm->retval));
+ njs_value_assign(retval, njs_symbol_description(retval));
return NJS_OK;
}
static njs_int_t
njs_set_timer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused, njs_bool_t immediate)
+ njs_index_t unused, njs_bool_t immediate, njs_value_t *retval)
{
njs_uint_t n;
uint64_t delay;
}
if (njs_add_event(vm, event) == NJS_OK) {
- njs_set_number(&vm->retval, vm->event_id - 1);
+ njs_set_number(retval, vm->event_id - 1);
}
return NJS_OK;
njs_int_t
njs_set_timeout(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- return njs_set_timer(vm, args, nargs, unused, 0);
+ return njs_set_timer(vm, args, nargs, unused, 0, retval);
}
njs_int_t
njs_set_immediate(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
- return njs_set_timer(vm, args, nargs, unused, 1);
+ return njs_set_timer(vm, args, nargs, unused, 1, retval);
}
njs_int_t
njs_clear_timeout(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
u_char buf[16], *p;
njs_int_t ret;
njs_lvlhsh_query_t lhq;
if (njs_fast_path(nargs < 2) || !njs_is_number(&args[1])) {
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
njs_del_event(vm, event, NJS_EVENT_RELEASE | NJS_EVENT_DELETE);
}
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
njs_int_t njs_set_timeout(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_int_t njs_set_immediate(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
njs_int_t njs_clear_timeout(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
#endif /* _NJS_TIMER_H_INCLUDED_ */
static njs_int_t
njs_typed_array_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t magic)
+ njs_index_t magic, njs_value_t *retval)
{
njs_typed_array_t *array;
return NJS_ERROR;
}
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_typed_array_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double num;
uint32_t length, i;
length = nargs - 1;
njs_set_number(&argument, length);
- ret = njs_typed_array_create(vm, this, &argument, 1, &vm->retval);
+ ret = njs_typed_array_create(vm, this, &argument, 1, retval);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- array = njs_typed_array(&vm->retval);
+ array = njs_typed_array(retval);
for (i = 0; i < length; i++) {
ret = njs_value_to_number(vm, njs_argument(args, i + 1), &num);
njs_typed_array_prop_set(vm, array, i, num);
}
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_typed_array_from(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
double num;
int64_t length, i;
njs_int_t ret;
njs_value_t *this, *source, *mapfn;
- njs_value_t arguments[3], retval;
+ njs_value_t arguments[3], value;
njs_function_t *function;
njs_typed_array_t *array;
}
njs_set_number(&arguments[0], length);
- ret = njs_typed_array_create(vm, this, arguments, 1, &vm->retval);
+ ret = njs_typed_array_create(vm, this, arguments, 1, retval);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- array = njs_typed_array(&vm->retval);
+ array = njs_typed_array(retval);
arguments[0] = *njs_arg(args, nargs, 3);
for (i = 0; i < length; i++) {
- ret = njs_value_property_i64(vm, source, i, &retval);
+ ret = njs_value_property_i64(vm, source, i, &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return NJS_ERROR;
}
if (function != NULL) {
- arguments[1] = retval;
+ njs_value_assign(&arguments[1], &value);
njs_set_number(&arguments[2], i);
- ret = njs_function_apply(vm, function, arguments, 3, &retval);
+ ret = njs_function_apply(vm, function, arguments, 3, &value);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
}
- ret = njs_value_to_number(vm, &retval, &num);
+ ret = njs_value_to_number(vm, &value, &num);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
njs_typed_array_prop_set(vm, array, i, num);
}
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_typed_array_get_this(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- vm->retval = args[0];
+ njs_value_assign(retval, njs_argument(args, 0));
return NJS_OK;
}
static njs_int_t
njs_typed_array_get_string_tag(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_value_t *this;
this = njs_argument(args, 0);
if (!njs_is_typed_array(this)) {
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
- vm->retval = *tags[njs_typed_array_index(njs_typed_array(this)->type)];
+ njs_value_assign(retval,
+ tags[njs_typed_array_index(njs_typed_array(this)->type)]);
return NJS_OK;
}
static njs_int_t
njs_typed_array_prototype_length(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
uint32_t length;
njs_value_t *this;
length = 0;
}
- njs_set_number(&vm->retval, length);
+ njs_set_number(retval, length);
return NJS_OK;
}
static njs_int_t
njs_typed_array_prototype_buffer(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_value_t *this;
njs_typed_array_t *array;
array = njs_typed_array(this);
- njs_set_array_buffer(&vm->retval, njs_typed_array_buffer(array));
+ njs_set_array_buffer(retval, njs_typed_array_buffer(array));
return NJS_OK;
}
static njs_int_t
njs_typed_array_prototype_byte_length(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
size_t byte_length;
njs_value_t *this;
byte_length = 0;
}
- njs_set_number(&vm->retval, byte_length);
+ njs_set_number(retval, byte_length);
return NJS_OK;
}
static njs_int_t
njs_typed_array_prototype_byte_offset(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
size_t byte_offset;
njs_value_t *this;
byte_offset = 0;
}
- njs_set_number(&vm->retval, byte_offset);
+ njs_set_number(retval, byte_offset);
return NJS_OK;
}
static njs_int_t
njs_typed_array_prototype_set(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
double num;
int64_t i, length, src_length, offset;
}
}
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
static njs_int_t
njs_typed_array_prototype_fill(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
float f32;
int8_t i8;
return NJS_ERROR;
}
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
offset = array->offset;
njs_int_t
njs_typed_array_prototype_slice(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t copy)
+ njs_uint_t nargs, njs_index_t copy, njs_value_t *retval)
{
int64_t start, end, count, offset;
uint32_t i, element_size, length;
ret = njs_typed_array_species_create(vm, this,
njs_value_arg(arguments), 1,
- &vm->retval);
+ retval);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
return NJS_ERROR;
}
- new_array = njs_typed_array(&vm->retval);
+ new_array = njs_typed_array(retval);
new_buffer = njs_typed_array_buffer(new_array);
element_size = njs_typed_array_element_size(array->type);
njs_set_number(&arguments[2], njs_max(end - start, 0));
return njs_typed_array_species_create(vm, this, njs_value_arg(arguments), 3,
- &vm->retval);
+ retval);
}
static njs_int_t
njs_typed_array_prototype_copy_within(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
int64_t length, to, from, final, count;
uint32_t element_size;
final = (final < 0) ? njs_max(final + length, 0) : njs_min(final, length);
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
count = njs_min(final - from, length - to);
static njs_int_t
njs_typed_array_prototype_iterator(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t type)
+ njs_uint_t nargs, njs_index_t type, njs_value_t *retval)
{
double val;
int64_t i, length;
njs_int_t ret;
njs_arr_t results;
njs_value_t *this, *this_arg, *r;
- njs_value_t arguments[4], retval;
+ njs_value_t arguments[4], value;
njs_function_t *function;
njs_typed_array_t *array, *dst;
njs_array_buffer_t *buffer;
case NJS_ARRAY_MAP:
njs_set_number(&arguments[0], length);
ret = njs_typed_array_species_create(vm, this, njs_value_arg(arguments),
- 1, &retval);
+ 1, &value);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- dst = njs_typed_array(&retval);
+ dst = njs_typed_array(&value);
break;
case NJS_ARRAY_FILTER:
njs_set_number(&arguments[2], i);
njs_set_typed_array(&arguments[3], array);
- ret = njs_function_apply(vm, function, arguments, 4, &vm->retval);
+ ret = njs_function_apply(vm, function, arguments, 4, retval);
if (njs_slow_path(ret != NJS_OK)) {
goto exception;
}
switch (type) {
case NJS_ARRAY_EVERY:
- if (!njs_is_true(&vm->retval)) {
- vm->retval = njs_value_false;
+ if (!njs_is_true(retval)) {
+ njs_set_boolean(retval, 0);
goto done;
}
case NJS_ARRAY_SOME:
case NJS_ARRAY_FIND:
case NJS_ARRAY_FIND_INDEX:
- if (!njs_is_true(&vm->retval)) {
+ if (!njs_is_true(retval)) {
continue;
}
switch (type) {
case NJS_ARRAY_SOME:
- vm->retval = njs_value_true;
+ njs_set_boolean(retval, 1);
break;
case NJS_ARRAY_FIND:
- njs_set_number(&vm->retval, val);
+ njs_set_number(retval, val);
break;
default:
- njs_set_number(&vm->retval, i);
+ njs_set_number(retval, i);
break;
}
goto done;
case NJS_ARRAY_MAP:
- ret = njs_typed_array_set_value(vm, dst, i, &vm->retval);
+ ret = njs_typed_array_set_value(vm, dst, i, retval);
if (njs_slow_path(ret != NJS_OK)) {
goto exception;
}
default:
/* NJS_ARRAY_FILTER. */
- if (!njs_is_true(&vm->retval)) {
+ if (!njs_is_true(retval)) {
continue;
}
switch (type) {
case NJS_ARRAY_EVERY:
- vm->retval = njs_value_true;
+ njs_set_boolean(retval, 1);
break;
case NJS_ARRAY_SOME:
- vm->retval = njs_value_false;
+ njs_set_boolean(retval, 0);
break;
case NJS_ARRAY_FOR_EACH:
case NJS_ARRAY_FIND:
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
break;
case NJS_ARRAY_FIND_INDEX:
- njs_set_number(&vm->retval, -1);
+ njs_set_number(retval, -1);
break;
case NJS_ARRAY_MAP:
njs_set_number(&arguments[0], results.items);
ret = njs_typed_array_species_create(vm, this,
njs_value_arg(arguments),
- 1, &retval);
+ 1, &value);
if (njs_slow_path(ret != NJS_OK)) {
goto exception;
}
- dst = njs_typed_array(&retval);
+ dst = njs_typed_array(&value);
i = 0;
}
}
- njs_set_typed_array(&vm->retval, dst);
+ njs_set_typed_array(retval, dst);
break;
}
static njs_int_t
njs_typed_array_prototype_index_of(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t type)
+ njs_uint_t nargs, njs_index_t type, njs_value_t *retval)
{
double v;
int64_t i, i64, from, to, index, increment, offset, length;
/* Default values. */
if (type & 1) {
- njs_set_boolean(&vm->retval, index != -1);
+ njs_set_boolean(retval, index != -1);
} else {
- njs_set_number(&vm->retval, index);
+ njs_set_number(retval, index);
}
return NJS_OK;
static njs_int_t
njs_typed_array_prototype_reduce(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t right)
+ njs_uint_t nargs, njs_index_t right, njs_value_t *retval)
{
int64_t i, from, to, increment, length;
njs_int_t ret;
}
}
- vm->retval = accumulator;
+ njs_value_assign(retval, &accumulator);
return NJS_OK;
}
static njs_int_t
njs_typed_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
double *f64;
uint8_t *u8;
}
}
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_typed_array_prototype_sort(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
u_char *base, *orig;
int64_t length;
return NJS_ERROR;
}
- njs_set_typed_array(&vm->retval, array);
+ njs_set_typed_array(retval, array);
return NJS_OK;
}
static njs_int_t
njs_typed_array_prototype_join(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
u_char *p;
size_t size, length, arr_length;
}
if (arr_length == 0) {
- vm->retval = njs_string_empty;
+ njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
length = njs_typed_array_to_chain(vm, &chain, array, separator);
size = njs_chb_size(&chain);
- p = njs_string_alloc(vm, &vm->retval, size, length);
+ p = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(p == NULL)) {
return NJS_ERROR;
}
static njs_int_t
njs_typed_array_prototype_iterator_obj(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t kind)
+ njs_uint_t nargs, njs_index_t kind, njs_value_t *retval)
{
njs_value_t *this;
njs_typed_array_t *array;
return NJS_ERROR;
}
- return njs_array_iterator_create(vm, this, &vm->retval, kind);
+ return njs_array_iterator_create(vm, this, retval, kind);
}
static njs_int_t
njs_typed_array_constructor_intrinsic(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_type_error(vm, "Abstract class TypedArray not directly constructable");
static njs_int_t
njs_data_view_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
uint64_t size, offset;
njs_int_t ret;
view->object.type = NJS_DATA_VIEW;
view->object.extensible = 1;
- njs_set_data_view(&vm->retval, view);
+ njs_set_data_view(retval, view);
return NJS_OK;
static njs_int_t
njs_data_view_prototype_get(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t type)
+ njs_uint_t nargs, njs_index_t type, njs_value_t *retval)
{
double v;
uint32_t u32;
v = conv_f64.f;
}
- njs_set_number(&vm->retval, v);
+ njs_set_number(retval, v);
return NJS_OK;
}
static njs_int_t
njs_data_view_prototype_set(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t type)
+ njs_uint_t nargs, njs_index_t type, njs_value_t *retval)
{
double v;
uint8_t *u8;
njs_set_u64(u8, conv_f64.u);
}
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
njs_int_t njs_typed_array_to_chain(njs_vm_t *vm, njs_chb_t *chain,
njs_typed_array_t *array, njs_value_t *sep);
njs_int_t njs_typed_array_prototype_slice(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t copy);
+ njs_uint_t nargs, njs_index_t copy, njs_value_t *retval);
njs_inline unsigned
njs_typed_array_element_size(njs_object_type_t type)
uint32_t index;
njs_int_t ret;
njs_array_t *array;
+ njs_value_t retval;
njs_object_prop_t *prop;
njs_typed_array_t *tarray;
njs_property_query_t pq;
} else {
if (njs_prop_setter(prop) != NULL) {
return njs_function_call(vm, njs_prop_setter(prop),
- value, setval, 1, &vm->retval);
+ value, setval, 1, &retval);
}
njs_key_string_get(vm, &pq.key, &pq.lhq.key);
}
if (prop->type == NJS_PROPERTY_HANDLER) {
- ret = njs_prop_handler(prop)(vm, prop, value, setval, &vm->retval);
+ ret = njs_prop_handler(prop)(vm, prop, value, setval, &retval);
if (njs_slow_path(ret != NJS_DECLINED)) {
return ret;
}
#include <njs_main.h>
-static njs_int_t njs_vm_init(njs_vm_t *vm);
static njs_int_t njs_vm_handle_events(njs_vm_t *vm);
vm->trace.size = 2048;
vm->trace.data = vm;
- njs_set_undefined(&vm->retval);
-
if (options->init) {
ret = njs_vm_init(vm);
if (njs_slow_path(ret != NJS_OK)) {
code = njs_generate_scope(vm, &generator, scope, &njs_entry_main);
if (njs_slow_path(code == NULL)) {
- if (!njs_is_error(&vm->retval)) {
+ if (!njs_is_error(&vm->exception)) {
njs_internal_error(vm, "njs_generate_scope() failed");
}
}
-static njs_int_t
+njs_int_t
njs_vm_init(njs_vm_t *vm)
{
njs_int_t ret;
njs_vm_call(njs_vm_t *vm, njs_function_t *function, const njs_value_t *args,
njs_uint_t nargs)
{
- return njs_vm_invoke(vm, function, args, nargs, &vm->retval);
+ njs_value_t unused;
+
+ return njs_vm_invoke(vm, function, args, nargs, &unused);
}
njs_int_t
-njs_vm_start(njs_vm_t *vm)
+njs_vm_start(njs_vm_t *vm, njs_value_t *retval)
{
njs_int_t ret;
- ret = njs_vmcode_interpreter(vm, vm->start, NULL, NULL);
+ ret = njs_vmcode_interpreter(vm, vm->start, retval, NULL, NULL);
return (ret == NJS_ERROR) ? NJS_ERROR : NJS_OK;
}
}
-njs_value_t *
-njs_vm_retval(njs_vm_t *vm)
+njs_value_t
+njs_vm_exception(njs_vm_t *vm)
+{
+ njs_value_t value;
+
+ value = vm->exception;
+ njs_set_invalid(&vm->exception);
+
+ return value;
+}
+
+
+void
+njs_vm_exception_get(njs_vm_t *vm, njs_value_t *retval)
{
- return &vm->retval;
+ *retval = njs_vm_exception(vm);
}
void
-njs_vm_retval_set(njs_vm_t *vm, const njs_value_t *value)
+njs_vm_throw(njs_vm_t *vm, const njs_value_t *value)
{
- vm->retval = *value;
+ vm->exception = *value;
+}
+
+
+void
+njs_vm_error(njs_vm_t *vm, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ njs_throw_error_va(vm, NJS_OBJ_TYPE_ERROR, fmt, args);
+ va_end(args);
}
}
ret = njs_value_property(vm, &value, &key, njs_value_arg(retval));
- if (njs_slow_path(ret != NJS_OK)) {
+ if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
njs_vm_prop_name(njs_vm_t *vm, njs_object_prop_t *prop, njs_str_t *dst)
{
if (njs_slow_path(!njs_is_string(&prop->name))) {
- njs_type_error(vm, "property name is not a string");
return NJS_ERROR;
}
}
-njs_noinline void
-njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value, const char *fmt, ...)
-{
- va_list args;
- u_char buf[NJS_MAX_ERROR_STR], *p;
-
- p = buf;
-
- if (fmt != NULL) {
- va_start(args, fmt);
- p = njs_vsprintf(buf, buf + sizeof(buf), fmt, args);
- va_end(args);
- }
-
- njs_error_new(vm, value, NJS_OBJ_TYPE_ERROR, buf, p - buf);
-}
-
-
njs_noinline void
njs_vm_memory_error(njs_vm_t *vm)
{
- njs_memory_error_set(vm, &vm->retval);
+ njs_memory_error_set(vm, &vm->exception);
}
{
njs_int_t ret;
njs_uint_t exception;
+ njs_value_t value;
+
+ if (njs_slow_path(vm->top_frame == NULL)) {
+ /* An exception was thrown during compilation. */
+ njs_vm_init(vm);
+ }
+
+ if (njs_is_valid(&vm->exception)) {
+ value = njs_vm_exception(vm);
+ src = &value;
+ }
if (njs_slow_path(src->type == NJS_NUMBER
&& njs_number(src) == 0
/* value evaluation threw an exception. */
- src = &vm->retval;
+ *src = njs_vm_exception(vm);
goto again;
}
njs_int_t
-njs_vm_retval_string(njs_vm_t *vm, njs_str_t *dst)
+njs_vm_exception_string(njs_vm_t *vm, njs_str_t *dst)
{
- if (vm->top_frame == NULL) {
- /* An exception was thrown during compilation. */
-
- njs_vm_init(vm);
- }
-
- return njs_vm_value_string(vm, dst, &vm->retval);
-}
-
+ njs_value_t exception;
-njs_int_t
-njs_vm_retval_dump(njs_vm_t *vm, njs_str_t *dst, njs_uint_t indent)
-{
- if (vm->top_frame == NULL) {
- /* An exception was thrown during compilation. */
-
- njs_vm_init(vm);
- }
+ exception = njs_vm_exception(vm);
- return njs_vm_value_dump(vm, dst, &vm->retval, 0, 1);
+ return njs_vm_value_string(vm, dst, &exception);
}
struct njs_vm_s {
- /* njs_vm_t must be aligned to njs_value_t due to scratch value. */
- njs_value_t retval;
+ njs_value_t exception;
njs_arr_t *paths;
njs_arr_t *protos;
};
+njs_int_t njs_vm_init(njs_vm_t *vm);
+njs_value_t njs_vm_exception(njs_vm_t *vm);
void njs_vm_scopes_restore(njs_vm_t *vm, njs_native_frame_t *frame);
njs_int_t njs_builtin_objects_create(njs_vm_t *vm);
njs_array_t *array;
};
-static njs_jump_off_t njs_vmcode_object(njs_vm_t *vm);
-static njs_jump_off_t njs_vmcode_array(njs_vm_t *vm, u_char *pc);
-static njs_jump_off_t njs_vmcode_function(njs_vm_t *vm, u_char *pc);
+static njs_jump_off_t njs_vmcode_object(njs_vm_t *vm, njs_value_t *retval);
+static njs_jump_off_t njs_vmcode_array(njs_vm_t *vm, u_char *pc,
+ njs_value_t *retval);
+static njs_jump_off_t njs_vmcode_function(njs_vm_t *vm, u_char *pc,
+ njs_value_t *retval);
static njs_jump_off_t njs_vmcode_arguments(njs_vm_t *vm, u_char *pc);
-static njs_jump_off_t njs_vmcode_regexp(njs_vm_t *vm, u_char *pc);
+static njs_jump_off_t njs_vmcode_regexp(njs_vm_t *vm, u_char *pc,
+ njs_value_t *retval);
static njs_jump_off_t njs_vmcode_template_literal(njs_vm_t *vm,
njs_value_t *retval);
static njs_jump_off_t njs_vmcode_function_copy(njs_vm_t *vm, njs_value_t *value,
static njs_jump_off_t njs_vmcode_proto_init(njs_vm_t *vm, njs_value_t *value,
njs_value_t *key, njs_value_t *retval);
static njs_jump_off_t njs_vmcode_property_in(njs_vm_t *vm,
- njs_value_t *value, njs_value_t *key);
+ njs_value_t *value, njs_value_t *key, njs_value_t *retval);
static njs_jump_off_t njs_vmcode_property_foreach(njs_vm_t *vm,
- njs_value_t *object, njs_value_t *invld, u_char *pc);
+ njs_value_t *object, u_char *pc, njs_value_t *retval);
static njs_jump_off_t njs_vmcode_instance_of(njs_vm_t *vm, njs_value_t *object,
- njs_value_t *constructor);
+ njs_value_t *constructor, njs_value_t *retval);
static njs_jump_off_t njs_vmcode_typeof(njs_vm_t *vm, njs_value_t *value,
- njs_value_t *invld);
-static njs_jump_off_t njs_vmcode_debugger(njs_vm_t *vm);
+ njs_value_t *retval);
+static njs_jump_off_t njs_vmcode_debugger(njs_vm_t *vm, njs_value_t *retval);
-static njs_jump_off_t njs_vmcode_return(njs_vm_t *vm, njs_value_t *invld,
+static void njs_vmcode_return(njs_vm_t *vm, njs_value_t *dst,
njs_value_t *retval);
static njs_jump_off_t njs_vmcode_import(njs_vm_t *vm, njs_mod_t *module,
njs_value_t *retval);
-static njs_jump_off_t njs_vmcode_await(njs_vm_t *vm, njs_vmcode_await_t *await,
- njs_promise_capability_t *pcap, njs_async_ctx_t *actx);
+static njs_int_t njs_vmcode_await(njs_vm_t *vm, njs_vmcode_await_t *await,
+ njs_value_t *dst, njs_promise_capability_t *pcap, njs_async_ctx_t *actx);
static njs_jump_off_t njs_vmcode_try_start(njs_vm_t *vm, njs_value_t *value,
njs_value_t *offset, u_char *pc);
njs_value_t *offset);
static njs_jump_off_t njs_vmcode_try_end(njs_vm_t *vm, njs_value_t *invld,
njs_value_t *offset);
-static njs_jump_off_t njs_vmcode_finally(njs_vm_t *vm, njs_value_t *invld,
+static njs_jump_off_t njs_vmcode_finally(njs_vm_t *vm, njs_value_t *dst,
njs_value_t *retval, u_char *pc);
static void njs_vmcode_error(njs_vm_t *vm, u_char *pc);
static njs_int_t njs_throw_cannot_property(njs_vm_t *vm, njs_value_t *object,
njs_value_t *key, const char *what);
static njs_jump_off_t njs_string_concat(njs_vm_t *vm, njs_value_t *val1,
- njs_value_t *val2);
+ njs_value_t *val2, njs_value_t *retval);
static njs_jump_off_t njs_values_equal(njs_vm_t *vm, njs_value_t *val1,
njs_value_t *val2);
static njs_jump_off_t njs_primitive_values_compare(njs_vm_t *vm,
njs_int_t
-njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc, void *promise_cap,
- void *async_ctx)
+njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc, njs_value_t *rval,
+ void *promise_cap, void *async_ctx)
{
u_char *catch;
double num, exponent;
goto error;
}
- ret = njs_string_concat(vm, s1, s2);
+ ret = njs_string_concat(vm, s1, s2, &name);
if (njs_slow_path(ret == NJS_ERROR)) {
goto error;
}
- *retval = vm->retval;
+ njs_value_assign(retval, &name);
BREAK;
njs_vmcode_operand(vm, vmcode->operand3, value2);
njs_vmcode_operand(vm, vmcode->operand2, value1);
+ njs_vmcode_operand(vm, vmcode->operand1, retval);
- ret = njs_vmcode_property_in(vm, value1, value2);
-
+ ret = njs_vmcode_property_in(vm, value1, value2, retval);
if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
goto error;
}
- njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
-
BREAK;
CASE (NJS_VMCODE_PROPERTY_DELETE):
}
ret = njs_value_property_delete(vm, value1, value2, NULL, 1);
- if (njs_fast_path(ret != NJS_ERROR)) {
- vm->retval = njs_value_true;
-
- ret = sizeof(njs_vmcode_3addr_t);
- }
-
- if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
+ if (njs_slow_path(ret == NJS_ERROR)) {
goto error;
}
njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
+ njs_value_assign(retval, &njs_value_true);
+ ret = sizeof(njs_vmcode_3addr_t);
BREAK;
CASE (NJS_VMCODE_PROPERTY_FOREACH):
njs_vmcode_debug_opcode();
- value2 = (njs_value_t *) vmcode->operand1;
njs_vmcode_operand(vm, vmcode->operand2, value1);
+ njs_vmcode_operand(vm, vmcode->operand1, retval);
- ret = njs_vmcode_property_foreach(vm, value1, value2, pc);
-
+ ret = njs_vmcode_property_foreach(vm, value1, pc, retval);
if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
goto error;
}
- njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
-
BREAK;
CASE (NJS_VMCODE_STRICT_EQUAL):
CASE (NJS_VMCODE_OBJECT):
njs_vmcode_debug_opcode();
- ret = njs_vmcode_object(vm);
+ njs_vmcode_operand(vm, vmcode->operand1, retval);
+ ret = njs_vmcode_object(vm, retval);
if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
goto error;
}
- njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
-
BREAK;
CASE (NJS_VMCODE_ARRAY):
njs_vmcode_debug_opcode();
- ret = njs_vmcode_array(vm, pc);
+ njs_vmcode_operand(vm, vmcode->operand1, retval);
+ ret = njs_vmcode_array(vm, pc, retval);
if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
goto error;
}
- njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
-
BREAK;
CASE (NJS_VMCODE_FUNCTION):
njs_vmcode_debug_opcode();
- ret = njs_vmcode_function(vm, pc);
+ njs_vmcode_operand(vm, vmcode->operand1, retval);
+ ret = njs_vmcode_function(vm, pc, retval);
if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
goto error;
}
- njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
-
BREAK;
CASE (NJS_VMCODE_REGEXP):
njs_vmcode_debug_opcode();
- ret = njs_vmcode_regexp(vm, pc);
+ njs_vmcode_operand(vm, vmcode->operand1, retval);
+ ret = njs_vmcode_regexp(vm, pc, retval);
if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
goto error;
}
- njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
-
BREAK;
CASE (NJS_VMCODE_INSTANCE_OF):
njs_vmcode_operand(vm, vmcode->operand3, value2);
njs_vmcode_operand(vm, vmcode->operand2, value1);
+ njs_vmcode_operand(vm, vmcode->operand1, retval);
- ret = njs_vmcode_instance_of(vm, value1, value2);
-
+ ret = njs_vmcode_instance_of(vm, value1, value2, retval);
if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
goto error;
}
- njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
-
BREAK;
CASE (NJS_VMCODE_TYPEOF):
njs_vmcode_debug_opcode();
njs_vmcode_operand(vm, vmcode->operand2, value1);
+ njs_vmcode_operand(vm, vmcode->operand1, retval);
- ret = njs_vmcode_typeof(vm, value1, NULL);
-
+ ret = njs_vmcode_typeof(vm, value1, retval);
if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
goto error;
}
- njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
-
BREAK;
CASE (NJS_VMCODE_VOID):
njs_vmcode_debug_opcode();
- njs_set_undefined(&vm->retval);
+ njs_vmcode_operand(vm, vmcode->operand1, retval);
- ret = sizeof(njs_vmcode_2addr_t);
+ njs_set_undefined(retval);
- njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
+ ret = sizeof(njs_vmcode_2addr_t);
BREAK;
njs_vmcode_debug_opcode();
njs_vmcode_operand(vm, vmcode->operand2, value1);
+ njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, value1);
- vm->retval = njs_value_true;
+ njs_set_boolean(retval, 1);
ret = sizeof(njs_vmcode_2addr_t);
- njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
BREAK;
CASE (NJS_VMCODE_DEBUGGER):
njs_vmcode_debug_opcode();
- ret = njs_vmcode_debugger(vm);
-
njs_vmcode_operand(vm, vmcode->operand1, retval);
- njs_release(vm, retval);
- *retval = vm->retval;
+
+ ret = njs_vmcode_debugger(vm, retval);
BREAK;
njs_vmcode_debug_opcode();
njs_vmcode_operand(vm, vmcode->operand1, value2);
- vm->retval = *value2;
+ *rval = *value2;
njs_vmcode_debug(vm, pc, "EXIT STOP");
njs_vmcode_debug(vm, pc, "EXIT RETURN");
- return njs_vmcode_return(vm, NULL, value2);
+ njs_vmcode_return(vm, rval, value2);
+
+ return NJS_OK;
CASE (NJS_VMCODE_FUNCTION_COPY):
njs_vmcode_debug_opcode();
ret = njs_function_name_set(vm, njs_function(value2), value1, NULL);
if (njs_slow_path(ret == NJS_ERROR)) {
- return ret;
+ goto error;
}
ret = sizeof(njs_vmcode_2addr_t);
await = (njs_vmcode_await_t *) pc;
- ret = njs_vmcode_await(vm, await, promise_cap, async_ctx);
+ ret = njs_vmcode_await(vm, await, rval, promise_cap, async_ctx);
njs_vmcode_debug(vm, pc, "EXIT AWAIT");
value2 = (njs_value_t *) vmcode->operand1;
njs_vmcode_operand(vm, (njs_index_t) value2, value2);
- vm->retval = *value2;
+ njs_vm_throw(vm, value2);
goto error;
value2 = (njs_value_t *) vmcode->operand1;
njs_vmcode_operand(vm, vmcode->operand2, value1);
- *value1 = vm->retval;
+ *value1 = njs_vm_exception(vm);
if ((njs_jump_off_t) value2 == sizeof(njs_vmcode_catch_t)) {
ret = njs_vmcode_try_end(vm, value1, value2);
value2 = (njs_value_t *) vmcode->operand1;
- ret = njs_vmcode_finally(vm, NULL, value2, pc);
+ ret = njs_vmcode_finally(vm, rval, value2, pc);
switch (ret) {
case NJS_OK:
error:
- if (njs_is_error(&vm->retval)) {
+ if (njs_is_error(&vm->exception)) {
vm->active_frame->native.pc = pc;
- /* TODO: get rid of copying. */
-
- njs_value_assign(&dst, &vm->retval);
- (void) njs_error_stack_attach(vm, &dst);
- njs_value_assign(&vm->retval, &dst);
+ (void) njs_error_stack_attach(vm, vm->exception);
}
for ( ;; ) {
static njs_jump_off_t
-njs_vmcode_object(njs_vm_t *vm)
+njs_vmcode_object(njs_vm_t *vm, njs_value_t *retval)
{
njs_object_t *object;
object = njs_object_alloc(vm);
if (njs_fast_path(object != NULL)) {
- njs_set_object(&vm->retval, object);
+ njs_set_object(retval, object);
return sizeof(njs_vmcode_object_t);
}
static njs_jump_off_t
-njs_vmcode_array(njs_vm_t *vm, u_char *pc)
+njs_vmcode_array(njs_vm_t *vm, u_char *pc, njs_value_t *retval)
{
uint32_t length;
njs_array_t *array;
array->length = 0;
}
- njs_set_array(&vm->retval, array);
+ njs_set_array(retval, array);
return sizeof(njs_vmcode_array_t);
}
static njs_jump_off_t
-njs_vmcode_function(njs_vm_t *vm, u_char *pc)
+njs_vmcode_function(njs_vm_t *vm, u_char *pc, njs_value_t *retval)
{
njs_function_t *function;
njs_vmcode_function_t *code;
function->args_count = lambda->nargs - lambda->rest_parameters;
- njs_set_function(&vm->retval, function);
+ njs_set_function(retval, function);
return sizeof(njs_vmcode_function_t);
}
static njs_jump_off_t
-njs_vmcode_regexp(njs_vm_t *vm, u_char *pc)
+njs_vmcode_regexp(njs_vm_t *vm, u_char *pc, njs_value_t *retval)
{
njs_regexp_t *regexp;
njs_vmcode_regexp_t *code;
regexp = njs_regexp_alloc(vm, code->pattern);
if (njs_fast_path(regexp != NULL)) {
- njs_set_regexp(&vm->retval, regexp);
+ njs_set_regexp(retval, regexp);
return sizeof(njs_vmcode_regexp_t);
}
njs_value_t *init)
{
njs_object_t *obj;
+ njs_value_t retval;
njs_jump_off_t ret;
njs_object_prop_t *prop;
njs_lvlhsh_query_t lhq;
goto fail;
}
- ret = njs_prop_handler(prop)(vm, prop, value, init, &vm->retval);
+ ret = njs_prop_handler(prop)(vm, prop, value, init, &retval);
if (njs_slow_path(ret != NJS_OK)) {
goto fail;
}
static njs_jump_off_t
-njs_vmcode_property_in(njs_vm_t *vm, njs_value_t *value, njs_value_t *key)
+njs_vmcode_property_in(njs_vm_t *vm, njs_value_t *value, njs_value_t *key,
+ njs_value_t *retval)
{
njs_int_t ret;
njs_value_t primitive;
return ret;
}
- njs_set_boolean(&vm->retval, ret == NJS_OK);
+ njs_set_boolean(retval, ret == NJS_OK);
return sizeof(njs_vmcode_3addr_t);
}
static njs_jump_off_t
njs_vmcode_property_foreach(njs_vm_t *vm, njs_value_t *object,
- njs_value_t *invld, u_char *pc)
+ u_char *pc, njs_value_t *retval)
{
njs_property_next_t *next;
njs_vmcode_prop_foreach_t *code;
return NJS_ERROR;
}
- njs_set_data(&vm->retval, next, NJS_DATA_TAG_FOREACH_NEXT);
+ njs_set_data(retval, next, NJS_DATA_TAG_FOREACH_NEXT);
code = (njs_vmcode_prop_foreach_t *) pc;
static njs_jump_off_t
njs_vmcode_instance_of(njs_vm_t *vm, njs_value_t *object,
- njs_value_t *constructor)
+ njs_value_t *constructor, njs_value_t *retval)
{
- njs_value_t value, bound;
- njs_object_t *prototype, *proto;
- njs_function_t *function;
- njs_jump_off_t ret;
- const njs_value_t *retval;
+ njs_value_t value, bound;
+ njs_object_t *prototype, *proto;
+ njs_function_t *function;
+ njs_jump_off_t ret;
static const njs_value_t prototype_string = njs_string("prototype");
constructor = &bound;
}
- retval = &njs_value_false;
-
if (njs_is_object(object)) {
ret = njs_value_property(vm, constructor,
njs_value_arg(&prototype_string), &value);
proto = proto->__proto__;
if (proto == prototype) {
- retval = &njs_value_true;
- break;
+ njs_value_assign(retval, &njs_value_true);
+ return sizeof(njs_vmcode_instance_of_t);
}
} while (proto != NULL);
}
}
- vm->retval = *retval;
+ njs_value_assign(retval, &njs_value_false);
return sizeof(njs_vmcode_instance_of_t);
}
static njs_jump_off_t
-njs_vmcode_typeof(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld)
+njs_vmcode_typeof(njs_vm_t *vm, njs_value_t *value, njs_value_t *retval)
{
/* ECMAScript 5.1: null, array and regexp are objects. */
&njs_string_object,
};
- vm->retval = *types[value->type];
+ njs_value_assign(retval, types[value->type]);
return sizeof(njs_vmcode_2addr_t);
}
static njs_jump_off_t
-njs_vmcode_debugger(njs_vm_t *vm)
+njs_vmcode_debugger(njs_vm_t *vm, njs_value_t *retval)
{
/*
* HOW TO DEBUG JS CODE:
* 3) in gdb: p *njs_scope_value_get(vm, <index as a hex literal>)
**/
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return sizeof(njs_vmcode_debugger_t);
}
static njs_jump_off_t
-njs_string_concat(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
+njs_string_concat(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2,
+ njs_value_t *retval)
{
u_char *start;
size_t size, length;
size = string1.size + string2.size;
- start = njs_string_alloc(vm, &vm->retval, size, length);
-
+ start = njs_string_alloc(vm, retval, size, length);
if (njs_slow_path(start == NULL)) {
return NJS_ERROR;
}
}
-static njs_jump_off_t
-njs_vmcode_return(njs_vm_t *vm, njs_value_t *invld, njs_value_t *retval)
+static void
+njs_vmcode_return(njs_vm_t *vm, njs_value_t *dst, njs_value_t *retval)
{
njs_frame_t *frame;
njs_vm_scopes_restore(vm, &frame->native);
- *frame->native.retval = *retval;
+ *dst = *retval;
njs_function_frame_free(vm, &frame->native);
-
- return NJS_OK;
}
}
-static njs_jump_off_t
+static njs_int_t
njs_vmcode_await(njs_vm_t *vm, njs_vmcode_await_t *await,
- njs_promise_capability_t *pcap, njs_async_ctx_t *ctx)
+ njs_value_t *dst, njs_promise_capability_t *pcap, njs_async_ctx_t *ctx)
{
size_t size;
njs_int_t ret;
njs_frame_t *frame;
- njs_value_t ctor, val, on_fulfilled, on_rejected, *value;
+ njs_value_t ctor, val, on_fulfilled, on_rejected, *value, retval;
njs_promise_t *promise;
njs_function_t *fulfilled, *rejected;
njs_native_frame_t *active;
njs_set_function(&on_fulfilled, fulfilled);
njs_set_function(&on_rejected, rejected);
- ret = njs_promise_perform_then(vm, &val, &on_fulfilled, &on_rejected, NULL);
+ ret = njs_promise_perform_then(vm, &val, &on_fulfilled, &on_rejected, NULL,
+ &retval);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- (void) njs_vmcode_return(vm, NULL, &vm->retval);
+ njs_vmcode_return(vm, dst, &retval);
return NJS_AGAIN;
}
*/
static njs_jump_off_t
-njs_vmcode_finally(njs_vm_t *vm, njs_value_t *invld, njs_value_t *retval,
+njs_vmcode_finally(njs_vm_t *vm, njs_value_t *dst, njs_value_t *retval,
u_char *pc)
{
njs_value_t *exception_value, *exit_value;
exception_value = njs_scope_value(vm, (njs_index_t) retval);
if (njs_is_valid(exception_value)) {
- vm->retval = *exception_value;
+ njs_vm_throw(vm, exception_value);
return NJS_ERROR;
}
*/
if (njs_is_valid(exit_value)) {
- return njs_vmcode_return(vm, NULL, exit_value);
+ njs_vmcode_return(vm, dst, exit_value);
+
+ return NJS_OK;
} else if (njs_number(exit_value) != 0) {
offset = (njs_number(exit_value) > 0) ? finally->break_offset
njs_reference_error(vm, "\"%V\" is not defined", &err->u.name);
} else {
- njs_error_fmt_new(vm, &vm->retval, err->type, "%V", &err->u.message);
+ njs_throw_error(vm, err->type, "%V", &err->u.message);
}
}
} njs_vmcode_await_t;
-njs_int_t njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc,
+njs_int_t njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc, njs_value_t *retval,
void *promise_cap, void *async_ctx);
njs_object_t *njs_function_new_object(njs_vm_t *vm, njs_value_t *constructor);
njs_benchmark_test(njs_vm_t *parent, njs_opts_t *opts, njs_value_t *report,
njs_benchmark_test_t *test)
{
- u_char *start;
- njs_vm_t *vm, *nvm;
- uint64_t ns;
- njs_int_t ret, proto_id;
- njs_str_t s, *expected;
- njs_uint_t i, n;
- njs_bool_t success;
- njs_value_t *result, name, usec, times;
- njs_vm_opt_t options;
+ u_char *start;
+ njs_vm_t *vm, *nvm;
+ uint64_t ns;
+ njs_int_t ret, proto_id;
+ njs_str_t s, *expected;
+ njs_uint_t i, n;
+ njs_bool_t success;
+ njs_value_t *result, retval, name, usec, times;
+ njs_vm_opt_t options;
static const njs_value_t name_key = njs_string("name");
static const njs_value_t usec_key = njs_string("usec");
goto done;
}
- (void) njs_vm_start(nvm);
+ (void) njs_vm_start(nvm, &retval);
- if (njs_vm_retval_string(nvm, &s) != NJS_OK) {
- njs_printf("njs_vm_retval_string() failed\n");
+ if (njs_vm_value_string(nvm, &s, &retval) != NJS_OK) {
+ njs_printf("njs_vm_value_string() failed\n");
goto done;
}
njs_str_t out;
njs_uint_t i;
njs_opts_t opts;
- njs_value_t args[2], report;
+ njs_value_t args[2], report, retval;
njs_vm_opt_t options;
njs_benchmark_test_t *test;
goto done;
}
- njs_vm_start(vm);
+ njs_vm_start(vm, &retval);
ret = njs_vm_array_alloc(vm, &report, 8);
if (ret != NJS_OK) {
args[1] = report;
- njs_vm_call(vm, njs_vm_function(vm, &compare), njs_value_arg(&args), 2);
+ njs_vm_invoke(vm, njs_vm_function(vm, &compare), njs_value_arg(&args),
+ 2, &retval);
- ret = njs_vm_value_dump(vm, &out, njs_vm_retval(vm), 1, 1);
+ ret = njs_vm_value_dump(vm, &out, &retval, 1, 1);
if (ret != NJS_OK) {
- njs_printf("njs_vm_retval_dump() failed\n");
+ njs_printf("njs_vm_value_dump() failed\n");
goto done;
}
}
if (opts.dump_report) {
- ret = njs_vm_json_stringify(vm, &report, 1);
+ ret = njs_vm_json_stringify(vm, &report, 1, &retval);
if (ret != NJS_OK) {
njs_printf("njs_vm_json_stringify() failed\n");
goto done;
}
- ret = njs_vm_value_dump(vm, &out, njs_vm_retval(vm), 1, 1);
+ ret = njs_vm_value_dump(vm, &out, &retval, 1, 1);
if (ret != NJS_OK) {
- njs_printf("njs_vm_retval_dump() failed\n");
+ njs_printf("njs_vm_value_dump() failed\n");
goto done;
}
static njs_int_t
njs_unit_test_r_method(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_str_t s;
ret = njs_vm_value_to_bytes(vm, &s, njs_arg(args, nargs, 1));
if (ret == NJS_OK && s.length == 3 && memcmp(s.start, "YES", 3) == 0) {
- return njs_vm_value_string_set(vm, njs_vm_retval(vm), r->uri.start,
- r->uri.length);
+ return njs_vm_value_string_set(vm, retval, r->uri.start, r->uri.length);
}
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
static njs_int_t
njs_unit_test_promise_trampoline(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
njs_function_t *callback;
callback = njs_value_function(njs_argument(args, 1));
if (callback != NULL) {
- return njs_vm_call(vm, callback, njs_argument(args, 2), 1);
+ return njs_vm_invoke(vm, callback, njs_argument(args, 2), 1, retval);
}
return NJS_OK;
static njs_int_t
njs_unit_test_r_subrequest(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
- njs_value_t retval, *argument, *select;
+ njs_value_t value, *argument, *select;
njs_vm_event_t vm_event;
njs_function_t *callback;
njs_external_ev_t *ev;
return NJS_ERROR;
}
- ret = njs_vm_promise_create(vm, &retval, &ev->callbacks[0]);
+ ret = njs_vm_promise_create(vm, &value, &ev->callbacks[0]);
if (ret != NJS_OK) {
return NJS_ERROR;
}
njs_queue_insert_tail(&env->events, &ev->link);
- njs_vm_retval_set(vm, njs_value_arg(&retval));
+ njs_value_assign(retval, &value);
return NJS_OK;
}
static njs_int_t
njs_unit_test_r_retval(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_external_env_t *env;
njs_value_assign(&env->retval, njs_arg(args, nargs, 1));
- njs_set_undefined(&vm->retval);
+ njs_set_undefined(retval);
return NJS_OK;
}
static njs_int_t
njs_unit_test_r_create(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_int_t ret;
njs_unit_test_req_t *r, *sr;
return NJS_ERROR;
}
- ret = njs_vm_external_create(vm, &vm->retval, njs_external_r_proto_id,
+ ret = njs_vm_external_create(vm, retval, njs_external_r_proto_id,
sr, 0);
if (ret != NJS_OK) {
return NJS_ERROR;
static njs_int_t
njs_unit_test_r_bind(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_str_t name;
njs_unit_test_req_t *r;
static njs_int_t
njs_unit_test_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused)
+ njs_index_t unused, njs_value_t *retval)
{
njs_unit_test_req_t *sr;
return NJS_ERROR;
}
- return njs_vm_external_create(vm, &vm->retval, njs_external_r_proto_id,
+ return njs_vm_external_create(vm, retval, njs_external_r_proto_id,
sr, 0);
}
{ njs_str("var b = new Boolean(1); b.__proto__ === Boolean.prototype"),
njs_str("true") },
+ { njs_str("Boolean(1).toString() === 'true'"),
+ njs_str("true") },
+
+ { njs_str("Boolean(0).toString() === 'false'"),
+ njs_str("true") },
+
{ njs_str("Number()"),
njs_str("0") },
typedef struct {
njs_vm_t *vm;
+ njs_value_t retval;
+
njs_external_env_t *env;
njs_external_env_t env0;
static njs_int_t
-njs_external_retval(njs_external_state_t *state, njs_str_t *s)
+njs_external_retval(njs_external_state_t *state, njs_int_t ret, njs_str_t *s)
{
- if (state->env != NULL && njs_value_is_valid(&state->env->retval)) {
+ if (state->env != NULL
+ && ret == NJS_OK
+ && njs_value_is_valid(&state->env->retval))
+ {
return njs_vm_value_string(state->vm, s, &state->env->retval);
}
- return njs_vm_retval_string(state->vm, s);
+ return njs_vm_value_string(state->vm, s, &state->retval);
}
static const njs_str_t handler_str = njs_str("main.handler");
static const njs_str_t request_str = njs_str("$r");
+ ret = NJS_OK;
+
switch (state->state) {
case sw_start:
state->state = sw_handler;
- ret = njs_vm_start(state->vm);
+ ret = njs_vm_start(state->vm, &state->retval);
if (ret != NJS_OK) {
goto done;
}
state->state = sw_done;
- if (njs_external_retval(state, &s) != NJS_OK) {
+ if (njs_external_retval(state, ret, &s) != NJS_OK) {
njs_stderror("njs_external_retval() failed\n");
return NJS_ERROR;
}
} else {
if (ret != NJS_OK) {
- if (njs_vm_retval_string(vm, &s) != NJS_OK) {
- njs_printf("njs_vm_retval_string() failed\n");
+ if (njs_vm_exception_string(vm, &s) != NJS_OK) {
+ njs_printf("njs_vm_exception_string() failed\n");
goto done;
}
njs_uint_t i;
njs_stat_t prev;
njs_bool_t success;
+ njs_value_t retval;
njs_vm_opt_t options;
vm = NULL;
njs_disassembler(vm);
}
- ret = njs_vm_start(vm);
+ ret = njs_vm_start(vm, &retval);
}
}
- if (njs_vm_retval_dump(vm, &s, 0) != NJS_OK) {
- njs_printf("njs_vm_retval_dump() failed\n");
+ if (njs_vm_value_dump(vm, &s, &retval, 0, 1) != NJS_OK) {
+ njs_printf("njs_vm_value_dump() failed\n");
goto done;
}
njs_uint_t i;
njs_bool_t success;
njs_stat_t prev;
- njs_value_t args[3];
+ njs_value_t args[3], retval;
njs_vm_opt_t options;
static const njs_str_t fname = njs_str("replacer");
goto done;
}
- ret = njs_vm_start(vm);
+ ret = njs_vm_start(vm, &args[0]);
if (ret != NJS_OK) {
- njs_printf("njs_vm_run() failed\n");
+ njs_printf("njs_vm_start() failed\n");
goto done;
}
- args[0] = *njs_vm_retval(vm);
-
- ret = njs_vm_json_parse(vm, args, 1);
+ ret = njs_vm_json_parse(vm, args, 1, &retval);
if (ret != NJS_OK) {
njs_printf("njs_vm_json_parse() failed\n");
goto done;
}
- args[0] = vm->retval;
+ njs_value_assign(&args[0], &retval);
njs_vm_value(vm, &fname, &args[1]);
njs_vm_value(vm, &iname, &args[2]);
- ret = njs_vm_json_stringify(vm, args, 3);
+ ret = njs_vm_json_stringify(vm, args, 3, &retval);
if (ret != NJS_OK) {
njs_printf("njs_vm_json_stringify() failed\n");
goto done;
}
- if (njs_vm_retval_string(vm, &s) != NJS_OK) {
- njs_printf("njs_vm_retval_string() failed\n");
+ if (njs_vm_value_string(vm, &s, &retval) != NJS_OK) {
+ njs_printf("njs_vm_value_string() failed\n");
goto done;
}
done:
if (ret != NJS_OK) {
- if (njs_vm_retval_string(vm, &s) != NJS_OK) {
- njs_printf("njs_vm_retval_string() failed\n");
+ if (njs_vm_exception_string(vm, &s) != NJS_OK) {
+ njs_printf("njs_vm_exception_string() failed\n");
} else {
njs_printf("%V\n", &s);
njs_uint_t i;
njs_bool_t success;
njs_stat_t prev;
+ njs_value_t retval;
njs_vm_opt_t options;
static struct {
goto done;
}
- ret = njs_vm_start(vm);
+ ret = njs_vm_start(vm, &retval);
if (ret != NJS_OK) {
njs_printf("njs_vm_run() failed\n");
goto done;
memcpy(path.start, tests[i].path.start, path.length);
- ret = njs_vm_value(vm, &path, &vm->retval);
+ ret = njs_vm_value(vm, &path, &retval);
- if (njs_vm_retval_string(vm, &s) != NJS_OK) {
- njs_printf("njs_vm_retval_string() failed\n");
- goto done;
+ if (ret == NJS_OK) {
+ if (njs_vm_value_string(vm, &s, &retval) != NJS_OK) {
+ njs_printf("njs_vm_value_string() failed\n");
+ goto done;
+ }
+
+ } else {
+ if (njs_vm_exception_string(vm, &s) != NJS_OK) {
+ njs_printf("njs_vm_exception_string() failed\n");
+ goto done;
+ }
}
success = njs_strstr_eq(&tests[i].ret, &s);
done:
if (ret != NJS_OK) {
- if (njs_vm_retval_string(vm, &s) != NJS_OK) {
- njs_printf("njs_vm_retval_string() failed\n");
+ if (njs_vm_exception_string(vm, &s) != NJS_OK) {
+ njs_printf("njs_vm_exception_string() failed\n");
} else {
njs_printf("%V\n", &s);
static njs_int_t
njs_string_to_index_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
{
- njs_str_t s, string;
- njs_int_t ret;
- njs_bool_t success, is_integer_index;
- njs_uint_t i;
+ njs_str_t s, string;
+ njs_int_t ret;
+ njs_bool_t success, is_integer_index;
+ njs_uint_t i;
+ njs_value_t value;
static const struct {
njs_value_t value;
for (i = 0; i < njs_nitems(tests); i++) {
if (njs_is_string(&tests[i].value)) {
- njs_set_number(&vm->retval, njs_string_to_index(&tests[i].value));
+ njs_set_number(&value, njs_string_to_index(&tests[i].value));
- ret = njs_vm_retval_dump(vm, &s, 0);
+ ret = njs_vm_value_dump(vm, &s, &value, 0, 0);
if (ret != NJS_OK) {
njs_printf("njs_string_to_index_test: "
- "njs_vm_retval_dump() failed\n");
+ "njs_vm_value_dump() failed\n");
return NJS_ERROR;
}
}
}
- is_integer_index = njs_key_is_integer_index(njs_number(&vm->retval),
+ is_integer_index = njs_key_is_integer_index(njs_number(&value),
&tests[i].value);
if (tests[i].is_integer_index != is_integer_index) {