details: https://hg.nginx.org/njs/rev/18385a4a90ad branches: changeset: 2102:18385a4a90ad user: Dmitry Volyntsev <xei...@nginx.com> date: Tue May 02 20:50:55 2023 -0700 description: FS: module is rewritten using public API.
diffstat: external/njs_fs_module.c | 1485 ++++++++++++++++++++++--------------------- src/njs.h | 11 + src/njs_value.c | 31 + src/njs_value_conversion.h | 17 - src/njs_vm.c | 56 + src/test/njs_unit_test.c | 74 +- test/fs/methods.t.js | 16 +- test/fs/promises_07.t.js | 2 +- 8 files changed, 898 insertions(+), 794 deletions(-) diffs (truncated from 3111 to 1000 lines): diff -r fd956d2a25a3 -r 18385a4a90ad external/njs_fs_module.c --- a/external/njs_fs_module.c Tue May 02 20:50:55 2023 -0700 +++ b/external/njs_fs_module.c Tue May 02 20:50:55 2023 -0700 @@ -5,9 +5,11 @@ */ -#include <njs_main.h> - +#include <njs.h> +#include <njs_utils.h> +#include <njs_buffer.h> #include <dirent.h> +#include <njs_unix.h> #if (NJS_SOLARIS) @@ -133,8 +135,8 @@ typedef struct { typedef struct { - njs_int_t bytes; - njs_value_t buffer; + njs_int_t bytes; + njs_opaque_value_t buffer; } njs_bytes_struct_t; @@ -173,10 +175,8 @@ static njs_int_t njs_fs_write(njs_vm_t * 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_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); -static njs_int_t njs_fs_promises(njs_vm_t *vm, njs_object_prop_t *prop, - njs_value_t *value, njs_value_t *unused, njs_value_t *retval); +static njs_int_t njs_fs_constant(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_dirent_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused, njs_value_t *retval); @@ -195,18 +195,18 @@ static njs_int_t njs_fs_filehandle_close 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_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); + njs_bool_t shadow, njs_opaque_value_t *retval); static njs_int_t njs_fs_bytes_read_create(njs_vm_t *vm, int bytes, - njs_value_t *buffer, njs_value_t *retval); + njs_value_t *buffer, njs_opaque_value_t *retval); static njs_int_t njs_fs_bytes_written_create(njs_vm_t *vm, int bytes, - njs_value_t *buffer, njs_value_t *retval); + njs_value_t *buffer, njs_opaque_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 *result); -static njs_int_t njs_fs_result(njs_vm_t *vm, njs_value_t *result, + const char *desc, const char *path, int errn, njs_opaque_value_t *result); +static njs_int_t njs_fs_result(njs_vm_t *vm, njs_opaque_value_t *result, njs_index_t calltype, const njs_value_t* callback, njs_uint_t nargs, njs_value_t *retval); @@ -214,19 +214,16 @@ static njs_int_t njs_file_tree_walk(cons njs_file_tree_walk_cb_t cb, int fd_limit, njs_ftw_flags_t flags); static njs_int_t njs_fs_make_path(njs_vm_t *vm, char *path, mode_t md, - njs_bool_t recursive, njs_value_t *retval); + njs_bool_t recursive, njs_opaque_value_t *retval); static njs_int_t njs_fs_rmtree(njs_vm_t *vm, const char *path, - njs_bool_t recursive, njs_value_t *retval); + njs_bool_t recursive, njs_opaque_value_t *retval); static const char *njs_fs_path(njs_vm_t *vm, char storage[NJS_MAX_PATH + 1], - const njs_value_t *src, const char *prop_name); + njs_value_t *src, const char *prop_name); static int njs_fs_flags(njs_vm_t *vm, njs_value_t *value, int default_flags); static mode_t njs_fs_mode(njs_vm_t *vm, njs_value_t *value, mode_t default_mode); -static njs_int_t njs_fs_add_event(njs_vm_t *vm, const njs_value_t *callback, - const njs_value_t *args, njs_uint_t nargs); - static njs_int_t njs_fs_dirent_create(njs_vm_t *vm, njs_value_t *name, njs_value_t *type, njs_value_t *retval); @@ -234,11 +231,11 @@ static njs_int_t njs_fs_dirent_create(nj static njs_int_t njs_fs_init(njs_vm_t *vm); -static const njs_value_t string_flag = njs_string("flag"); -static const njs_value_t string_mode = njs_string("mode"); -static const njs_value_t string_buffer = njs_string("buffer"); -static const njs_value_t string_encoding = njs_string("encoding"); -static const njs_value_t string_recursive = njs_string("recursive"); +static const njs_str_t string_flag = njs_str("flag"); +static const njs_str_t string_mode = njs_str("mode"); +static const njs_str_t string_buffer = njs_str("buffer"); +static const njs_str_t string_encoding = njs_str("encoding"); +static const njs_str_t string_recursive = njs_str("recursive"); static njs_fs_entry_t njs_flags_table[] = { @@ -259,6 +256,243 @@ static njs_fs_entry_t njs_flags_table[] }; +static njs_external_t njs_ext_fs_constants[] = { + + { + .flags = NJS_EXTERN_PROPERTY, + .name.string = njs_str("F_OK"), + .enumerable = 1, + .u.property = { + .handler = njs_fs_constant, + .magic32 = F_OK, + } + }, + + { + .flags = NJS_EXTERN_PROPERTY, + .name.string = njs_str("R_OK"), + .enumerable = 1, + .u.property = { + .handler = njs_fs_constant, + .magic32 = R_OK, + } + }, + + { + .flags = NJS_EXTERN_PROPERTY, + .name.string = njs_str("W_OK"), + .enumerable = 1, + .u.property = { + .handler = njs_fs_constant, + .magic32 = W_OK, + } + }, + + { + .flags = NJS_EXTERN_PROPERTY, + .name.string = njs_str("X_OK"), + .enumerable = 1, + .u.property = { + .handler = njs_fs_constant, + .magic32 = X_OK, + } + }, + +}; + + +static njs_external_t njs_ext_fs_promises[] = { + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("access"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_access, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("appendFile"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_write_file, + .magic8 = njs_fs_magic(NJS_FS_PROMISE, NJS_FS_APPEND), + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("close"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_close, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("fstat"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_stat, + .magic8 = njs_fs_magic(NJS_FS_PROMISE, NJS_FS_FSTAT), + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("mkdir"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_mkdir, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("lstat"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_stat, + .magic8 = njs_fs_magic(NJS_FS_PROMISE, NJS_FS_LSTAT), + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("open"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_open, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("readFile"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_read_file, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("readSync"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_read, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("readdir"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_readdir, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("realpath"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_realpath, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("rename"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_rename, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("rmdir"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_rmdir, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("stat"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_stat, + .magic8 = njs_fs_magic(NJS_FS_PROMISE, NJS_FS_STAT), + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("symlink"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_symlink, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("unlink"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_unlink, + .magic8 = NJS_FS_PROMISE, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("writeFile"), + .writable = 1, + .configurable = 1, + .u.method = { + .native = njs_fs_write_file, + .magic8 = njs_fs_magic(NJS_FS_PROMISE, NJS_FS_TRUNC), + } + }, + +}; + + static njs_external_t njs_ext_fs[] = { { @@ -325,11 +559,14 @@ static njs_external_t njs_ext_fs[] = { }, { - .flags = NJS_EXTERN_PROPERTY, + .flags = NJS_EXTERN_OBJECT, .name.string = njs_str("constants"), + .writable = 1, .enumerable = 1, - .u.property = { - .handler = njs_fs_constants, + .configurable = 1, + .u.object = { + .properties = njs_ext_fs_constants, + .nproperties = njs_nitems(njs_ext_fs_constants), } }, @@ -411,11 +648,14 @@ static njs_external_t njs_ext_fs[] = { }, { - .flags = NJS_EXTERN_PROPERTY, + .flags = NJS_EXTERN_OBJECT, .name.string = njs_str("promises"), + .writable = 1, .enumerable = 1, - .u.property = { - .handler = njs_fs_promises, + .configurable = 1, + .u.object = { + .properties = njs_ext_fs_promises, + .nproperties = njs_nitems(njs_ext_fs_promises), } }, @@ -757,7 +997,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_ATIME, NJS_DATE), + .magic32 = njs_fs_magic2(NJS_FS_STAT_ATIME, 1), } }, @@ -767,7 +1007,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_ATIME, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_ATIME, 0), } }, @@ -777,7 +1017,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_BIRTHTIME, NJS_DATE), + .magic32 = njs_fs_magic2(NJS_FS_STAT_BIRTHTIME, 1), } }, @@ -787,7 +1027,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_BIRTHTIME, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_BIRTHTIME, 0), } }, @@ -797,7 +1037,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_CTIME, NJS_DATE), + .magic32 = njs_fs_magic2(NJS_FS_STAT_CTIME, 1), } }, @@ -807,7 +1047,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_CTIME, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_CTIME, 0), } }, @@ -817,7 +1057,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_BLKSIZE, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_BLKSIZE, 0), } }, @@ -827,7 +1067,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_BLOCKS, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_BLOCKS, 0), } }, @@ -837,7 +1077,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_DEV, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_DEV, 0), } }, @@ -847,7 +1087,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_GID, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_GID, 0), } }, @@ -857,7 +1097,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_INO, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_INO, 0), } }, @@ -867,7 +1107,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_MODE, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_MODE, 0), } }, @@ -877,7 +1117,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_MTIME, NJS_DATE), + .magic32 = njs_fs_magic2(NJS_FS_STAT_MTIME, 1), } }, @@ -887,7 +1127,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_MTIME, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_MTIME, 0), } }, @@ -897,7 +1137,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_NLINK, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_NLINK, 0), } }, @@ -907,7 +1147,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_RDEV, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_RDEV, 0), } }, @@ -917,7 +1157,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_SIZE, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_SIZE, 0), } }, @@ -927,7 +1167,7 @@ static njs_external_t njs_ext_stats[] = .enumerable = 1, .u.property = { .handler = njs_fs_stats_prop, - .magic32 = njs_fs_magic2(NJS_FS_STAT_UID, NJS_NUMBER), + .magic32 = njs_fs_magic2(NJS_FS_STAT_UID, 0), } }, @@ -1175,11 +1415,12 @@ static njs_int_t njs_fs_access(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval) { - int md; - njs_int_t ret; - const char *path; - njs_value_t result, *callback, *mode; - char path_buf[NJS_MAX_PATH + 1]; + int md; + njs_int_t ret; + const char *path; + njs_value_t *callback, *mode; + njs_opaque_value_t result; + char path_buf[NJS_MAX_PATH + 1]; path = njs_fs_path(vm, path_buf, njs_arg(args, nargs, 1), "path"); if (njs_slow_path(path == NULL)) { @@ -1191,8 +1432,8 @@ njs_fs_access(njs_vm_t *vm, njs_value_t if (calltype == NJS_FS_CALLBACK) { callback = njs_arg(args, nargs, njs_min(nargs - 1, 3)); - if (!njs_is_function(callback)) { - njs_type_error(vm, "\"callback\" must be a function"); + if (!njs_value_is_function(callback)) { + njs_vm_error(vm, "\"callback\" must be a function"); return NJS_ERROR; } @@ -1201,21 +1442,18 @@ njs_fs_access(njs_vm_t *vm, njs_value_t } } - switch (mode->type) { - case NJS_UNDEFINED: + if (njs_value_is_number(mode)) { + md = njs_value_number(mode); + + } else if (njs_value_is_undefined(mode)) { md = F_OK; - break; - - case NJS_NUMBER: - md = njs_number(mode); - break; - - default: - njs_type_error(vm, "\"mode\" must be a number"); + + } else { + njs_vm_error(vm, "\"mode\" must be a number"); return NJS_ERROR; } - njs_set_undefined(&result); + njs_value_undefined_set(njs_value_arg(&result)); ret = access(path, md); if (njs_slow_path(ret != 0)) { @@ -1234,12 +1472,13 @@ static njs_int_t njs_fs_open(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval) { - int fd, flags; - mode_t md; - njs_int_t ret; - const char *path; - njs_value_t result, *value; - char path_buf[NJS_MAX_PATH + 1]; + int fd, flags; + mode_t md; + njs_int_t ret; + const char *path; + njs_value_t *value; + njs_opaque_value_t result; + char path_buf[NJS_MAX_PATH + 1]; path = njs_fs_path(vm, path_buf, njs_arg(args, nargs, 1), "path"); if (njs_slow_path(path == NULL)) { @@ -1247,7 +1486,7 @@ njs_fs_open(njs_vm_t *vm, njs_value_t *a } value = njs_arg(args, nargs, 2); - if (njs_is_function(value)) { + if (njs_value_is_function(value)) { value = njs_value_arg(&njs_value_undefined); } @@ -1257,7 +1496,7 @@ njs_fs_open(njs_vm_t *vm, njs_value_t *a } value = njs_arg(args, nargs, 3); - if (njs_is_function(value)) { + if (njs_value_is_function(value)) { value = njs_value_arg(&njs_value_undefined); } @@ -1278,7 +1517,7 @@ njs_fs_open(njs_vm_t *vm, njs_value_t *a } if (calltype == NJS_FS_DIRECT) { - njs_value_number_set(&result, fd); + njs_value_number_set(njs_value_arg(&result), fd); } done: @@ -1299,9 +1538,10 @@ static njs_int_t njs_fs_close(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval) { - int64_t fd; - njs_int_t ret; - njs_value_t result, *fh; + int64_t fd; + njs_int_t ret; + njs_value_t *fh; + njs_opaque_value_t result; fh = njs_arg(args, nargs, 1); @@ -1310,7 +1550,7 @@ njs_fs_close(njs_vm_t *vm, njs_value_t * return ret; } - njs_set_undefined(&result); + njs_value_undefined_set(njs_value_arg(&result)); ret = close((int) fd); if (njs_slow_path(ret != 0)) { @@ -1329,11 +1569,12 @@ static njs_int_t njs_fs_mkdir(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval) { - char *path; - mode_t md; - njs_int_t ret; - njs_value_t mode, recursive, result, *callback, *options; - char path_buf[NJS_MAX_PATH + 1]; + char *path; + mode_t md; + njs_int_t ret; + njs_value_t *callback, *options; + njs_opaque_value_t mode, recursive, result; + char path_buf[NJS_MAX_PATH + 1]; path = (char *) njs_fs_path(vm, path_buf, njs_arg(args, nargs, 1), "path"); if (njs_slow_path(path == NULL)) { @@ -1345,53 +1586,41 @@ njs_fs_mkdir(njs_vm_t *vm, njs_value_t * if (njs_slow_path(calltype == NJS_FS_CALLBACK)) { callback = njs_arg(args, nargs, njs_min(nargs - 1, 3)); - if (!njs_is_function(callback)) { - njs_type_error(vm, "\"callback\" must be a function"); + if (!njs_value_is_function(callback)) { + njs_vm_error(vm, "\"callback\" must be a function"); return NJS_ERROR; } + if (options == callback) { options = njs_value_arg(&njs_value_undefined); } } - njs_set_undefined(&mode); - njs_set_false(&recursive); - - switch (options->type) { - case NJS_NUMBER: - mode = *options; - break; - - case NJS_UNDEFINED: - break; - - default: - if (!njs_is_object(options)) { - njs_type_error(vm, "Unknown options type: \"%s\" " - "(a number or object required)", - njs_type_string(options->type)); + njs_value_undefined_set(njs_value_arg(&mode)); + njs_value_boolean_set(njs_value_arg(&recursive), 0); + + if (njs_value_is_number(options)) { + njs_value_assign(&mode, options); + + } else if (!njs_value_is_undefined(options)) { + if (!njs_value_is_object(options)) { + njs_vm_error(vm, "Unknown options type" + "(a number or object required)"); return NJS_ERROR; } - ret = njs_value_property(vm, options, njs_value_arg(&string_mode), - &mode); - if (njs_slow_path(ret == NJS_ERROR)) { - return ret; - } - - ret = njs_value_property(vm, options, njs_value_arg(&string_recursive), - &recursive); - if (njs_slow_path(ret == NJS_ERROR)) { - return ret; - } + (void) njs_vm_object_prop(vm, options, &string_recursive, &recursive); + + (void) njs_vm_object_prop(vm, options, &string_mode, &mode); } - md = njs_fs_mode(vm, &mode, 0777); + md = njs_fs_mode(vm, njs_value_arg(&mode), 0777); if (njs_slow_path(md == (mode_t) -1)) { return NJS_ERROR; } - ret = njs_fs_make_path(vm, path, md, njs_is_true(&recursive), &result); + ret = njs_fs_make_path(vm, path, md, + njs_value_bool(njs_value_arg(&recursive)), &result); if (ret == NJS_OK) { return njs_fs_result(vm, &result, calltype, callback, 1, retval); @@ -1405,12 +1634,13 @@ static njs_int_t njs_fs_read(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, 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 result, *buffer, *value; + 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 *buffer, *value; + njs_opaque_value_t result; fd_offset = !!(calltype == NJS_FS_DIRECT); @@ -1439,8 +1669,7 @@ njs_fs_read(njs_vm_t *vm, njs_value_t *a } if (njs_slow_path(offset < 0 || (size_t) offset > data.length)) { - njs_range_error(vm, "offset is out of range (must be <= %z)", - data.length); + njs_vm_error(vm, "offset is out of range (must be <= %z)", data.length); return NJS_ERROR; } @@ -1449,15 +1678,15 @@ njs_fs_read(njs_vm_t *vm, njs_value_t *a value = njs_arg(args, nargs, fd_offset + 3); - if (njs_is_defined(value)) { + if (!njs_value_is_undefined(value)) { ret = njs_value_to_integer(vm, value, &length); if (njs_slow_path(ret != NJS_OK)) { return ret; } if (njs_slow_path(length < 0 || (size_t) length > data.length)) { - njs_range_error(vm, "length is out of range (must be <= %z)", - data.length); + njs_vm_error(vm, "length is out of range (must be <= %z)", + data.length); return NJS_ERROR; } @@ -1466,7 +1695,7 @@ njs_fs_read(njs_vm_t *vm, njs_value_t *a value = njs_arg(args, nargs, fd_offset + 4); - if (!njs_is_null_or_undefined(value)) { + if (!njs_value_is_null_or_undefined(value)) { ret = njs_value_to_integer(vm, value, &pos); if (njs_slow_path(ret != NJS_OK)) { return ret; @@ -1492,7 +1721,7 @@ njs_fs_read(njs_vm_t *vm, njs_value_t *a } } else { - njs_value_number_set(&result, n); + njs_value_number_set(njs_value_arg(&result), n); } done: @@ -1513,8 +1742,9 @@ njs_fs_read_file(njs_vm_t *vm, njs_value njs_str_t data; njs_int_t ret; const char *path; - njs_value_t flag, encode, result, *callback, *options; + njs_value_t *callback, *options; struct stat sb; + njs_opaque_value_t flag, result, encode; const njs_buffer_encoding_t *encoding; char path_buf[NJS_MAX_PATH + 1]; @@ -1529,8 +1759,8 @@ njs_fs_read_file(njs_vm_t *vm, njs_value if (calltype == NJS_FS_CALLBACK) { callback = njs_arg(args, nargs, njs_min(nargs - 1, 3)); - if (!njs_is_function(callback)) { - njs_type_error(vm, "\"callback\" must be a function"); + if (!njs_value_is_function(callback)) { + njs_vm_error(vm, "\"callback\" must be a function"); return NJS_ERROR; } @@ -1539,46 +1769,32 @@ njs_fs_read_file(njs_vm_t *vm, njs_value } } - njs_set_undefined(&flag); - njs_set_undefined(&encode); - - switch (options->type) { - case NJS_STRING: - encode = *options; - break; - - case NJS_UNDEFINED: - break; - - default: - if (!njs_is_object(options)) { - njs_type_error(vm, "Unknown options type: \"%s\" " - "(a string or object required)", - njs_type_string(options->type)); + njs_value_undefined_set(njs_value_arg(&flag)); + njs_value_undefined_set(njs_value_arg(&encode)); + + if (njs_value_is_string(options)) { + njs_value_assign(&encode, options); + + } else if (!njs_value_is_undefined(options)) { + if (!njs_value_is_object(options)) { + njs_vm_error(vm, "Unknown options type " + "(a string or object required)"); return NJS_ERROR; } - ret = njs_value_property(vm, options, njs_value_arg(&string_flag), - &flag); - if (njs_slow_path(ret == NJS_ERROR)) { - return ret; - } - - ret = njs_value_property(vm, options, njs_value_arg(&string_encoding), - &encode); - if (njs_slow_path(ret == NJS_ERROR)) { - return ret; - } + (void) njs_vm_object_prop(vm, options, &string_flag, &flag); + + (void) njs_vm_object_prop(vm, options, &string_encoding, &encode); } - flags = njs_fs_flags(vm, &flag, O_RDONLY); + flags = njs_fs_flags(vm, njs_value_arg(&flag), O_RDONLY); if (njs_slow_path(flags == -1)) { return NJS_ERROR; } encoding = NULL; - if (njs_is_defined(&encode)) { - encoding = njs_buffer_encoding(vm, &encode, 1); + if (!njs_value_is_undefined(njs_value_arg(&encode))) { + encoding = njs_buffer_encoding(vm, njs_value_arg(&encode), 1); if (njs_slow_path(encoding == NULL)) { return NJS_ERROR; } @@ -1615,11 +1831,12 @@ njs_fs_read_file(njs_vm_t *vm, njs_value } if (encoding == NULL) { - ret = njs_buffer_set(vm, &result, data.start, data.length); + ret = njs_buffer_set(vm, njs_value_arg(&result), data.start, + data.length); } else { - ret = encoding->encode(vm, &result, &data); - njs_mp_free(vm->mem_pool, data.start); + ret = encoding->encode(vm, njs_value_arg(&result), &data); + njs_mp_free(njs_vm_memory_pool(vm), data.start); } done: @@ -1644,14 +1861,13 @@ njs_fs_readdir(njs_vm_t *vm, njs_value_t njs_str_t s; njs_int_t ret; const char *path; - njs_value_t encode, types, ename, etype, result, - *callback, *options, *value; - njs_array_t *results; + njs_value_t *callback, *options, *value; struct dirent *entry; + njs_opaque_value_t encode, types, ename, etype, result; const njs_buffer_encoding_t *encoding; char path_buf[NJS_MAX_PATH + 1]; - static const njs_value_t string_types = njs_string("withFileTypes"); + static const njs_str_t string_types = njs_str("withFileTypes"); path = njs_fs_path(vm, path_buf, njs_arg(args, nargs, 1), "path"); if (njs_slow_path(path == NULL)) { @@ -1663,8 +1879,8 @@ njs_fs_readdir(njs_vm_t *vm, njs_value_t if (njs_slow_path(calltype == NJS_FS_CALLBACK)) { callback = njs_arg(args, nargs, njs_min(nargs - 1, 3)); - if (!njs_is_function(callback)) { - njs_type_error(vm, "\"callback\" must be a function"); + if (!njs_value_is_function(callback)) { + njs_vm_error(vm, "\"callback\" must be a function"); return NJS_ERROR; } if (options == callback) { @@ -1672,53 +1888,42 @@ njs_fs_readdir(njs_vm_t *vm, njs_value_t } } - njs_set_false(&types); - njs_set_undefined(&encode); - - switch (options->type) { - case NJS_STRING: - encode = *options; - break; - - case NJS_UNDEFINED: - break; - - default: - if (!njs_is_object(options)) { - njs_type_error(vm, "Unknown options type: \"%s\" " - "(a string or object required)", - njs_type_string(options->type)); + njs_value_boolean_set(njs_value_arg(&types), 0); + njs_value_undefined_set(njs_value_arg(&encode)); + + if (njs_value_is_string(options)) { + njs_value_assign(&encode, options); + + } else if (!njs_value_is_undefined(options)) { + if (!njs_value_is_object(options)) { + njs_vm_error(vm, "Unknown options type " + "(a string or object required)"); return NJS_ERROR; } - ret = njs_value_property(vm, options, njs_value_arg(&string_encoding), - &encode); - if (njs_slow_path(ret == NJS_ERROR)) { _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel