]> git.kaiwu.me - njs.git/commitdiff
Fixed TextDecoder.prototype.decode() with non-zero TypedArray offset.
authorAlexander Borisov <alexander.borisov@nginx.com>
Mon, 7 Sep 2020 14:55:24 +0000 (17:55 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Mon, 7 Sep 2020 14:55:24 +0000 (17:55 +0300)
src/njs_encoding.c
src/njs_typed_array.c
src/njs_typed_array.h
src/test/njs_unit_test.c

index 3cc7cb63b13f52f7d52b1da969d6c4c97fd969c1..01d28af14c30540dd15759cfa0a7323495145000 100644 (file)
@@ -214,7 +214,7 @@ njs_text_encoder_encode_into(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     end = start + str.length;
 
     array = njs_typed_array(dest);
-    to = njs_typed_array_buffer(array)->u.u8;
+    to = njs_typed_array_start(array);
     to_end = to + array->byte_length;
 
     cp = 0;
@@ -564,7 +564,7 @@ njs_text_decoder_decode(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         if (njs_is_typed_array(value)) {
             array = njs_typed_array(value);
 
-            start = array->buffer->u.u8;
+            start = njs_typed_array_start(array);
             end = start + array->byte_length;
 
         } else if (njs_is_array_buffer(value)) {
index be73e5080a02eb5a048d54c141670e292c63d452..e23fd596e72b6979921ca856febabf1d193b73cf 100644 (file)
@@ -610,8 +610,7 @@ njs_typed_array_prototype_byte_offset(njs_vm_t *vm, njs_value_t *args,
 
     array = njs_typed_array(this);
 
-    njs_set_number(&vm->retval, array->offset
-                                * njs_typed_array_element_size(array->type));
+    njs_set_number(&vm->retval, njs_typed_array_offset(array));
 
     return NJS_OK;
 }
index 7e31a7db7b5731e67ac832661c3a8f21f2e686e7..78db766504f67bd3980eef4c182523871296c0fd 100644 (file)
@@ -55,6 +55,20 @@ njs_typed_array_length(const njs_typed_array_t *array)
 }
 
 
+njs_inline uint32_t
+njs_typed_array_offset(const njs_typed_array_t *array)
+{
+    return array->offset * njs_typed_array_element_size(array->type);
+}
+
+
+njs_inline u_char *
+njs_typed_array_start(const njs_typed_array_t *array)
+{
+    return &array->buffer->u.u8[njs_typed_array_offset(array)];
+}
+
+
 njs_inline double
 njs_typed_array_prop(const njs_typed_array_t *array, uint32_t index)
 {
index ed59118ab39ca25851250bda38830a3ce132ca1c..4da0bc0b9ca136efcfd5041d4e55294e050e31cc 100644 (file)
@@ -18226,6 +18226,11 @@ static njs_unit_test_t  njs_test[] =
               "var res = en.encodeInto('ααααα', utf8); njs.dump(res)"),
       njs_str("{read:5,written:10}") },
 
+    { njs_str("var en = new TextEncoder();"
+              "var utf8 = new Uint8Array(10);"
+              "en.encodeInto('ααααα', utf8.subarray(2)); utf8[0]"),
+      njs_str("0") },
+
     { njs_str("var str = String.bytesFrom([0xCE]);"
               "var en = new TextEncoder();"
               "var utf8 = new Uint8Array(3);"
@@ -18333,6 +18338,12 @@ static njs_unit_test_t  njs_test[] =
               "var en = new TextEncoder();"
               "njs.dump(en.encode(de.decode(buf)))"),
       njs_str("Uint8Array [1,0,0,0,2,0,0,0,3,0,0,0]") },
+
+    { njs_str("var de = new TextDecoder();"
+              "var buf = new Uint32Array([1,2,3]).subarray(1,2);"
+              "var en = new TextEncoder();"
+              "njs.dump(en.encode(de.decode(buf)))"),
+      njs_str("Uint8Array [2,0,0,0]") },
 };