From 1458792ff1eb5c912ed46db6f661b9f0cbc8c2fd Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Fri, 15 Mar 2024 22:47:50 -0700 Subject: [PATCH] Refactoring njs_value_own_enumerate() and friends. All three flag-like arguments are merged into a single flag argument. --- 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(-) diff --git a/src/njs_array.c b/src/njs_array.c index 60c7b90f..e1a85a0d 100644 --- a/src/njs_array.c +++ b/src/njs_array.c @@ -1868,8 +1868,8 @@ njs_array_keys(njs_vm_t *vm, njs_value_t *object, njs_bool_t all) { 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 --git a/src/njs_builtin.c b/src/njs_builtin.c index b9514a0f..bb103b86 100644 --- a/src/njs_builtin.c +++ b/src/njs_builtin.c @@ -648,7 +648,7 @@ njs_object_completions(njs_vm_t *vm, njs_value_t *object, njs_str_t *expression) 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 --git a/src/njs_json.c b/src/njs_json.c index 0c46e93a..01466908 100644 --- a/src/njs_json.c +++ b/src/njs_json.c @@ -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_stringify_t *stringify, } } 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 --git a/src/njs_object.c b/src/njs_object.c index 2a173e8b..f77bb279 100644 --- a/src/njs_object.c +++ b/src/njs_object.c @@ -18,17 +18,16 @@ static njs_int_t njs_object_hash_test(njs_lvlhsh_query_t *lhq, void *data); 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_t *args, njs_uint_t nargs, 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_value_t *args, njs_uint_t nargs, 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_value_t *args, njs_uint_t nargs, 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, const njs_object_t *object, 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, const njs_object_t *object, 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 *vm, const njs_object_t *object, 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 *vm, const njs_object_t *object, 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 njs_object_t *object, 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_object_t *object, 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, const njs_object_t *object, 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, const njs_object_t *object, 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, const njs_array_t *array, 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, const njs_array_t *array, 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_t *vm, const njs_typed_array_t *array, 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_t *vm, const njs_typed_array_t *array, 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, const njs_value_t *value, 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, const njs_value_t *value, 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, const njs_object_t *object, 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, const njs_object_t *object, } -#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, const njs_object_t *object, 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, const njs_object_t *object, 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, const njs_object_t *object, 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, const njs_object_t *object, 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, const njs_object_t *object, } 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, const njs_object_t *object, 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, const njs_object_t *object, 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, const njs_object_t *object, /* 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, const njs_object_t *object, /* 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, const njs_object_t *object, 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, const njs_object_t *object, } 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 *vm, const njs_object_t *object, 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 *vm, const njs_object_t *object, 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 *vm, const njs_object_t *object, 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 *vm, const njs_object_t *object, } 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_object_t *object, void *ctx, 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_object_t *object, void *ctx, 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 *vm, njs_value_t *args, njs_uint_t nargs, 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(njs_vm_t *vm, njs_value_t *args, 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, njs_value_t *args, 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_value_t *args, njs_uint_t nargs, 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 --git a/src/njs_object.h b/src/njs_object.h index 1ed0b69e..c6ae14b8 100644 --- a/src/njs_object.h +++ b/src/njs_object.h @@ -67,9 +67,9 @@ njs_object_t *njs_object_value_copy(njs_vm_t *vm, njs_value_t *value); 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 --git a/src/njs_value.c b/src/njs_value.c index cf3f8ffc..a575f9af 100644 --- a/src/njs_value.c +++ b/src/njs_value.c @@ -136,8 +136,7 @@ njs_value_to_primitive(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value, 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_value_t *value, 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_value_t *value, } } - 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_value_t *value, 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, njs_value_t *value, 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, njs_value_t *value, 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, njs_value_t *value, 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 --git a/src/njs_value.h b/src/njs_value.h index 70c3dd42..57f9790e 100644 --- a/src/njs_value.h +++ b/src/njs_value.h @@ -313,18 +313,17 @@ 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, @@ -1032,9 +1031,9 @@ njs_set_object_value(njs_value_t *value, njs_object_value_t *object_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 --git a/src/njs_vm.c b/src/njs_vm.c index eee6dfbe..9c8be437 100644 --- a/src/njs_vm.c +++ b/src/njs_vm.c @@ -1188,8 +1188,8 @@ njs_vm_object_keys(njs_vm_t *vm, njs_value_t *value, njs_value_t *retval) { 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 --git a/src/njs_vmcode.c b/src/njs_vmcode.c index 32feda02..5d889aaf 100644 --- a/src/njs_vmcode.c +++ b/src/njs_vmcode.c @@ -2164,8 +2164,10 @@ njs_vmcode_property_foreach(njs_vm_t *vm, njs_value_t *object, } 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; -- 2.47.3