]> git.kaiwu.me - njs.git/commitdiff
Fixed %TypedArray%.prototype.copyWithin() with nonzero byte offset.
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 5 Jun 2020 11:42:41 +0000 (11:42 +0000)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 5 Jun 2020 11:42:41 +0000 (11:42 +0000)
src/njs_typed_array.c
src/test/njs_unit_test.c

index e9ea2c65475f6614472cf592aca869ba94f092de..1ab8a1be03ad3a5821ef279478775f052e1f9965 100644 (file)
@@ -803,8 +803,8 @@ njs_typed_array_prototype_copy_within(njs_vm_t *vm, njs_value_t *args,
     buffer = njs_typed_array_buffer(array);
     element_size = njs_typed_array_element_size(array->type);
 
-    to = to * element_size;
-    from = from * element_size;
+    to = (to + array->offset) * element_size;
+    from = (from + array->offset) * element_size;
     count = count * element_size;
 
     memmove(&buffer->u.u8[to], &buffer->u.u8[from], count);
index d7ec6ee058080c520390e7bf4305c588cdbf8d6d..263354481cf86842f4b7c21623db9e9b4163f853 100644 (file)
@@ -5719,6 +5719,13 @@ 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 orig = new v([255,255,1,2,3,4,5]);"
+              "           var a = new v(orig.buffer, 2* v.BYTES_PER_ELEMENT);"
+              "           a.copyWithin(0,3);"
+              "           return a.toString() === '4,5,3,4,5'})"),
+      njs_str("true") },
+
     { njs_str(NJS_TYPED_ARRAY_LIST
               ".every(v=>{var a = new v([]); a.sort(); "
               "           return a.toString() === ''})"),