Welcome! Log In Create A New Profile

Advanced

[njs] Refactoring njs_value_own_enumerate() and friends.

Dmitry Volyntsev
March 19, 2024 01:58AM
details: https://hg.nginx.org/njs/rev/b0e42db5ca84
branches:
changeset: 2299:b0e42db5ca84
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Fri Mar 15 22:47:50 2024 -0700
description:
Refactoring njs_value_own_enumerate() and friends.

All three flag-like arguments are merged into a single flag argument.

diffstat:

src/njs_array.c | 4 +-
src/njs_builtin.c | 2 +-
src/njs_json.c | 8 +-
src/njs_object.c | 154 +++++++++++++++++++++++++----------------------------
src/njs_object.h | 4 +-
src/njs_value.c | 20 ++----
src/njs_value.h | 21 +++---
src/njs_vm.c | 4 +-
src/njs_vmcode.c | 6 +-
9 files changed, 106 insertions(+), 117 deletions(-)

diffs (727 lines):

diff -r 6808a27d254a -r b0e42db5ca84 src/njs_array.c
--- a/src/njs_array.c Thu Mar 14 23:28:03 2024 -0700
+++ b/src/njs_array.c Fri Mar 15 22:47:50 2024 -0700
@@ -1868,8 +1868,8 @@ njs_array_keys(njs_vm_t *vm, njs_value_t
{
njs_array_t *keys;

- keys = njs_value_own_enumerate(vm, object, NJS_ENUM_KEYS, NJS_ENUM_STRING,
- all);
+ keys = njs_value_own_enumerate(vm, object, NJS_ENUM_KEYS | NJS_ENUM_STRING
+ | (!all ? NJS_ENUM_ENUMERABLE_ONLY : 0));
if (njs_slow_path(keys == NULL)) {
return NULL;
}
diff -r 6808a27d254a -r b0e42db5ca84 src/njs_builtin.c
--- a/src/njs_builtin.c Thu Mar 14 23:28:03 2024 -0700
+++ b/src/njs_builtin.c Fri Mar 15 22:47:50 2024 -0700
@@ -648,7 +648,7 @@ njs_object_completions(njs_vm_t *vm, njs
object->type = NJS_OBJECT;
}

- keys = njs_value_enumerate(vm, object, NJS_ENUM_KEYS, NJS_ENUM_STRING, 1);
+ keys = njs_value_enumerate(vm, object, NJS_ENUM_KEYS | NJS_ENUM_STRING);
if (njs_slow_path(keys == NULL)) {
goto done;
}
diff -r 6808a27d254a -r b0e42db5ca84 src/njs_json.c
--- a/src/njs_json.c Thu Mar 14 23:28:03 2024 -0700
+++ b/src/njs_json.c Fri Mar 15 22:47:50 2024 -0700
@@ -44,7 +44,7 @@ typedef struct {
njs_value_t replacer;
njs_str_t space;
u_char space_buf[16];
- njs_object_enum_type_t keys_type;
+ uint32_t keys_type;
} njs_json_stringify_t;


@@ -998,8 +998,10 @@ njs_json_push_stringify_state(njs_json_s
}

} else {
- state->keys = njs_value_own_enumerate(stringify->vm, value, NJS_ENUM_KEYS,
- stringify->keys_type, 0);
+ state->keys = njs_value_own_enumerate(stringify->vm, value,
+ NJS_ENUM_KEYS
+ | stringify->keys_type
+ | NJS_ENUM_ENUMERABLE_ONLY);

if (njs_slow_path(state->keys == NULL)) {
return NULL;
diff -r 6808a27d254a -r b0e42db5ca84 src/njs_object.c
--- a/src/njs_object.c Thu Mar 14 23:28:03 2024 -0700
+++ b/src/njs_object.c Fri Mar 15 22:47:50 2024 -0700
@@ -18,17 +18,16 @@ static njs_int_t njs_object_hash_test(nj
static njs_object_prop_t *njs_object_exist_in_proto(const njs_object_t *begin,
const njs_object_t *end, njs_lvlhsh_query_t *lhq);
static njs_int_t njs_object_enumerate_array(njs_vm_t *vm,
- const njs_array_t *array, njs_array_t *items, njs_object_enum_t kind);
+ const njs_array_t *array, njs_array_t *items, uint32_t flags);
static njs_int_t njs_object_enumerate_typed_array(njs_vm_t *vm,
- const njs_typed_array_t *array, njs_array_t *items, njs_object_enum_t kind);
+ const njs_typed_array_t *array, njs_array_t *items, uint32_t flags);
static njs_int_t njs_object_enumerate_string(njs_vm_t *vm,
- const njs_value_t *value, njs_array_t *items, njs_object_enum_t kind);
+ const njs_value_t *value, njs_array_t *items, uint32_t flags);
static njs_int_t njs_object_enumerate_object(njs_vm_t *vm,
- const njs_object_t *object, njs_array_t *items, njs_object_enum_t kind,
- njs_object_enum_type_t type, njs_bool_t all);
+ const njs_object_t *object, njs_array_t *items, uint32_t flags);
static njs_int_t njs_object_own_enumerate_object(njs_vm_t *vm,
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);
+ uint32_t flags);
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_value_t *retval);
static njs_int_t njs_object_set_prototype(njs_vm_t *vm, njs_object_t *object,
@@ -324,8 +323,8 @@ njs_object_keys(njs_vm_t *vm, njs_value_
return NJS_ERROR;
}

- keys = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS,
- NJS_ENUM_STRING, 0);
+ keys = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS | NJS_ENUM_STRING
+ | NJS_ENUM_ENUMERABLE_ONLY);
if (keys == NULL) {
return NJS_ERROR;
}
@@ -352,8 +351,8 @@ njs_object_values(njs_vm_t *vm, njs_valu
return NJS_ERROR;
}

