]> git.kaiwu.me - njs.git/commitdiff
Added %TypedArray%.prototype.toReversed().
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 27 May 2023 04:05:15 +0000 (21:05 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Sat, 27 May 2023 04:05:15 +0000 (21:05 -0700)
src/njs_typed_array.c
src/test/njs_unit_test.c

index eb8317ff4c7f2274530ec6afd78b6024cd741d98..4a4e5ffcde2a1d259eeebb0d2e5a49ad6c566e25 100644 (file)
@@ -1609,15 +1609,15 @@ njs_typed_array_prototype_reduce(njs_vm_t *vm, njs_value_t *args,
 
 static njs_int_t
 njs_typed_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args,
-    njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
+    njs_uint_t nargs, njs_index_t to_reversed, njs_value_t *retval)
 {
     double              *f64;
     uint8_t             *u8;
     int64_t             i, length;
     uint16_t            *u16;
     uint32_t            *u32;
-    njs_value_t         *this;
-    njs_typed_array_t   *array;
+    njs_value_t         *this, arguments[1];
+    njs_typed_array_t   *array, *self;
     njs_array_buffer_t  *buffer;
 
     this = njs_argument(args, 0);
@@ -1627,8 +1627,24 @@ njs_typed_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args,
     }
 
     array = njs_typed_array(this);
-    length = njs_typed_array_length(array);
+    if (njs_slow_path(njs_is_detached_buffer(array->buffer))) {
+        njs_type_error(vm, "detached buffer");
+        return NJS_ERROR;
+    }
 
+    if (to_reversed) {
+        self = array;
+        njs_set_number(&arguments[0], njs_typed_array_length(self));
+        array = njs_typed_array_alloc(vm, arguments, 1, 0, self->type);
+        if (njs_slow_path(array == NULL)) {
+            return NJS_ERROR;
+        }
+
+        memcpy(&array->buffer->u.u8[0], &self->buffer->u.u8[0],
+               self->byte_length);
+    }
+
+    length = njs_typed_array_length(array);
     buffer = njs_typed_array_writable(vm, array);
     if (njs_slow_path(buffer == NULL)) {
         return NJS_ERROR;
@@ -2296,6 +2312,9 @@ static const njs_object_prop_t  njs_typed_array_prototype_properties[] =
 
     NJS_DECLARE_PROP_NATIVE("subarray", njs_typed_array_prototype_slice, 2, 0),
 
+    NJS_DECLARE_PROP_NATIVE("toReversed", njs_typed_array_prototype_reverse, 0,
+                            1),
+
     NJS_DECLARE_PROP_NATIVE("toSorted", njs_typed_array_prototype_sort, 1, 1),
 
     NJS_DECLARE_PROP_NATIVE("toString", njs_array_prototype_to_string, 0, 0),
index b185b6e32f4bfe9ece83f9ceb8cfeff6d4c718e4..e6d07d550272f0b2793ec717fc795edfcd285b05 100644 (file)
@@ -6708,6 +6708,11 @@ static njs_unit_test_t  njs_test[] =
               ".every(v=>{ return (new v([1,2,3,4])).reverse().join('|') == '4|3|2|1'})"),
       njs_str("true") },
 
+    { njs_str(NJS_TYPED_ARRAY_LIST
+              ".every(v=>{var a = new v([3,2,1]);"
+              "           return [a.toReversed(), a].toString() === '1,2,3,3,2,1'})"),
+      njs_str("true") },
+
     { njs_str("Uint8Array.prototype.sort.call(1)"),
       njs_str("TypeError: this is not a typed array") },