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,
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;
}
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;
}
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;
}
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:
if (njs_is_string(&obj_val->value)) {
ret = njs_object_enumerate_string(vm, &obj_val->value, items,
- kind);
+ flags);
break;
}
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;
}
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:
if (njs_is_string(&obj_val->value)) {
ret = njs_object_enumerate_string(vm, &obj_val->value, items,
- kind);
+ flags);
break;
}
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;
}
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;
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;
}
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;
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;
}
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;
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)) {
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;
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);
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;
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);
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;
}
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;
}
}
-#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 \
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;
break;
}
- if (!njs_is_enumerable(&prop->name, type)) {
+ if (!njs_is_enumerable(&prop->name, flags)) {
continue;
}
ret = njs_lvlhsh_find(&object->hash, &lhq);
if (ret != NJS_OK) {
- if (!(prop->enumerable || all)) {
+ if (!(prop->enumerable || !(flags & NJS_ENUM_ENUMERABLE_ONLY))) {
continue;
}
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);
} else {
- if (!(((njs_object_prop_t *)(lhq.value))->enumerable || all)) {
+ if (!(((njs_object_prop_t *)(lhq.value))->enumerable
+ || !(flags & NJS_ENUM_ENUMERABLE_ONLY)))
+ {
continue;
}
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);
}
}
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;
/* 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 {
/* 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);
}
}
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;
}
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;
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;
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;
}
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;
}
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) {
} 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;
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}