Welcome! Log In Create A New Profile

Advanced

[njs] Improved njs_object_own_enumerate().

Dmitry Volyntsev
June 14, 2019 02:22PM
details: https://hg.nginx.org/njs/rev/fb9621798309
branches:
changeset: 1005:fb9621798309
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Fri Jun 14 21:19:52 2019 +0300
description:
Improved njs_object_own_enumerate().

Enumerating enumerable shared_hash entries even if all is false.

diffstat:

njs/njs_builtin.c | 2 +
njs/njs_json.c | 11 ++++-
njs/njs_object.c | 88 ++++++++++++++++++++++-------------------------
njs/test/njs_unit_test.c | 3 +
4 files changed, 55 insertions(+), 49 deletions(-)

diffs (160 lines):

diff -r 028277f5c551 -r fb9621798309 njs/njs_builtin.c
--- a/njs/njs_builtin.c Tue Jun 11 17:34:59 2019 +0300
+++ b/njs/njs_builtin.c Fri Jun 14 21:19:52 2019 +0300
@@ -1081,6 +1081,8 @@ static const njs_object_prop_t njs_njs_
.type = NJS_PROPERTY,
.name = njs_string("version"),
.value = njs_string(NJS_VERSION),
+ .configurable = 1,
+ .enumerable = 1,
},

{
diff -r 028277f5c551 -r fb9621798309 njs/njs_json.c
--- a/njs/njs_json.c Tue Jun 11 17:34:59 2019 +0300
+++ b/njs/njs_json.c Fri Jun 14 21:19:52 2019 +0300
@@ -2354,6 +2354,7 @@ njs_vm_value_dump(njs_vm_t *vm, nxt_str_
njs_ret_t ret;
nxt_str_t str;
njs_value_t *key, *val, ext_val;
+ njs_object_t *object;
njs_json_state_t *state;
njs_object_prop_t *prop;
nxt_lvlhsh_query_t lhq;
@@ -2446,11 +2447,15 @@ njs_vm_value_dump(njs_vm_t *vm, nxt_str_
val = &ext_val;

} else {
+ object = state->value.data.u.object;
lhq.proto = &njs_object_hash_proto;

- ret = nxt_lvlhsh_find(&state->value.data.u.object->hash, &lhq);
- if (nxt_slow_path(ret == NXT_DECLINED)) {
- break;
+ ret = nxt_lvlhsh_find(&object->hash, &lhq);
+ if (ret == NXT_DECLINED) {
+ ret = nxt_lvlhsh_find(&object->shared_hash, &lhq);
+ if (nxt_slow_path(ret == NXT_DECLINED)) {
+ break;
+ }
}

prop = lhq.value;
diff -r 028277f5c551 -r fb9621798309 njs/njs_object.c
--- a/njs/njs_object.c Tue Jun 11 17:34:59 2019 +0300
+++ b/njs/njs_object.c Fri Jun 14 21:19:52 2019 +0300
@@ -667,29 +667,27 @@ njs_object_own_enumerate_object_length(c
}
}

- if (nxt_slow_path(all)) {
- nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
- hash = &object->shared_hash;
-
- for ( ;; ) {
- prop = nxt_lvlhsh_each(hash, &lhe);
-
- if (prop == NULL) {
- break;
- }
-
- lhq.key_hash = lhe.key_hash;
- njs_string_get(&prop->name, &lhq.key);
-
- lhq.proto = &njs_object_hash_proto;
- ret = nxt_lvlhsh_find(&object->hash, &lhq);
-
- if (ret != NXT_OK) {
- ext_prop = njs_object_exist_in_proto(parent, object, &lhq);
-
- if (ext_prop == NULL) {
- length++;
- }
+ nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+ hash = &object->shared_hash;
+
+ for ( ;; ) {
+ prop = nxt_lvlhsh_each(hash, &lhe);
+
+ if (prop == NULL) {
+ break;
+ }
+
+ lhq.key_hash = lhe.key_hash;
+ njs_string_get(&prop->name, &lhq.key);
+
+ lhq.proto = &njs_object_hash_proto;
+ ret = nxt_lvlhsh_find(&object->hash, &lhq);
+
+ if (ret != NXT_OK) {
+ ext_prop = njs_object_exist_in_proto(parent, object, &lhq);
+
+ if (ext_prop == NULL && (prop->enumerable || all)) {
+ length++;
}
}
}
@@ -949,29 +947,27 @@ njs_object_own_enumerate_object(njs_vm_t
}
}

- if (nxt_slow_path(all)) {
- nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
- hash = &object->shared_hash;
-
- for ( ;; ) {
- prop = nxt_lvlhsh_each(hash, &lhe);
-
- if (prop == NULL) {
- break;
- }
-
- lhq.key_hash = lhe.key_hash;
- njs_string_get(&prop->name, &lhq.key);
-
- lhq.proto = &njs_object_hash_proto;
- ret = nxt_lvlhsh_find(&object->hash, &lhq);
-
- if (ret != NXT_OK) {
- ext_prop = njs_object_exist_in_proto(parent, object, &lhq);
-
- if (ext_prop == NULL) {
- njs_string_copy(item++, &prop->name);
- }
+ nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+ hash = &object->shared_hash;
+
+ for ( ;; ) {
+ prop = nxt_lvlhsh_each(hash, &lhe);
+
+ if (prop == NULL) {
+ break;
+ }
+
+ lhq.key_hash = lhe.key_hash;
+ njs_string_get(&prop->name, &lhq.key);
+
+ lhq.proto = &njs_object_hash_proto;
+ ret = nxt_lvlhsh_find(&object->hash, &lhq);
+
+ if (ret != NXT_OK) {
+ ext_prop = njs_object_exist_in_proto(parent, object, &lhq);
+
+ if (ext_prop == NULL && (prop->enumerable || all)) {
+ njs_string_copy(item++, &prop->name);
}
}
}
diff -r 028277f5c551 -r fb9621798309 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c Tue Jun 11 17:34:59 2019 +0300
+++ b/njs/test/njs_unit_test.c Fri Jun 14 21:19:52 2019 +0300
@@ -12278,6 +12278,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("njs.dump($r.header)"),
nxt_string("{type:\"object\",props:[\"getter\",\"foreach\",\"next\"]}") },

+ { nxt_string("njs.dump(njs) == `{version:'${njs.version}'}`"),
+ nxt_string("true") },
+
/* Built-in methods name. */

{ nxt_string(
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Improved njs_object_own_enumerate().

Dmitry Volyntsev 41 June 14, 2019 02:22PM



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

Online Users

Guests: 74
Record Number of Users: 6 on February 13, 2018
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready