Welcome! Log In Create A New Profile

Advanced

[njs] Refactored working with an object properties.

Dmitry Volyntsev
October 25, 2022 01:06PM
details: https://hg.nginx.org/njs/rev/109e6cb4dea5
branches:
changeset: 1986:109e6cb4dea5
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Tue Oct 25 09:19:32 2022 -0700
description:
Refactored working with an object properties.

1) njs_object_prop_t is compacted from 72 to 40 bytes on 64bit
platforms.
2) njs_object_prop_define() is revorked to accomodate fast
property creation using njs_value_create_data_prop()
which corresponds to CreateDataProperty() from the specs.

diffstat:

external/njs_fs_module.c | 241 +------
src/njs_array.c | 401 +++----------
src/njs_array_buffer.c | 77 +--
src/njs_async.c | 40 +-
src/njs_boolean.c | 47 +-
src/njs_buffer.c | 738 ++++++-------------------
src/njs_builtin.c | 769 ++++++-------------------
src/njs_date.c | 522 ++++-------------
src/njs_encoding.c | 110 +---
src/njs_error.c | 508 +++--------------
src/njs_extern.c | 28 +-
src/njs_function.c | 232 ++-----
src/njs_iterator.c | 22 +-
src/njs_json.c | 38 +-
src/njs_main.h | 1 +
src/njs_math.c | 383 ++----------
src/njs_number.c | 185 +-----
src/njs_object.c | 372 +++---------
src/njs_object.h | 66 +-
src/njs_object_prop.c | 269 +++++---
src/njs_object_prop_declare.h | 74 ++
src/njs_promise.c | 123 +---
src/njs_regexp.c | 144 +----
src/njs_string.c | 407 +++----------
src/njs_symbol.c | 183 +----
src/njs_typed_array.c | 1180 ++++++++++------------------------------
src/njs_value.c | 173 ++---
src/njs_value.h | 89 ++-
src/njs_vm.c | 4 +-
src/njs_vm.h | 9 -
src/njs_vmcode.c | 6 +-
src/test/njs_unit_test.c | 39 +-
32 files changed, 2076 insertions(+), 5404 deletions(-)

diffs (truncated from 9903 to 1000 lines):

diff -r 96a0be3dfb0b -r 109e6cb4dea5 external/njs_fs_module.c
--- a/external/njs_fs_module.c Tue Oct 25 09:19:14 2022 -0700
+++ b/external/njs_fs_module.c Tue Oct 25 09:19:32 2022 -0700
@@ -3231,25 +3231,11 @@ njs_fs_dirent_constructor(njs_vm_t *vm,

static const njs_object_prop_t njs_dirent_constructor_properties[] =
{
- {
- .type = NJS_PROPERTY,
- .name = njs_string("name"),
- .value = njs_string("Dirent"),
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("length"),
- .value = njs_value(NJS_NUMBER, 1, 2.0),
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("prototype"),
- .value = njs_prop_handler(njs_object_prototype_create),
- },
+ NJS_DECLARE_PROP_NAME("Dirent"),
+
+ NJS_DECLARE_PROP_LENGTH(2),
+
+ NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),
};


@@ -3427,7 +3413,7 @@ njs_fs_stats_prop(njs_vm_t *vm, njs_obje
return NJS_DECLINED;
}

