Welcome! Log In Create A New Profile

Advanced

[njs] Fixed [[SetPrototypeOf]].

Dmitry Volyntsev
August 14, 2019 01:26PM
details: https://hg.nginx.org/njs/rev/857ecc6fbd25
branches:
changeset: 1130:857ecc6fbd25
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Wed Aug 14 20:22:26 2019 +0300
description:
Fixed [[SetPrototypeOf]].

diffstat:

src/njs_object.c | 21 ++++++++++++---------
src/test/njs_unit_test.c | 22 ++++++++++++++++++++++
2 files changed, 34 insertions(+), 9 deletions(-)

diffs (102 lines):

diff -r 7361a69324ec -r 857ecc6fbd25 src/njs_object.c
--- a/src/njs_object.c Wed Aug 14 20:22:20 2019 +0300
+++ b/src/njs_object.c Wed Aug 14 20:22:26 2019 +0300
@@ -1846,27 +1846,30 @@ const njs_object_init_t njs_object_cons
/*
* ES6, 9.1.2: [[SetPrototypeOf]].
*/
-static njs_bool_t
+static njs_int_t
njs_object_set_prototype_of(njs_vm_t *vm, njs_object_t *object,
const njs_value_t *value)
{
const njs_object_t *proto;

- proto = njs_is_object(value) ? njs_object(value)->__proto__
- : NULL;
+ proto = njs_object(value);

if (njs_slow_path(object->__proto__ == proto)) {
- return 1;
+ return NJS_OK;
+ }
+
+ if (!object->extensible) {
+ return NJS_DECLINED;
}

if (njs_slow_path(proto == NULL)) {
object->__proto__ = NULL;
- return 1;
+ return NJS_OK;
}

do {
if (proto == object) {
- return 0;
+ return NJS_ERROR;
}

proto = proto->__proto__;
@@ -1875,7 +1878,7 @@ njs_object_set_prototype_of(njs_vm_t *vm

object->__proto__ = njs_object(value);

- return 1;
+ return NJS_OK;
}


@@ -1883,7 +1886,7 @@ njs_int_t
njs_object_prototype_proto(njs_vm_t *vm, njs_value_t *value,
njs_value_t *setval, njs_value_t *retval)
{
- njs_bool_t ret;
+ njs_int_t ret;
njs_object_t *proto, *object;

if (!njs_is_object(value)) {
@@ -1896,7 +1899,7 @@ njs_object_prototype_proto(njs_vm_t *vm,
if (setval != NULL) {
if (njs_is_object(setval) || njs_is_null(setval)) {
ret = njs_object_set_prototype_of(vm, object, setval);
- if (njs_slow_path(!ret)) {
+ if (njs_slow_path(ret == NJS_ERROR)) {
njs_type_error(vm, "Cyclic __proto__ value");
return NJS_ERROR;
}
diff -r 7361a69324ec -r 857ecc6fbd25 src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c Wed Aug 14 20:22:20 2019 +0300
+++ b/src/test/njs_unit_test.c Wed Aug 14 20:22:26 2019 +0300
@@ -8782,9 +8782,31 @@ static njs_unit_test_t njs_test[] =
{ njs_str("({__proto__:null, a:1}).a"),
njs_str("1") },

+ { njs_str("Object.getPrototypeOf({__proto__:null})"),
+ njs_str("null") },
+
+ { njs_str("Object.getPrototypeOf({__proto__:1}) === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("Object.getPrototypeOf({__proto__:Array.prototype}) === Array.prototype"),
+ njs_str("true") },
+
{ njs_str("({__proto__: []}) instanceof Array"),
njs_str("true") },

+ { njs_str("({__proto__: Array.prototype}) instanceof Array"),
+ njs_str("true") },
+
+ { njs_str("var o = {};"
+ "o.__proto__ = Array.prototype;"
+ "Object.getPrototypeOf(o) === Array.prototype"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.preventExtensions({});"
+ "o.__proto__ = Array.prototype;"
+ "Object.getPrototypeOf(o) === Object.prototype"),
+ njs_str("true") },
+
{ njs_str("({}).__proto__.constructor === Object"),
njs_str("true") },

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

[njs] Fixed [[SetPrototypeOf]].

Dmitry Volyntsev 40 August 14, 2019 01:26PM



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

Online Users

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