]> git.kaiwu.me - njs.git/commitdiff
Fixed %TypedArray%.prototype.set(s) when s element changes "this".
authorDmitry Volyntsev <xeioex@nginx.com>
Mon, 7 Nov 2022 22:22:41 +0000 (14:22 -0800)
committerDmitry Volyntsev <xeioex@nginx.com>
Mon, 7 Nov 2022 22:22:41 +0000 (14:22 -0800)
This closes #590 issue on Github.

src/njs_typed_array.c
src/test/njs_unit_test.c

index 0124c431e073a74ac3c467c18bf96cefe4a878ed..f039a1066cbbf5000bed0b426a361cc70c93859c 100644 (file)
@@ -694,7 +694,6 @@ njs_typed_array_prototype_set(njs_vm_t *vm, njs_value_t *args,
     int64_t             i, length, src_length, offset;
     njs_int_t           ret;
     njs_value_t         *this, *src, *value, prop;
-    njs_array_t         *array;
     njs_typed_array_t   *self, *src_tarray;
     njs_array_buffer_t  *buffer;
 
@@ -749,29 +748,6 @@ njs_typed_array_prototype_set(njs_vm_t *vm, njs_value_t *args,
         }
 
     } else {
-        if (njs_is_fast_array(src)) {
-            array = njs_array(src);
-            src_length = array->length;
-
-            if (njs_slow_path((src_length > length)
-                              || (offset > length - src_length)))
-            {
-                njs_range_error(vm, "source is too large");
-                return NJS_ERROR;
-            }
-
-            length = njs_min(array->length, length - offset);
-
-            for (i = 0; i < length; i++) {
-                ret = njs_value_to_number(vm, &array->start[i], &num);
-                if (ret == NJS_OK) {
-                    njs_typed_array_prop_set(vm, self, offset + i, num);
-                }
-            }
-
-            goto done;
-        }
-
         ret = njs_value_to_object(vm, src);
         if (njs_slow_path(ret != NJS_OK)) {
             return ret;
@@ -815,8 +791,6 @@ njs_typed_array_prototype_set(njs_vm_t *vm, njs_value_t *args,
         }
     }
 
-done:
-
     njs_set_undefined(&vm->retval);
 
     return NJS_OK;
index dc56d7e48322d1e803b2168c3969aab212036000..7134423ab2916004e91a765a5819fe5742bd6f38 100644 (file)
@@ -6585,6 +6585,15 @@ static njs_unit_test_t  njs_test[] =
               "           return a.toString() === '1,2,3,3'})"),
       njs_str("true") },
 
+    { njs_str(NJS_TYPED_ARRAY_LIST
+              ".every(v=>{ var a = [];"
+              "            var b = {toString() {a.length = 65535; return 99;}};"
+              "            for (var c = 0; c < 3; c++) { a[c] = b; }"
+              "            var ta = new v(6); ta.set(a);"
+              "            return ta.toString() == '99,99,99,0,0,0';"
+              "          })"),
+      njs_str("true") },
+
     { njs_str("(new Float32Array([255,255,NaN,3,NaN,Infinity,3,-Infinity,0,-0,2,1,-5])).slice(2).sort()"),
       njs_str("-Infinity,-5,0,0,1,2,3,3,Infinity,NaN,NaN") },