Welcome! Log In Create A New Profile

Advanced

[njs] Fixed own properties quering.

Valentin Bartenev
May 06, 2019 11:38AM
details: https://hg.nginx.org/njs/rev/d94c836632c7
branches:
changeset: 949:d94c836632c7
user: Valentin Bartenev <vbart@nginx.com>
date: Mon May 06 11:33:23 2019 +0300
description:
Fixed own properties quering.

njs_property_query() and njs_object_property_query() were simplified.

diffstat:

njs/njs_object.c | 124 +++++++++++++++++-----------------------------
njs/test/njs_unit_test.c | 17 ++++++
2 files changed, 63 insertions(+), 78 deletions(-)

diffs (186 lines):

diff -r 6ee0e7a44e79 -r d94c836632c7 njs/njs_object.c
--- a/njs/njs_object.c Mon May 06 17:47:26 2019 +0300
+++ b/njs/njs_object.c Mon May 06 11:33:23 2019 +0300
@@ -322,39 +322,11 @@ njs_property_query(njs_vm_t *vm, njs_pro
obj = &vm->string_object;
break;

- case NJS_OBJECT_STRING:
- if (nxt_fast_path(!njs_is_null_or_undefined_or_boolean(property))) {
- index = njs_value_to_index(property);
-
- if (nxt_fast_path(index < NJS_STRING_MAX_LENGTH)) {
- ret = njs_string_property_query(vm, pq,
- &object->data.u.object_value->value,
- index);
-
- if (nxt_fast_path(ret != NXT_DECLINED)) {
- return ret;
- }
- }
- }
-
- obj = object->data.u.object;
- break;
-
+ case NJS_OBJECT:
case NJS_ARRAY:
- if (nxt_fast_path(!njs_is_null_or_undefined_or_boolean(property))) {
- index = njs_value_to_index(property);
-
- if (nxt_fast_path(index < NJS_ARRAY_MAX_INDEX)) {
- return njs_array_property_query(vm, pq, object->data.u.array,
- index);
- }
- }
-
- /* Fall through. */
-
- case NJS_OBJECT:
case NJS_OBJECT_BOOLEAN:
case NJS_OBJECT_NUMBER:
+ case NJS_OBJECT_STRING:
case NJS_REGEXP:
case NJS_DATE:
case NJS_OBJECT_ERROR:
@@ -442,62 +414,58 @@ njs_object_property_query(njs_vm_t *vm,
do {
pq->prototype = proto;

- if (nxt_fast_path(!pq->own || proto == object)) {
- ret = nxt_lvlhsh_find(&proto->hash, &pq->lhq);
+ if (!njs_is_null_or_undefined_or_boolean(property)) {
+ switch (proto->type) {
+ case NJS_ARRAY:
+ index = njs_value_to_index(property);
+ if (nxt_fast_path(index < NJS_ARRAY_MAX_INDEX)) {
+ array = (njs_array_t *) proto;
+ return njs_array_property_query(vm, pq, array, index);
+ }
+
+ break;
+
+ case NJS_OBJECT_STRING:
+ index = njs_value_to_index(property);
+ if (nxt_fast_path(index < NJS_STRING_MAX_LENGTH)) {
+ ov = (njs_object_value_t *) proto;
+ ret = njs_string_property_query(vm, pq, &ov->value, index);
+
+ if (nxt_fast_path(ret != NXT_DECLINED)) {
+ return ret;
+ }
+ }
+
+ default:
+ break;
+ }
+ }
+
+ ret = nxt_lvlhsh_find(&proto->hash, &pq->lhq);
+
+ if (ret == NXT_OK) {
+ prop = pq->lhq.value;
+
+ if (prop->type != NJS_WHITEOUT) {
+ pq->shared = 0;
+
+ return ret;
+ }
+
+ } else {
+ ret = nxt_lvlhsh_find(&proto->shared_hash, &pq->lhq);

if (ret == NXT_OK) {
- prop = pq->lhq.value;
-
- if (prop->type != NJS_WHITEOUT) {
- pq->shared = 0;
-
- return ret;
- }
-
- goto next;
- }
-
- if (proto != object
- && !njs_is_null_or_undefined_or_boolean(property))
- {
- switch (proto->type) {
- case NJS_ARRAY:
- index = njs_value_to_index(property);
- if (nxt_fast_path(index < NJS_ARRAY_MAX_INDEX)) {
- array = (njs_array_t *) proto;
- return njs_array_property_query(vm, pq, array, index);
- }
-
- break;
-
- case NJS_OBJECT_STRING:
- index = njs_value_to_index(property);
- if (nxt_fast_path(index < NJS_STRING_MAX_LENGTH)) {
- ov = (njs_object_value_t *) proto;
- return njs_string_property_query(vm, pq, &ov->value,
- index);
- }
-
- default:
- break;
- }
+ pq->shared = 1;
+
+ return ret;
}
}

- ret = nxt_lvlhsh_find(&proto->shared_hash, &pq->lhq);
-
- if (ret == NXT_OK) {
- pq->shared = 1;
-
- return ret;
- }
-
- if (pq->query > NJS_PROPERTY_QUERY_GET) {
+ if (pq->own || pq->query > NJS_PROPERTY_QUERY_GET) {
return NXT_DECLINED;
}

-next:
-
proto = proto->__proto__;

} while (proto != NULL);
diff -r 6ee0e7a44e79 -r d94c836632c7 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c Mon May 06 17:47:26 2019 +0300
+++ b/njs/test/njs_unit_test.c Mon May 06 11:33:23 2019 +0300
@@ -9102,6 +9102,12 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("'s'.hasOwnProperty('1')"),
nxt_string("false") },

+ { nxt_string("Object.hasOwnProperty('hasOwnProperty')"),
+ nxt_string("false") },
+
+ { nxt_string("Object.prototype.hasOwnProperty('hasOwnProperty')"),
+ nxt_string("true") },
+
{ nxt_string("var p = { a:5 }; var o = Object.create(p);"
"Object.getPrototypeOf(o) === p"),
nxt_string("true") },
@@ -9160,6 +9166,17 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Object.create(function(a,b,c){}).length"),
nxt_string("3") },

+ { nxt_string("Object.create(Math).hasOwnProperty('abs')"),
+ nxt_string("false") },
+
+ { nxt_string("var m = Object.create(Math); m.abs = 3;"
+ "[m.hasOwnProperty('abs'), m.abs]"),
+ nxt_string("true,3") },
+
+ { nxt_string("var m = Object.create(Math); m.abs = Math.floor;"
+ "[m.hasOwnProperty('abs'), delete m.abs, m.abs(-1)]"),
+ nxt_string("true,true,1") },
+
{ nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'a').value"),
nxt_string("1") },

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

[njs] Fixed own properties quering.

Valentin Bartenev 360 May 06, 2019 11:38AM



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

Online Users

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