details: https://hg.nginx.org/njs/rev/b0e42db5ca84 branches: changeset: 2299:b0e42db5ca84 user: Dmitry Volyntsev <xei...@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