- switch (prop->value.data.magic32 & 0xf) {
+ switch (njs_prop_magic32(prop) & 0xf) {
case NJS_FS_STAT_DEV:
v = st->st_dev;
break;
@@ -3486,7 +3472,7 @@ njs_fs_stats_prop(njs_vm_t *vm, njs_obje
break;
}

- switch (prop->value.data.magic32 >> 4) {
+ switch (njs_prop_magic32(prop) >> 4) {
case NJS_NUMBER:
njs_set_number(retval, v);
break;
@@ -3635,146 +3621,44 @@ njs_fs_bytes_written_create(njs_vm_t *vm

static const njs_object_prop_t njs_fs_promises_properties[] =
{
- {
- .type = NJS_PROPERTY,
- .name = njs_string("readFile"),
- .value = njs_native_function2(njs_fs_read_file, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("readSync"),
- .value = njs_native_function2(njs_fs_read, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("appendFile"),
- .value = njs_native_function2(njs_fs_write_file, 0,
- njs_fs_magic(NJS_FS_PROMISE, NJS_FS_APPEND)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("writeFile"),
- .value = njs_native_function2(njs_fs_write_file, 0,
- njs_fs_magic(NJS_FS_PROMISE, NJS_FS_TRUNC)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("access"),
- .value = njs_native_function2(njs_fs_access, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("mkdir"),
- .value = njs_native_function2(njs_fs_mkdir, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("open"),
- .value = njs_native_function2(njs_fs_open, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("close"),
- .value = njs_native_function2(njs_fs_close, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("rename"),
- .value = njs_native_function2(njs_fs_rename, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("rmdir"),
- .value = njs_native_function2(njs_fs_rmdir, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("readdir"),
- .value = njs_native_function2(njs_fs_readdir, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("fstat"),
- .value = njs_native_function2(njs_fs_stat, 0,
- njs_fs_magic(NJS_FS_PROMISE, NJS_FS_FSTAT)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("lstat"),
- .value = njs_native_function2(njs_fs_stat, 0,
- njs_fs_magic(NJS_FS_PROMISE, NJS_FS_LSTAT)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("stat"),
- .value = njs_native_function2(njs_fs_stat, 0,
- njs_fs_magic(NJS_FS_PROMISE, NJS_FS_STAT)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("symlink"),
- .value = njs_native_function2(njs_fs_symlink, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("unlink"),
- .value = njs_native_function2(njs_fs_unlink, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("realpath"),
- .value = njs_native_function2(njs_fs_realpath, 0, NJS_FS_PROMISE),
- .writable = 1,
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_NATIVE("readFile", njs_fs_read_file, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("readSync", njs_fs_read, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("appendFile", njs_fs_write_file, 0,
+ njs_fs_magic(NJS_FS_PROMISE, NJS_FS_APPEND)),
+
+ NJS_DECLARE_PROP_NATIVE("writeFile", njs_fs_write_file, 0,
+ njs_fs_magic(NJS_FS_PROMISE, NJS_FS_TRUNC)),
+
+ NJS_DECLARE_PROP_NATIVE("access", njs_fs_access, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("mkdir", njs_fs_mkdir, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("open", njs_fs_open, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("close", njs_fs_close, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("rename", njs_fs_rename, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("rmdir", njs_fs_rmdir, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("readdir", njs_fs_readdir, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("fstat", njs_fs_stat, 0,
+ njs_fs_magic(NJS_FS_PROMISE, NJS_FS_FSTAT)),
+
+ NJS_DECLARE_PROP_NATIVE("lstat", njs_fs_stat, 0,
+ njs_fs_magic(NJS_FS_PROMISE, NJS_FS_LSTAT)),
+
+ NJS_DECLARE_PROP_NATIVE("stat", njs_fs_stat, 0,
+ njs_fs_magic(NJS_FS_PROMISE, NJS_FS_STAT)),
+
+ NJS_DECLARE_PROP_NATIVE("symlink", njs_fs_symlink, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("unlink", njs_fs_unlink, 0, NJS_FS_PROMISE),
+
+ NJS_DECLARE_PROP_NATIVE("realpath", njs_fs_realpath, 0, NJS_FS_PROMISE),
};


@@ -3794,30 +3678,17 @@ njs_fs_promises(njs_vm_t *vm, njs_object

static const njs_object_prop_t njs_fs_constants_properties[] =
{
- {
- .type = NJS_PROPERTY,
- .name = njs_string("F_OK"),
- .value = njs_value(NJS_NUMBER, 0, F_OK),
- .enumerable = 1,
- },
- {
- .type = NJS_PROPERTY,
- .name = njs_string("R_OK"),
- .value = njs_value(NJS_NUMBER, 1, R_OK),
- .enumerable = 1,
- },
- {
- .type = NJS_PROPERTY,
- .name = njs_string("W_OK"),
- .value = njs_value(NJS_NUMBER, 1, W_OK),
- .enumerable = 1,
- },
- {
- .type = NJS_PROPERTY,
- .name = njs_string("X_OK"),
- .value = njs_value(NJS_NUMBER, 1, X_OK),
- .enumerable = 1,
- },
+ NJS_DECLARE_PROP_VALUE("F_OK", njs_value(NJS_NUMBER, 0, F_OK),
+ NJS_OBJECT_PROP_VALUE_E),
+
+ NJS_DECLARE_PROP_VALUE("R_OK", njs_value(NJS_NUMBER, 0, R_OK),
+ NJS_OBJECT_PROP_VALUE_E),
+
+ NJS_DECLARE_PROP_VALUE("W_OK", njs_value(NJS_NUMBER, 0, W_OK),
+ NJS_OBJECT_PROP_VALUE_E),
+
+ NJS_DECLARE_PROP_VALUE("X_OK", njs_value(NJS_NUMBER, 0, X_OK),
+ NJS_OBJECT_PROP_VALUE_E),
};


diff -r 96a0be3dfb0b -r 109e6cb4dea5 src/njs_array.c
--- a/src/njs_array.c Tue Oct 25 09:19:14 2022 -0700
+++ b/src/njs_array.c Tue Oct 25 09:19:32 2022 -0700
@@ -159,7 +159,7 @@ njs_array_convert_to_slow_array(njs_vm_t
return NJS_ERROR;
}

- prop->value = array->start[i];
+ njs_value_assign(njs_prop_value(prop), &array->start[i]);
}
}

@@ -197,7 +197,7 @@ njs_array_length_redefine(njs_vm_t *vm,
prop->enumerable = 0;
prop->configurable = 0;

- njs_value_number_set(&prop->value, length);
+ njs_value_number_set(njs_prop_value(prop), length);

return NJS_OK;
}
@@ -224,7 +224,7 @@ njs_array_length_set(njs_vm_t *vm, njs_v
return NJS_ERROR;
}

- ret = njs_value_to_length(vm, &prev->value, &prev_length);
+ ret = njs_value_to_length(vm, njs_prop_value(prev), &prev_length);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
@@ -523,41 +523,15 @@ njs_array_of(njs_vm_t *vm, njs_value_t *

static const njs_object_prop_t njs_array_constructor_properties[] =
{
- {
- .type = NJS_PROPERTY,
- .name = njs_string("name"),
- .value = njs_string("Array"),
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("length"),
- .value = njs_value(NJS_NUMBER, 1, 1.0),
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("prototype"),
- .value = njs_prop_handler(njs_object_prototype_create),
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("isArray"),
- .value = njs_native_function(njs_array_is_array, 1),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("of"),
- .value = njs_native_function(njs_array_of, 0),
- .writable = 1,
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_NAME("Array"),
+
+ NJS_DECLARE_PROP_LENGTH(1),
+
+ NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),
+
+ NJS_DECLARE_PROP_NATIVE("isArray", njs_array_is_array, 1, 0),
+
+ NJS_DECLARE_PROP_NATIVE("of", njs_array_of, 0, 0),
};


@@ -646,9 +620,9 @@ njs_array_length(njs_vm_t *vm,njs_object
}

prop->type = NJS_PROPERTY;
- njs_set_number(&prop->value, length);
-
- *retval = *setval;
+ njs_set_number(njs_prop_value(prop), length);
+
+ njs_value_assign(retval, setval);

return NJS_OK;
}
@@ -2850,265 +2824,92 @@ njs_array_prototype_iterator_obj(njs_vm_

static const njs_object_prop_t njs_array_prototype_properties[] =
{
- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("length"),
- .value = njs_prop_handler(njs_array_length),
- .writable = 1,
- },
-
- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("constructor"),
- .value = njs_prop_handler(njs_object_prototype_create_constructor),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("concat"),
- .value = njs_native_function(njs_array_prototype_concat, 1),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("copyWithin"),
- .value = njs_native_function(njs_array_prototype_copy_within, 2),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("entries"),
- .value = njs_native_function2(njs_array_prototype_iterator_obj, 0,
- NJS_ENUM_BOTH),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("every"),
- .value = njs_native_function2(njs_array_prototype_iterator, 1,
- njs_array_func(NJS_ARRAY_EVERY)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("fill"),
- .value = njs_native_function(njs_array_prototype_fill, 1),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("filter"),
- .value = njs_native_function2(njs_array_prototype_iterator, 1,
- njs_array_func(NJS_ARRAY_FILTER)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("find"),
- .value = njs_native_function2(njs_array_prototype_iterator, 1,
- njs_array_func(NJS_ARRAY_FIND)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("findIndex"),
- .value = njs_native_function2(njs_array_prototype_iterator, 1,
- njs_array_func(NJS_ARRAY_FIND_INDEX)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("forEach"),
- .value = njs_native_function2(njs_array_prototype_iterator, 1,
- njs_array_func(NJS_ARRAY_FOR_EACH)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("includes"),
- .value = njs_native_function2(njs_array_prototype_iterator, 1,
- njs_array_arg(NJS_ARRAY_INCLUDES)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("indexOf"),
- .value = njs_native_function2(njs_array_prototype_iterator, 1,
- njs_array_arg(NJS_ARRAY_INDEX_OF)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("join"),
- .value = njs_native_function(njs_array_prototype_join, 1),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("keys"),
- .value = njs_native_function2(njs_array_prototype_iterator_obj, 0,
- NJS_ENUM_KEYS),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("lastIndexOf"),
- .value = njs_native_function2(njs_array_prototype_reverse_iterator, 1,
- NJS_ARRAY_LAST_INDEX_OF),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("map"),
- .value = njs_native_function2(njs_array_prototype_iterator, 1,
- njs_array_func(NJS_ARRAY_MAP)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("pop"),
- .value = njs_native_function(njs_array_prototype_pop, 0),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("push"),
- .value = njs_native_function(njs_array_prototype_push, 1),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("reduce"),
- .value = njs_native_function2(njs_array_prototype_iterator, 1,
- njs_array_func(NJS_ARRAY_REDUCE)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("reduceRight"),
- .value = njs_native_function2(njs_array_prototype_reverse_iterator, 1,
- NJS_ARRAY_REDUCE_RIGHT),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("reverse"),
- .value = njs_native_function(njs_array_prototype_reverse, 0),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("shift"),
- .value = njs_native_function(njs_array_prototype_shift, 0),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("slice"),
- .value = njs_native_function(njs_array_prototype_slice, 2),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("some"),
- .value = njs_native_function2(njs_array_prototype_iterator, 1,
- njs_array_func(NJS_ARRAY_SOME)),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("sort"),
- .value = njs_native_function(njs_array_prototype_sort, 1),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("splice"),
- .value = njs_native_function(njs_array_prototype_splice, 2),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("toString"),
- .value = njs_native_function(njs_array_prototype_to_string, 0),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("unshift"),
- .value = njs_native_function(njs_array_prototype_unshift, 1),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("values"),
- .value = njs_native_function2(njs_array_prototype_iterator_obj, 0,
- NJS_ENUM_VALUES),
- .writable = 1,
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_HANDLER("length", njs_array_length, 0, 0,
+ NJS_OBJECT_PROP_VALUE_W),
+
+ NJS_DECLARE_PROP_HANDLER("constructor",
+ njs_object_prototype_create_constructor,
+ 0, 0, NJS_OBJECT_PROP_VALUE_CW),
+
+ NJS_DECLARE_PROP_NATIVE("concat", njs_array_prototype_concat, 1, 0),
+
+ NJS_DECLARE_PROP_NATIVE("copyWithin", njs_array_prototype_copy_within, 2,
+ 0),
+
+ NJS_DECLARE_PROP_NATIVE("entries", njs_array_prototype_iterator_obj, 0,
+ NJS_ENUM_BOTH),
+
+ NJS_DECLARE_PROP_NATIVE("every", njs_array_prototype_iterator, 1,
+ njs_array_func(NJS_ARRAY_EVERY)),
+
+ NJS_DECLARE_PROP_NATIVE("fill", njs_array_prototype_fill, 1, 0),
+
+ NJS_DECLARE_PROP_NATIVE("filter", njs_array_prototype_iterator, 1,
+ njs_array_func(NJS_ARRAY_FILTER)),
+
+ NJS_DECLARE_PROP_NATIVE("find", njs_array_prototype_iterator, 1,
+ njs_array_func(NJS_ARRAY_FIND)),
+
+ NJS_DECLARE_PROP_NATIVE("findIndex", njs_array_prototype_iterator, 1,
+ njs_array_func(NJS_ARRAY_FIND_INDEX)),
+
+ NJS_DECLARE_PROP_NATIVE("forEach", njs_array_prototype_iterator, 1,
+ njs_array_func(NJS_ARRAY_FOR_EACH)),
+
+ NJS_DECLARE_PROP_NATIVE("includes", njs_array_prototype_iterator, 1,
+ njs_array_arg(NJS_ARRAY_INCLUDES)),
+
+ NJS_DECLARE_PROP_NATIVE("indexOf", njs_array_prototype_iterator, 1,
+ njs_array_arg(NJS_ARRAY_INDEX_OF)),
+
+ NJS_DECLARE_PROP_NATIVE("join", njs_array_prototype_join, 1, 0),
+
+ NJS_DECLARE_PROP_NATIVE("keys", njs_array_prototype_iterator_obj, 0,
+ NJS_ENUM_KEYS),
+
+ NJS_DECLARE_PROP_NATIVE("lastIndexOf",
+ njs_array_prototype_reverse_iterator, 1,
+ NJS_ARRAY_LAST_INDEX_OF),
+
+ NJS_DECLARE_PROP_NATIVE("map", njs_array_prototype_iterator, 1,
+ njs_array_func(NJS_ARRAY_MAP)),
+
+ NJS_DECLARE_PROP_NATIVE("pop", njs_array_prototype_pop, 0, 0),
+
+ NJS_DECLARE_PROP_NATIVE("push", njs_array_prototype_push, 1, 0),
+
+ NJS_DECLARE_PROP_NATIVE("reduce", njs_array_prototype_iterator, 1,
+ njs_array_func(NJS_ARRAY_REDUCE)),
+
+ NJS_DECLARE_PROP_NATIVE("reduceRight",
+ njs_array_prototype_reverse_iterator, 1,
+ njs_array_func(NJS_ARRAY_REDUCE_RIGHT)),
+
+ NJS_DECLARE_PROP_NATIVE("reverse", njs_array_prototype_reverse, 0, 0),
+
+ NJS_DECLARE_PROP_NATIVE("shift", njs_array_prototype_shift, 0, 0),
+
+ NJS_DECLARE_PROP_NATIVE("slice", njs_array_prototype_slice, 2, 0),
+
+ NJS_DECLARE_PROP_NATIVE("some", njs_array_prototype_iterator, 1,
+ njs_array_func(NJS_ARRAY_SOME)),
+
+ NJS_DECLARE_PROP_NATIVE("sort", njs_array_prototype_sort, 1, 0),
+
+ NJS_DECLARE_PROP_NATIVE("splice", njs_array_prototype_splice, 2, 0),
+
+ NJS_DECLARE_PROP_NATIVE("toString", njs_array_prototype_to_string, 0, 0),
+
+ NJS_DECLARE_PROP_NATIVE("unshift", njs_array_prototype_unshift, 1, 0),
+
+ NJS_DECLARE_PROP_NATIVE("values", njs_array_prototype_iterator_obj, 0,
+ NJS_ENUM_VALUES),

{
.type = NJS_PROPERTY,
.name = njs_wellknown_symbol(NJS_SYMBOL_ITERATOR),
- .value = njs_native_function2(njs_array_prototype_iterator_obj, 0,
- NJS_ENUM_VALUES),
+ .u.value = njs_native_function2(njs_array_prototype_iterator_obj, 0,
+ NJS_ENUM_VALUES),
.writable = 1,
.configurable = 1,
},
@@ -3123,12 +2924,8 @@ const njs_object_init_t njs_array_proto

const njs_object_prop_t njs_array_instance_properties[] =
{
- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("length"),
- .value = njs_prop_handler(njs_array_length),
- .writable = 1
- },
+ NJS_DECLARE_PROP_HANDLER("length", njs_array_length, 0, 0,
+ NJS_OBJECT_PROP_VALUE_W),
};


diff -r 96a0be3dfb0b -r 109e6cb4dea5 src/njs_array_buffer.c
--- a/src/njs_array_buffer.c Tue Oct 25 09:19:14 2022 -0700
+++ b/src/njs_array_buffer.c Tue Oct 25 09:19:32 2022 -0700
@@ -141,44 +141,21 @@ njs_array_buffer_writable(njs_vm_t *vm,

static const njs_object_prop_t njs_array_buffer_constructor_properties[] =
{
- {
- .type = NJS_PROPERTY,
- .name = njs_string("name"),
- .value = njs_string("ArrayBuffer"),
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_NAME("ArrayBuffer"),
+
+ NJS_DECLARE_PROP_LENGTH(1),
+
+ NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),

{
- .type = NJS_PROPERTY,
- .name = njs_string("length"),
- .value = njs_value(NJS_NUMBER, 1, 1.0),
+ .type = NJS_ACCESSOR,
+ .name = njs_wellknown_symbol(NJS_SYMBOL_SPECIES),
+ .u.accessor = njs_getter(njs_array_buffer_get_this, 0),
+ .writable = NJS_ATTRIBUTE_UNSET,
.configurable = 1,
},

- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("prototype"),
- .value = njs_prop_handler(njs_object_prototype_create),
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_wellknown_symbol(NJS_SYMBOL_SPECIES),
- .value = njs_value(NJS_INVALID, 1, NAN),
- .getter = njs_native_function(njs_array_buffer_get_this, 0),
- .setter = njs_value(NJS_UNDEFINED, 0, NAN),
- .writable = NJS_ATTRIBUTE_UNSET,
- .configurable = 1,
- .enumerable = 0,
- },
-
- {
- .type = NJS_PROPERTY,
- .name = njs_string("isView"),
- .value = njs_native_function(njs_array_buffer_is_view, 1),
- .writable = 1,
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_NATIVE("isView", njs_array_buffer_is_view, 1, 0),
};


@@ -265,39 +242,19 @@ njs_array_buffer_prototype_slice(njs_vm_

static const njs_object_prop_t njs_array_buffer_prototype_properties[] =
{
- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("constructor"),
- .value = njs_prop_handler(njs_object_prototype_create_constructor),
- .writable = 1,
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_HANDLER("constructor",
+ njs_object_prototype_create_constructor,
+ 0, 0, NJS_OBJECT_PROP_VALUE_CW),

- {
- .type = NJS_PROPERTY,
- .name = njs_string("byteLength"),
- .value = njs_value(NJS_INVALID, 1, NAN),
- .getter = njs_native_function(njs_array_buffer_prototype_byte_length,
- 0),
- .setter = njs_value(NJS_UNDEFINED, 0, NAN),
- .writable = NJS_ATTRIBUTE_UNSET,
- .configurable = 1,
- .enumerable = 0,
- },
+ NJS_DECLARE_PROP_GETTER("byteLength",
+ njs_array_buffer_prototype_byte_length, 0),

- {
- .type = NJS_PROPERTY,
- .name = njs_string("slice"),
- .value = njs_native_function(njs_array_buffer_prototype_slice, 2),
- .writable = 1,
- .configurable = 1,
- .enumerable = 0,
- },
+ NJS_DECLARE_PROP_NATIVE("slice", njs_array_buffer_prototype_slice, 2, 0),

{
.type = NJS_PROPERTY,
.name = njs_wellknown_symbol(NJS_SYMBOL_TO_STRING_TAG),
- .value = njs_string("ArrayBuffer"),
+ .u.value = njs_string("ArrayBuffer"),
.configurable = 1,
},
};
diff -r 96a0be3dfb0b -r 109e6cb4dea5 src/njs_async.c
--- a/src/njs_async.c Tue Oct 25 09:19:14 2022 -0700
+++ b/src/njs_async.c Tue Oct 25 09:19:32 2022 -0700
@@ -167,18 +167,9 @@ njs_async_context_free(njs_vm_t *vm, njs

static const njs_object_prop_t njs_async_constructor_properties[] =
{
- {
- .type = NJS_PROPERTY,
- .name = njs_string("length"),
- .value = njs_value(NJS_NUMBER, 1, 1.0),
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_LENGTH(1),

- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("prototype"),
- .value = njs_prop_handler(njs_object_prototype_create),
- },
+ NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),
};


@@ -193,16 +184,13 @@ static const njs_object_prop_t njs_asyn
{
.type = NJS_PROPERTY,
.name = njs_wellknown_symbol(NJS_SYMBOL_TO_STRING_TAG),
- .value = njs_string("AsyncFunction"),
+ .u.value = njs_string("AsyncFunction"),
.configurable = 1,
},

- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("constructor"),
- .value = njs_prop_handler(njs_object_prototype_create_constructor),
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_HANDLER("constructor",
+ njs_object_prototype_create_constructor,
+ 0, 0, NJS_OBJECT_PROP_VALUE_CW),
};


@@ -222,19 +210,11 @@ const njs_object_type_init_t njs_async_

const njs_object_prop_t njs_async_function_instance_properties[] =
{
- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("length"),
- .value = njs_prop_handler(njs_function_instance_length),
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_HANDLER("length", njs_function_instance_length, 0, 0,
+ NJS_OBJECT_PROP_VALUE_C),

- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("name"),
- .value = njs_prop_handler(njs_function_instance_name),
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_HANDLER("name", njs_function_instance_name, 0, 0,
+ NJS_OBJECT_PROP_VALUE_C),
};


diff -r 96a0be3dfb0b -r 109e6cb4dea5 src/njs_boolean.c
--- a/src/njs_boolean.c Tue Oct 25 09:19:14 2022 -0700
+++ b/src/njs_boolean.c Tue Oct 25 09:19:32 2022 -0700
@@ -43,22 +43,18 @@ static const njs_object_prop_t njs_bool
{
.type = NJS_PROPERTY,
.name = njs_string("name"),
- .value = njs_string("Boolean"),
+ .u.value = njs_string("Boolean"),
.configurable = 1,
},

{
.type = NJS_PROPERTY,
.name = njs_string("length"),
- .value = njs_value(NJS_NUMBER, 1, 1.0),
+ .u.value = njs_value(NJS_NUMBER, 1, 1.0),
.configurable = 1,
},

- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("prototype"),
- .value = njs_prop_handler(njs_object_prototype_create),
- },
+ NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),
};


@@ -122,37 +118,16 @@ njs_boolean_prototype_to_string(njs_vm_t

static const njs_object_prop_t njs_boolean_prototype_properties[] =
{
- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("__proto__"),
- .value = njs_prop_handler(njs_primitive_prototype_get_proto),
- .writable = 1,
- .configurable = 1,
- },
-
- {
- .type = NJS_PROPERTY_HANDLER,
- .name = njs_string("constructor"),
- .value = njs_prop_handler(njs_object_prototype_create_constructor),
- .writable = 1,
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_HANDLER("__proto__", njs_primitive_prototype_get_proto,
+ 0, 0, NJS_OBJECT_PROP_VALUE_CW),

- {
- .type = NJS_PROPERTY,
- .name = njs_string("valueOf"),
- .value = njs_native_function(njs_boolean_prototype_value_of, 0),
- .writable = 1,
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_HANDLER("constructor",
+ njs_object_prototype_create_constructor,
+ 0, 0, NJS_OBJECT_PROP_VALUE_CW),

- {
- .type = NJS_PROPERTY,
- .name = njs_string("toString"),
- .value = njs_native_function(njs_boolean_prototype_to_string, 0),
- .writable = 1,
- .configurable = 1,
- },
+ NJS_DECLARE_PROP_NATIVE("valueOf", njs_boolean_prototype_value_of, 0, 0),
+
+ NJS_DECLARE_PROP_NATIVE("toString", njs_boolean_prototype_to_string, 0, 0),
};


diff -r 96a0be3dfb0b -r 109e6cb4dea5 src/njs_buffer.c
--- a/src/njs_buffer.c Tue Oct 25 09:19:14 2022 -0700
+++ b/src/njs_buffer.c Tue Oct 25 09:19:32 2022 -0700
@@ -310,7 +310,7 @@ next:
&& !(njs_is_object(&retval)
&& njs_object(&retval) == njs_object(value)))
{
- *value = retval;
+ njs_value_assign(value, &retval);
goto next;
}

@@ -2340,467 +2340,154 @@ static const njs_object_prop_t njs_buff
{
.type = NJS_PROPERTY,
_______________________________________________
nginx-devel mailing list -- nginx-devel@nginx.org
To unsubscribe send an email to nginx-devel-leave@nginx.org
Subject Author Views Posted

[njs] Refactored working with an object properties.

Dmitry Volyntsev 479 October 25, 2022 01:06PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 319
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready