[njs] Improved Object.create().

Dmitry Volyntsev xeioex at nginx.com
Thu Nov 28 12:10:48 UTC 2019


details:   https://hg.nginx.org/njs/rev/5bbbc4361799
branches:  
changeset: 1269:5bbbc4361799
user:      Artem S. Povalyukhin <artem.povaluhin at gmail.com>
date:      Thu Nov 28 13:25:00 2019 +0300
description:
Improved Object.create().

This closes #261 issue on Github.

diffstat:

 src/njs_object.c         |  16 +++++++++++++---
 src/test/njs_unit_test.c |  11 +++++++++++
 2 files changed, 24 insertions(+), 3 deletions(-)

diffs (72 lines):

diff -r 9dfc67399ef5 -r 5bbbc4361799 src/njs_object.c
--- a/src/njs_object.c	Thu Nov 28 09:59:10 2019 +0300
+++ b/src/njs_object.c	Thu Nov 28 13:25:00 2019 +0300
@@ -28,6 +28,8 @@ static njs_int_t njs_object_enumerate_ob
 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);
+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_object_t *
@@ -250,13 +252,11 @@ njs_object_constructor(njs_vm_t *vm, njs
 }
 
 
-/* TODO: properties with attributes. */
-
 static njs_int_t
 njs_object_create(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    njs_value_t   *value;
+    njs_value_t   *value, *descs, arguments[3];
     njs_object_t  *object;
 
     value = njs_arg(args, nargs, 1);
@@ -278,6 +278,16 @@ njs_object_create(njs_vm_t *vm, njs_valu
 
         njs_set_object(&vm->retval, object);
 
+        descs = njs_arg(args, nargs, 2);
+
+        if (njs_slow_path(!njs_is_undefined(descs))) {
+            arguments[0] = args[0];
+            arguments[1] = vm->retval;
+            arguments[2] = *descs;
+
+            return njs_object_define_properties(vm, arguments, 3, unused);
+        }
+
         return NJS_OK;
     }
 
diff -r 9dfc67399ef5 -r 5bbbc4361799 src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c	Thu Nov 28 09:59:10 2019 +0300
+++ b/src/test/njs_unit_test.c	Thu Nov 28 13:25:00 2019 +0300
@@ -10762,6 +10762,8 @@ static njs_unit_test_t  njs_test[] =
                  "o.__proto__ === p"),
       njs_str("true") },
 
+    /* Object.create() */
+
     { njs_str("var o = Object.create(Object.prototype);"
                  "o.__proto__ === Object.prototype"),
       njs_str("true") },
@@ -10775,6 +10777,15 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("Object.create(1)"),
       njs_str("TypeError: prototype may only be an object or null: number") },
 
+    { njs_str("var o = Object.create(null, { a: { value: 1 } }); o.a"),
+      njs_str("1") },
+
+    { njs_str("var o = Object.create({ a: 0 }, { a: { value: 1 } }); o.a"),
+      njs_str("1") },
+
+    { njs_str("var o = Object.create({ get a() { return this.b; } }, { b: { value: 1 } }); o.a"),
+      njs_str("1") },
+
     { njs_str("var o = {a:1, b:2, c:3};"
                  "Object.keys(o)"),
       njs_str("a,b,c") },


More information about the nginx-devel mailing list