]> git.kaiwu.me - njs.git/commitdiff
Fixed njs_iterator_to_array() with sparse arrays.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 9 Jun 2022 05:58:34 +0000 (22:58 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 9 Jun 2022 05:58:34 +0000 (22:58 -0700)
This closes #524 issue on Github.

src/njs_iterator.c
src/test/njs_unit_test.c

index 043e4483c7f5848bf65d5d6b24c62c9d0b5e4b24..93096772a5eedf5439c634dedda932aefa193678 100644 (file)
@@ -686,7 +686,8 @@ njs_iterator_to_array(njs_vm_t *vm, njs_value_t *iterator)
         return NULL;
     }
 
-    args.data = njs_array_alloc(vm, 1, length, 0);
+    args.data = njs_array_alloc(vm, 0, 0,
+                                njs_min(length, NJS_ARRAY_LARGE_OBJECT_LENGTH));
     if (njs_slow_path(args.data == NULL)) {
         return NULL;
     }
@@ -708,10 +709,9 @@ static njs_int_t
 njs_iterator_to_array_handler(njs_vm_t *vm, njs_iterator_args_t *args,
     njs_value_t *value, int64_t index)
 {
-    njs_array_t  *array;
+    njs_value_t  array;
 
-    array = args->data;
-    array->start[index] = *value;
+    njs_set_array(&array, args->data);
 
-    return NJS_OK;
+    return njs_value_property_i64_set(vm, &array, index, value);
 }
index 9c19745ac1851d62642d776b724f8832dfab9e15..46197cd2960ff22bae4412baa867e735e2fb092e 100644 (file)
@@ -11299,6 +11299,14 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("let e = AggregateError([1, 2, 3], 'm'); e"),
       njs_str("AggregateError: m") },
 
+    { njs_str("var v = Object.defineProperty([], 1025, {get: () => 1});"
+              "AggregateError(v).errors[23]"),
+      njs_str("undefined") },
+
+    { njs_str("var v = Object.defineProperty([], 2**20, {get: () => 1});"
+              "AggregateError(v).errors[2**19]"),
+      njs_str("undefined") },
+
     /* Memory object is immutable. */
 
     { njs_str("var e = MemoryError('e'); e.name = 'E'"),