]> git.kaiwu.me - njs.git/commitdiff
Fixed Object.defineProperty() when a recursive descriptor is provided.
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 7 May 2022 01:55:07 +0000 (18:55 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Sat, 7 May 2022 01:55:07 +0000 (18:55 -0700)
This closes #481 issue on Github.

src/njs_array.c
src/test/njs_unit_test.c

index ec3a5da93e1e7a44e1e1c45da98f09ce6e9c9065..2367420dcbdcbbe794e631ce3c3889c984a586d7 100644 (file)
@@ -142,6 +142,10 @@ njs_array_convert_to_slow_array(njs_vm_t *vm, njs_array_t *array)
     njs_value_t        index, value;
     njs_object_prop_t  *prop;
 
+    if (njs_slow_path(!array->object.fast_array)) {
+        return NJS_OK;
+    }
+
     njs_set_array(&value, array);
     array->object.fast_array = 0;
 
index 87d8d46c0c87d4bec5c8cfd53da6aebf153098cf..77ec044e1b711207d871c9168322e064e64dcac0 100644 (file)
@@ -13837,6 +13837,16 @@ static njs_unit_test_t  njs_test[] =
               "d.enumerable && d.writable && d.configurable"),
       njs_str("true") },
 
+    { njs_str("const arr = [1,2];"
+              "function f(arg) {"
+              "        const desc = {get: arg};"
+              "        Object.defineProperty(desc, 'set', desc);"
+              "        Object.defineProperty(arr, 1, desc);"
+              "}"
+              "f(f);"
+              "njs.dump(arr)"),
+      njs_str("[1,'[Getter]']") },
+
     { njs_str("Object.defineProperties()"),
       njs_str("TypeError: Object.defineProperties is called on non-object") },