]> git.kaiwu.me - njs.git/commitdiff
Fixed %TypedArray%.prototype.fill().
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 21 Jan 2020 13:03:30 +0000 (16:03 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 21 Jan 2020 13:03:30 +0000 (16:03 +0300)
For subarrays starting from non-zero offset.

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

index fa43900aeabd6ff5d902655fca80d2d693f98397..aa8689a541c7bdbf2acc4d98bc7733d5d2bb372c 100644 (file)
@@ -491,7 +491,7 @@ njs_typed_array_prototype_fill(njs_vm_t *vm, njs_value_t *args,
     int16_t             i16;
     int32_t             i32;
     uint8_t             u8;
-    int64_t             start, end;
+    int64_t             start, end, offset;
     uint32_t            i, length;
     njs_int_t           ret;
     njs_value_t         *this, *setval, lvalue;
@@ -535,20 +535,22 @@ njs_typed_array_prototype_fill(njs_vm_t *vm, njs_value_t *args,
     njs_set_typed_array(&vm->retval, array);
 
     buffer = array->buffer;
+    offset = array->offset;
 
     switch (array->type) {
     case NJS_OBJ_TYPE_UINT8_CLAMPED_ARRAY:
-        if (num < 0) {
-            num = 0;
+        if (isnan(num) || num < 0) {
+            u8 = 0;
 
         } else if (num > 255) {
-            num = 255;
-        }
+            u8 = 255;
 
-        u8 = lrint(num);
+        } else {
+            u8 = lrint(num);
+        }
 
-        for (i = start; i < end; i++) {
-            buffer->u.u8[i] = u8;
+        if (start < end) {
+            memset(&buffer->u.u8[start + offset], u8, end - start);
         }
 
         break;
@@ -557,8 +559,8 @@ njs_typed_array_prototype_fill(njs_vm_t *vm, njs_value_t *args,
     case NJS_OBJ_TYPE_INT8_ARRAY:
         i8 = njs_number_to_int32(num);
 
-        for (i = start; i < end; i++) {
-            buffer->u.u8[i] = i8;
+        if (start < end) {
+            memset(&buffer->u.u8[start + offset], i8, end - start);
         }
 
         break;
@@ -568,7 +570,7 @@ njs_typed_array_prototype_fill(njs_vm_t *vm, njs_value_t *args,
         i16 = njs_number_to_int32(num);
 
         for (i = start; i < end; i++) {
-            buffer->u.u16[i] = i16;
+            buffer->u.u16[i + offset] = i16;
         }
 
         break;
@@ -578,7 +580,7 @@ njs_typed_array_prototype_fill(njs_vm_t *vm, njs_value_t *args,
         i32 = njs_number_to_int32(num);
 
         for (i = start; i < end; i++) {
-            buffer->u.u32[i] = i32;
+            buffer->u.u32[i + offset] = i32;
         }
 
         break;
@@ -587,7 +589,7 @@ njs_typed_array_prototype_fill(njs_vm_t *vm, njs_value_t *args,
         f32 = num;
 
         for (i = start; i < end; i++) {
-            buffer->u.f32[i] = f32;
+            buffer->u.f32[i + offset] = f32;
         }
 
         break;
@@ -597,7 +599,7 @@ njs_typed_array_prototype_fill(njs_vm_t *vm, njs_value_t *args,
         /* NJS_OBJ_TYPE_FLOAT64_ARRAY. */
 
         for (i = start; i < end; i++) {
-            buffer->u.f64[i] = num;
+            buffer->u.f64[i + offset] = num;
         }
        }
 
index 4a99b1beb08000cba77746e88913db19f66b5c19..a9938a1354c6de0c5ee81eb5183a86db481d178a 100644 (file)
@@ -103,11 +103,9 @@ njs_typed_array_set(njs_typed_array_t *array, uint32_t index, double v)
 
     switch (array->type) {
     case NJS_OBJ_TYPE_UINT8_CLAMPED_ARRAY:
-        if (v < 0) {
+        if (isnan(v) || v < 0) {
             v = 0;
-        }
-
-        if (v > 255) {
+        } else if (v > 255) {
             v = 255;
         }
 
index 0da94018c398ee28ea05088787b1fab4aeb74252..cd4e3ed7ba4d2a6aea4b5342bd85aab66ee72c8e 100644 (file)
@@ -5005,6 +5005,11 @@ static njs_unit_test_t  njs_test[] =
               "       return (a[0] === 1 && a[1] === 12 && a[2] === 3 && a.length == 3)})"),
       njs_str("true") },
 
+    { njs_str(NJS_TYPED_ARRAY_LIST
+              ".every(v=>{var a = new v([0,0,0,0,0]).fill(8, -1, -3); "
+              "       return njs.dump(a) === `${v.name} [0,0,0,0,0]`;})"),
+      njs_str("true") },
+
     { njs_str(NJS_INT_TYPED_ARRAY_LIST
               ".every(v=>{var a = new v([1,2,3]); a.fill('qq', 1, 2); "
               "       return (a[0] === 1 && a[1] === 0 && a[2] === 3 && a.length == 3)})"),
@@ -5340,6 +5345,12 @@ static njs_unit_test_t  njs_test[] =
               "           return  njs.dump(a) === `${v.name} [1,0,0,4]`;})"),
       njs_str("true") },
 
+    { njs_str(NJS_TYPED_ARRAY_LIST
+              ".every(v=>{var a = new v([1,2,3,4]); "
+              "           a.subarray(1,10).fill(0);"
+              "           return  njs.dump(a) === `${v.name} [1,0,0,0]`;})"),
+      njs_str("true") },
+
     { njs_str(NJS_TYPED_ARRAY_LIST
               ".every(v=>{var a = new v([1,2,3]); "
               "           var r = a.subarray(1,3);"