- array = njs_value_own_enumerate(vm, value, NJS_ENUM_VALUES,
- NJS_ENUM_STRING, 0);
+ array = njs_value_own_enumerate(vm, value, NJS_ENUM_VALUES | NJS_ENUM_STRING
+ | NJS_ENUM_ENUMERABLE_ONLY);
if (array == NULL) {
return NJS_ERROR;
}
@@ -380,8 +379,8 @@ njs_object_entries(njs_vm_t *vm, njs_val
return NJS_ERROR;
}

- array = njs_value_own_enumerate(vm, value, NJS_ENUM_BOTH,
- NJS_ENUM_STRING, 0);
+ array = njs_value_own_enumerate(vm, value, NJS_ENUM_BOTH | NJS_ENUM_STRING
+ | NJS_ENUM_ENUMERABLE_ONLY);
if (array == NULL) {
return NJS_ERROR;
}
@@ -429,23 +428,22 @@ next:

njs_inline njs_int_t
njs_object_enumerate_value(njs_vm_t *vm, const njs_object_t *object,
- njs_array_t *items, njs_object_enum_t kind, njs_object_enum_type_t type,
- njs_bool_t all)
+ njs_array_t *items, uint32_t flags)
{
njs_int_t ret;
njs_object_value_t *obj_val;

- if (type & NJS_ENUM_STRING) {
+ if (flags & NJS_ENUM_STRING) {
switch (object->type) {
case NJS_ARRAY:
ret = njs_object_enumerate_array(vm, (njs_array_t *) object, items,
- kind);
+ flags);
break;

case NJS_TYPED_ARRAY:
ret = njs_object_enumerate_typed_array(vm,
(njs_typed_array_t *) object,
- items, kind);
+ items, flags);
break;

case NJS_OBJECT_VALUE:
@@ -453,7 +451,7 @@ njs_object_enumerate_value(njs_vm_t *vm,

if (njs_is_string(&obj_val->value)) {
ret = njs_object_enumerate_string(vm, &obj_val->value, items,
- kind);
+ flags);
break;
}

@@ -470,7 +468,7 @@ njs_object_enumerate_value(njs_vm_t *vm,

object:

- ret = njs_object_enumerate_object(vm, object, items, kind, type, all);
+ ret = njs_object_enumerate_object(vm, object, items, flags);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
@@ -481,23 +479,22 @@ object:

njs_inline njs_int_t
njs_object_own_enumerate_value(njs_vm_t *vm, 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)
+ const njs_object_t *parent, njs_array_t *items, uint32_t flags)
{
njs_int_t ret;
njs_object_value_t *obj_val;

- if (type & NJS_ENUM_STRING) {
+ if (flags & NJS_ENUM_STRING) {
switch (object->type) {
case NJS_ARRAY:
ret = njs_object_enumerate_array(vm, (njs_array_t *) object, items,
- kind);
+ flags);
break;

case NJS_TYPED_ARRAY:
ret = njs_object_enumerate_typed_array(vm,
(njs_typed_array_t *) object,
- items, kind);
+ items, flags);
break;

case NJS_OBJECT_VALUE:
@@ -505,7 +502,7 @@ njs_object_own_enumerate_value(njs_vm_t

if (njs_is_string(&obj_val->value)) {
ret = njs_object_enumerate_string(vm, &obj_val->value, items,
- kind);
+ flags);
break;
}

@@ -522,8 +519,7 @@ njs_object_own_enumerate_value(njs_vm_t

object:

- ret = njs_object_own_enumerate_object(vm, object, parent, items, kind,
- type, all);
+ ret = njs_object_own_enumerate_object(vm, object, parent, items, flags);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
@@ -534,7 +530,7 @@ object:

njs_array_t *
njs_object_enumerate(njs_vm_t *vm, const njs_object_t *object,
- njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all)
+ uint32_t flags)
{
njs_int_t ret;
njs_array_t *items;
@@ -544,7 +540,7 @@ njs_object_enumerate(njs_vm_t *vm, const
return NULL;
}

- ret = njs_object_enumerate_value(vm, object, items, kind, type, all);
+ ret = njs_object_enumerate_value(vm, object, items, flags);
if (njs_slow_path(ret != NJS_OK)) {
return NULL;
}
@@ -555,7 +551,7 @@ njs_object_enumerate(njs_vm_t *vm, const

njs_array_t *
njs_object_own_enumerate(njs_vm_t *vm, const njs_object_t *object,
- njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all)
+ uint32_t flags)
{
njs_int_t ret;
njs_array_t *items;
@@ -565,8 +561,7 @@ njs_object_own_enumerate(njs_vm_t *vm, c
return NULL;
}

- ret = njs_object_own_enumerate_value(vm, object, object, items, kind, type,
- all);
+ ret = njs_object_own_enumerate_value(vm, object, object, items, flags);
if (njs_slow_path(ret != NJS_OK)) {
return NULL;
}
@@ -576,16 +571,16 @@ njs_object_own_enumerate(njs_vm_t *vm, c


njs_inline njs_bool_t
-njs_is_enumerable(const njs_value_t *value, njs_object_enum_type_t type)
+njs_is_enumerable(const njs_value_t *value, uint32_t flags)
{
- return (njs_is_string(value) && (type & NJS_ENUM_STRING))
- || (njs_is_symbol(value) && (type & NJS_ENUM_SYMBOL));
+ return (njs_is_string(value) && (flags & NJS_ENUM_STRING))
+ || (njs_is_symbol(value) && (flags & NJS_ENUM_SYMBOL));
}


static njs_int_t
njs_object_enumerate_array(njs_vm_t *vm, const njs_array_t *array,
- njs_array_t *items, njs_object_enum_t kind)
+ njs_array_t *items, uint32_t flags)
{
njs_int_t ret;
njs_value_t *p, *start, *end;
@@ -600,7 +595,7 @@ njs_object_enumerate_array(njs_vm_t *vm,
p = start;
end = p + array->length;

- switch (kind) {
+ switch (njs_object_enum_kind(flags)) {
case NJS_ENUM_KEYS:
while (p < end) {
if (njs_is_valid(p)) {
@@ -662,7 +657,7 @@ njs_object_enumerate_array(njs_vm_t *vm,

static njs_int_t
njs_object_enumerate_typed_array(njs_vm_t *vm, const njs_typed_array_t *array,
- njs_array_t *items, njs_object_enum_t kind)
+ njs_array_t *items, uint32_t flags)
{
uint32_t i, length;
njs_int_t ret;
@@ -678,7 +673,7 @@ njs_object_enumerate_typed_array(njs_vm_

item = &items->start[items->length];

- switch (kind) {
+ switch (njs_object_enum_kind(flags)) {
case NJS_ENUM_KEYS:
for (i = 0; i < length; i++) {
njs_uint32_to_string(item++, i);
@@ -717,7 +712,7 @@ njs_object_enumerate_typed_array(njs_vm_

static njs_int_t
njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value,
- njs_array_t *items, njs_object_enum_t kind)
+ njs_array_t *items, uint32_t flags)
{
u_char *begin;
uint32_t i, len, size;
@@ -736,7 +731,7 @@ njs_object_enumerate_string(njs_vm_t *vm

item = &items->start[items->length];

- switch (kind) {
+ switch (njs_object_enum_kind(flags)) {
case NJS_ENUM_KEYS:
for (i = 0; i < len; i++) {
njs_uint32_to_string(item++, i);
@@ -843,14 +838,12 @@ njs_object_enumerate_string(njs_vm_t *vm

static njs_int_t
njs_object_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
- njs_array_t *items, njs_object_enum_t kind, njs_object_enum_type_t type,
- njs_bool_t all)
+ njs_array_t *items, uint32_t flags)
{
njs_int_t ret;
const njs_object_t *proto;

- ret = njs_object_own_enumerate_object(vm, object, object, items, kind,
- type, all);
+ ret = njs_object_own_enumerate_object(vm, object, object, items, flags);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
@@ -858,8 +851,7 @@ njs_object_enumerate_object(njs_vm_t *vm
proto = object->__proto__;

while (proto != NULL) {
- ret = njs_object_own_enumerate_value(vm, proto, object, items, kind,
- type, all);
+ ret = njs_object_own_enumerate_value(vm, proto, object, items, flags);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
@@ -871,8 +863,8 @@ njs_object_enumerate_object(njs_vm_t *vm
}


-#define njs_process_prop(vm, prop, type, items, items_symbol) \
- if (!(type & NJS_ENUM_SYMBOL && njs_is_symbol(&prop->name))) { \
+#define njs_process_prop(vm, prop, flags, items, items_symbol) \
+ if (!(flags & NJS_ENUM_SYMBOL && njs_is_symbol(&prop->name))) { \
/* \
* prop from shared_hash is not symbol: \
* add to items before props from hash \
@@ -897,8 +889,7 @@ njs_object_enumerate_object(njs_vm_t *vm

static njs_int_t
njs_get_own_ordered_keys(njs_vm_t *vm, const njs_object_t *object,
- const njs_object_t *parent, njs_array_t *items,
- njs_object_enum_type_t type, njs_bool_t all)
+ const njs_object_t *parent, njs_array_t *items, uint32_t flags)
{
double num;
uint32_t items_length;
@@ -933,7 +924,7 @@ njs_get_own_ordered_keys(njs_vm_t *vm, c
break;
}

- if (!njs_is_enumerable(&prop->name, type)) {
+ if (!njs_is_enumerable(&prop->name, flags)) {
continue;
}

@@ -947,7 +938,7 @@ njs_get_own_ordered_keys(njs_vm_t *vm, c
ret = njs_lvlhsh_find(&object->hash, &lhq);
if (ret != NJS_OK) {

- if (!(prop->enumerable || all)) {
+ if (!(prop->enumerable || !(flags & NJS_ENUM_ENUMERABLE_ONLY))) {
continue;
}

@@ -955,7 +946,7 @@ njs_get_own_ordered_keys(njs_vm_t *vm, c

num = njs_string_to_index(&prop->name);
if (!njs_number_is_integer_index(num)) {
- njs_process_prop(vm, prop, type, items_string, items_symbol);
+ njs_process_prop(vm, prop, flags, items_string, items_symbol);

} else {
ret = njs_array_add(vm, items, &prop->name);
@@ -966,7 +957,9 @@ njs_get_own_ordered_keys(njs_vm_t *vm, c

} else {

- if (!(((njs_object_prop_t *)(lhq.value))->enumerable || all)) {
+ if (!(((njs_object_prop_t *)(lhq.value))->enumerable
+ || !(flags & NJS_ENUM_ENUMERABLE_ONLY)))
+ {
continue;
}

@@ -984,7 +977,7 @@ njs_get_own_ordered_keys(njs_vm_t *vm, c
if (hash_prop->type != NJS_WHITEOUT &&
!(hash_prop->enum_in_object_hash))
{
- njs_process_prop(vm, prop, type, items_string,
+ njs_process_prop(vm, prop, flags, items_string,
items_symbol);
}
}
@@ -1001,8 +994,8 @@ njs_get_own_ordered_keys(njs_vm_t *vm, c
break;
}

- if (!njs_is_enumerable(&prop->name, type) ||
- !(prop->enumerable || all) ||
+ if (!njs_is_enumerable(&prop->name, flags) ||
+ !(prop->enumerable || !(flags & NJS_ENUM_ENUMERABLE_ONLY)) ||
prop->type == NJS_WHITEOUT)
{
continue;
@@ -1031,7 +1024,7 @@ njs_get_own_ordered_keys(njs_vm_t *vm, c

/* select names of not deleted props */

- njs_process_prop(vm, prop, type, items_string,
+ njs_process_prop(vm, prop, flags, items_string,
items_symbol);

} else {
@@ -1040,7 +1033,7 @@ njs_get_own_ordered_keys(njs_vm_t *vm, c
/* select names of not deleted and created again */

if (prop->enum_in_object_hash) {
- njs_process_prop(vm, prop, type, items_string,
+ njs_process_prop(vm, prop, flags, items_string,
items_symbol);
}
}
@@ -1086,7 +1079,7 @@ njs_get_own_ordered_keys(njs_vm_t *vm, c
static njs_int_t
njs_add_obj_prop_kind(njs_vm_t *vm, const njs_object_t *object,
const njs_lvlhsh_t *hash, njs_lvlhsh_query_t *lhq,
- njs_object_enum_t kind, njs_array_t *items)
+ uint32_t flags, njs_array_t *items)
{
njs_int_t ret;
njs_value_t value, *v, value1;
@@ -1124,7 +1117,7 @@ njs_add_obj_prop_kind(njs_vm_t *vm, cons
}

add:
- if (kind != NJS_ENUM_VALUES) {
+ if (njs_object_enum_kind(flags) != NJS_ENUM_VALUES) {
entry = njs_array_alloc(vm, 0, 2, 0);
if (njs_slow_path(entry == NULL)) {
return NJS_ERROR;
@@ -1148,8 +1141,7 @@ add:

static njs_int_t
njs_object_own_enumerate_object(njs_vm_t *vm, 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)
+ const njs_object_t *parent, njs_array_t *items, uint32_t flags)
{
njs_int_t ret;
uint32_t i;
@@ -1161,9 +1153,9 @@ njs_object_own_enumerate_object(njs_vm_t

njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);

- switch (kind) {
+ switch (njs_object_enum_kind(flags)) {
case NJS_ENUM_KEYS:
- ret = njs_get_own_ordered_keys(vm, object, parent, items, type, all);
+ ret = njs_get_own_ordered_keys(vm, object, parent, items, flags);
if (ret != NJS_OK) {
return NJS_ERROR;
}
@@ -1177,8 +1169,7 @@ njs_object_own_enumerate_object(njs_vm_t
return NJS_ERROR;
}

- ret = njs_get_own_ordered_keys(vm, object, parent, items_sorted, type,
- all);
+ ret = njs_get_own_ordered_keys(vm, object, parent, items_sorted, flags);
if (ret != NJS_OK) {
return NJS_ERROR;
}
@@ -1189,7 +1180,7 @@ njs_object_own_enumerate_object(njs_vm_t
njs_object_property_key_set(&lhq, &items_sorted->start[i],
lhe.key_hash);

- ret = njs_add_obj_prop_kind(vm, object, &object->hash, &lhq, kind,
+ ret = njs_add_obj_prop_kind(vm, object, &object->hash, &lhq, flags,
items);
if (ret != NJS_DECLINED) {
if (ret != NJS_OK) {
@@ -1198,7 +1189,7 @@ njs_object_own_enumerate_object(njs_vm_t

} else {
ret = njs_add_obj_prop_kind(vm, object, &object->shared_hash,
- &lhq, kind, items);
+ &lhq, flags, items);
njs_assert(ret != NJS_DECLINED);
if (ret != NJS_OK) {
return NJS_ERROR;
@@ -1277,8 +1268,8 @@ njs_object_traverse(njs_vm_t *vm, njs_ob
s->parent = NULL;
s->index = 0;
njs_set_object(&s->value, object);
- s->keys = njs_value_own_enumerate(vm, &s->value, NJS_ENUM_KEYS,
- NJS_ENUM_STRING | NJS_ENUM_SYMBOL, 1);
+ s->keys = njs_value_own_enumerate(vm, &s->value, NJS_ENUM_KEYS
+ | NJS_ENUM_STRING | NJS_ENUM_SYMBOL);
if (njs_slow_path(s->keys == NULL)) {
return NJS_ERROR;
}
@@ -1357,8 +1348,8 @@ njs_object_traverse(njs_vm_t *vm, njs_ob
s->parent = &s[-1];
s->index = 0;
njs_value_assign(&s->value, &value);
- s->keys = njs_value_own_enumerate(vm, &s->value, NJS_ENUM_KEYS,
- NJS_ENUM_STRING | NJS_ENUM_SYMBOL, 1);
+ s->keys = njs_value_own_enumerate(vm, &s->value, NJS_ENUM_KEYS
+ | NJS_ENUM_STRING | NJS_ENUM_SYMBOL);
if (njs_slow_path(s->keys == NULL)) {
return NJS_ERROR;
}
@@ -1429,8 +1420,8 @@ njs_object_define_properties(njs_vm_t *v
return ret;
}

- keys = njs_value_own_enumerate(vm, descs, NJS_ENUM_KEYS,
- NJS_ENUM_STRING | NJS_ENUM_SYMBOL, 0);
+ keys = njs_value_own_enumerate(vm, descs, NJS_ENUM_KEYS | NJS_ENUM_STRING
+ | NJS_ENUM_SYMBOL);
if (njs_slow_path(keys == NULL)) {
return NJS_ERROR;
}
@@ -1517,8 +1508,8 @@ njs_object_get_own_property_descriptors(
return NJS_ERROR;
}

- names = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS,
- NJS_ENUM_STRING | NJS_ENUM_SYMBOL, 1);
+ names = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS | NJS_ENUM_STRING
+ | NJS_ENUM_SYMBOL);
if (njs_slow_path(names == NULL)) {
return NJS_ERROR;
}
@@ -1586,8 +1577,7 @@ njs_object_get_own_property(njs_vm_t *vm
return NJS_ERROR;
}

- names = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS,
- type, 1);
+ names = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS | type);
if (names == NULL) {
return NJS_ERROR;
}
@@ -1876,8 +1866,8 @@ njs_object_assign(njs_vm_t *vm, njs_valu
for (i = 2; i < nargs; i++) {
source = &args[i];

- names = njs_value_own_enumerate(vm, source, NJS_ENUM_KEYS,
- NJS_ENUM_STRING | NJS_ENUM_SYMBOL, 1);
+ names = njs_value_own_enumerate(vm, source, NJS_ENUM_KEYS
+ | NJS_ENUM_STRING | NJS_ENUM_SYMBOL);
if (njs_slow_path(names == NULL)) {
return NJS_ERROR;
}
diff -r 6808a27d254a -r b0e42db5ca84 src/njs_object.h
--- a/src/njs_object.h Thu Mar 14 23:28:03 2024 -0700
+++ b/src/njs_object.h Fri Mar 15 22:47:50 2024 -0700
@@ -67,9 +67,9 @@ njs_object_t *njs_object_value_copy(njs_
njs_object_value_t *njs_object_value_alloc(njs_vm_t *vm, njs_uint_t index,
size_t extra,const njs_value_t *value);
njs_array_t *njs_object_enumerate(njs_vm_t *vm, const njs_object_t *object,
- njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all);
+ uint32_t flags);
njs_array_t *njs_object_own_enumerate(njs_vm_t *vm, const njs_object_t *object,
- njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all);
+ uint32_t flags);
njs_int_t njs_object_traverse(njs_vm_t *vm, njs_object_t *object, void *ctx,
njs_object_traverse_cb_t cb);
njs_int_t njs_object_hash_create(njs_vm_t *vm, njs_lvlhsh_t *hash,
diff -r 6808a27d254a -r b0e42db5ca84 src/njs_value.c
--- a/src/njs_value.c Thu Mar 14 23:28:03 2024 -0700
+++ b/src/njs_value.c Fri Mar 15 22:47:50 2024 -0700
@@ -136,8 +136,7 @@ njs_value_to_primitive(njs_vm_t *vm, njs


njs_array_t *
-njs_value_enumerate(njs_vm_t *vm, njs_value_t *value,
- njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all)
+njs_value_enumerate(njs_vm_t *vm, njs_value_t *value, uint32_t flags)
{
njs_int_t ret;
njs_value_t keys;
@@ -145,7 +144,7 @@ njs_value_enumerate(njs_vm_t *vm, njs_va
njs_exotic_slots_t *slots;

if (njs_is_object(value)) {
- if (kind == NJS_ENUM_KEYS && (type & NJS_ENUM_STRING)) {
+ if ((flags & NJS_ENUM_KEYS) && (flags & NJS_ENUM_STRING)) {
slots = njs_object_slots(value);
if (slots != NULL && slots->keys != NULL) {
ret = slots->keys(vm, value, &keys);
@@ -157,7 +156,7 @@ njs_value_enumerate(njs_vm_t *vm, njs_va
}
}

- return njs_object_enumerate(vm, njs_object(value), kind, type, all);
+ return njs_object_enumerate(vm, njs_object(value), flags);
}

if (value->type != NJS_STRING) {
@@ -167,13 +166,12 @@ njs_value_enumerate(njs_vm_t *vm, njs_va
obj_val.object = vm->string_object;
obj_val.value = *value;

- return njs_object_enumerate(vm, (njs_object_t *) &obj_val, kind, type, all);
+ return njs_object_enumerate(vm, (njs_object_t *) &obj_val, flags);
}


njs_array_t *
-njs_value_own_enumerate(njs_vm_t *vm, njs_value_t *value,
- njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all)
+njs_value_own_enumerate(njs_vm_t *vm, njs_value_t *value, uint32_t flags)
{
njs_int_t ret, len;
njs_array_t *values, *entry;
@@ -184,8 +182,7 @@ njs_value_own_enumerate(njs_vm_t *vm, nj
if (njs_is_object(value)) {
slots = njs_object_slots(value);
if (slots == NULL || slots->keys == NULL) {
- return njs_object_own_enumerate(vm, njs_object(value), kind, type,
- all);
+ return njs_object_own_enumerate(vm, njs_object(value), flags);
}

ret = slots->keys(vm, value, &keys);
@@ -193,7 +190,7 @@ njs_value_own_enumerate(njs_vm_t *vm, nj
return NULL;
}

- switch (kind) {
+ switch (njs_object_enum_kind(flags)) {
case NJS_ENUM_KEYS:
return njs_array(&keys);

@@ -258,8 +255,7 @@ njs_value_own_enumerate(njs_vm_t *vm, nj
obj_val.object = vm->string_object;
obj_val.value = *value;

- return njs_object_own_enumerate(vm, (njs_object_t *) &obj_val, kind,
- type, all);
+ return njs_object_own_enumerate(vm, (njs_object_t *) &obj_val, flags);
}


diff -r 6808a27d254a -r b0e42db5ca84 src/njs_value.h
--- a/src/njs_value.h Thu Mar 14 23:28:03 2024 -0700
+++ b/src/njs_value.h Fri Mar 15 22:47:50 2024 -0700
@@ -313,19 +313,18 @@ struct njs_object_type_init_s {


typedef enum {
- NJS_ENUM_KEYS,
- NJS_ENUM_VALUES,
- NJS_ENUM_BOTH,
+#define njs_object_enum_kind(flags) (flags & 7)
+ NJS_ENUM_KEYS = 1,
+ NJS_ENUM_VALUES = 2,
+ NJS_ENUM_BOTH = 4,
+#define njs_object_enum(flags) (flags & (NJS_ENUM_STRING | NJS_ENUM_SYMBOL))
+ NJS_ENUM_STRING = 8,
+ NJS_ENUM_SYMBOL = 16,
+ NJS_ENUM_ENUMERABLE_ONLY = 32,
} njs_object_enum_t;


typedef enum {
- NJS_ENUM_STRING = 1,
- NJS_ENUM_SYMBOL = 2,
-} njs_object_enum_type_t;
-
-
-typedef enum {
NJS_PROPERTY = 0,
NJS_ACCESSOR,
NJS_PROPERTY_REF,
@@ -1032,9 +1031,9 @@ njs_set_object_value(njs_value_t *value,
njs_int_t njs_value_to_primitive(njs_vm_t *vm, njs_value_t *dst,
njs_value_t *value, njs_uint_t hint);
njs_array_t *njs_value_enumerate(njs_vm_t *vm, njs_value_t *value,
- njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all);
+ uint32_t flags);
njs_array_t *njs_value_own_enumerate(njs_vm_t *vm, njs_value_t *value,
- njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all);
+ uint32_t flags);
njs_int_t njs_value_of(njs_vm_t *vm, njs_value_t *value, njs_value_t *retval);
njs_int_t njs_value_length(njs_vm_t *vm, njs_value_t *value, int64_t *dst);
const char *njs_type_string(njs_value_type_t type);
diff -r 6808a27d254a -r b0e42db5ca84 src/njs_vm.c
--- a/src/njs_vm.c Thu Mar 14 23:28:03 2024 -0700
+++ b/src/njs_vm.c Fri Mar 15 22:47:50 2024 -0700
@@ -1188,8 +1188,8 @@ njs_vm_object_keys(njs_vm_t *vm, njs_val
{
njs_array_t *keys;

- keys = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS,
- NJS_ENUM_STRING, 0);
+ keys = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS | NJS_ENUM_STRING
+ | NJS_ENUM_ENUMERABLE_ONLY);
if (njs_slow_path(keys == NULL)) {
return NULL;
}
diff -r 6808a27d254a -r b0e42db5ca84 src/njs_vmcode.c
--- a/src/njs_vmcode.c Thu Mar 14 23:28:03 2024 -0700
+++ b/src/njs_vmcode.c Fri Mar 15 22:47:50 2024 -0700
@@ -2164,8 +2164,10 @@ njs_vmcode_property_foreach(njs_vm_t *vm
}

next->index = 0;
- next->array = njs_value_enumerate(vm, object, NJS_ENUM_KEYS,
- NJS_ENUM_STRING, 0);
+ next->array = njs_value_enumerate(vm, object,
+ NJS_ENUM_KEYS
+ | NJS_ENUM_STRING
+ | NJS_ENUM_ENUMERABLE_ONLY);
if (njs_slow_path(next->array == NULL)) {
njs_memory_error(vm);
return NJS_ERROR;
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Refactoring njs_value_own_enumerate() and friends.

Dmitry Volyntsev 107 March 19, 2024 01:58AM



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

Online Users

Guests: 152
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