]> git.kaiwu.me - njs.git/commitdiff
Introduced njs_value_buffer_get().
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 2 May 2023 00:54:48 +0000 (17:54 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 2 May 2023 00:54:48 +0000 (17:54 -0700)
external/njs_fs_module.c
src/njs.h
src/njs_buffer.c
src/njs_buffer.h

index 68d4cf67eecba1b6a96c48054d82f3932a1ee351..b9df95c65d19501ba159950d20afbd212306ee0d 100644 (file)
@@ -1405,14 +1405,12 @@ static njs_int_t
 njs_fs_read(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t calltype, njs_value_t *retval)
 {
-    int64_t             fd, length, pos, offset;
-    ssize_t             n;
-    njs_int_t           ret;
-    njs_str_t           data;
-    njs_uint_t          fd_offset;
-    njs_value_t         result, *buffer, *value;
-    njs_typed_array_t   *array;
-    njs_array_buffer_t  *array_buffer;
+    int64_t      fd, length, pos, offset;
+    ssize_t      n;
+    njs_int_t    ret;
+    njs_str_t    data;
+    njs_uint_t   fd_offset;
+    njs_value_t  result, *buffer, *value;
 
     fd_offset = !!(calltype == NJS_FS_DIRECT);
 
@@ -1429,13 +1427,8 @@ njs_fs_read(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
      */
 
     buffer = njs_arg(args, nargs, fd_offset + 1);
-    array = njs_buffer_slot(vm, buffer, "buffer");
-    if (njs_slow_path(array == NULL)) {
-        return NJS_ERROR;
-    }
-
-    array_buffer = njs_typed_array_writable(vm, array);
-    if (njs_slow_path(array_buffer == NULL)) {
+    ret = njs_value_buffer_get(vm, buffer, &data);
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
@@ -1445,14 +1438,14 @@ njs_fs_read(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         return ret;
     }
 
-    if (njs_slow_path(offset < 0 || (size_t) offset > array->byte_length)) {
+    if (njs_slow_path(offset < 0 || (size_t) offset > data.length)) {
         njs_range_error(vm, "offset is out of range (must be <= %z)",
-                        array->byte_length);
+                        data.length);
         return NJS_ERROR;
     }
 
-    data.length = array->byte_length - offset;
-    data.start = &array_buffer->u.u8[array->offset + offset];
+    data.length -= offset;
+    data.start += offset;
 
     value = njs_arg(args, nargs, fd_offset + 3);
 
index 0a051fc79e63bb7f5fe4b54ef20674b0100e7bd2..2d540c14de4a56ceca765b1d8a65e2d89d55b421 100644 (file)
--- a/src/njs.h
+++ b/src/njs.h
@@ -423,6 +423,8 @@ NJS_EXPORT njs_int_t njs_vm_string_compare(const njs_value_t *v1,
 NJS_EXPORT njs_int_t njs_vm_value_array_buffer_set(njs_vm_t *vm,
     njs_value_t *value, const u_char *start, uint32_t size);
 
+NJS_EXPORT njs_int_t njs_value_buffer_get(njs_vm_t *vm, njs_value_t *value,
+    njs_str_t *dst);
 /*
  * Sets a Buffer value.
  *   start data is not copied and should not be freed.
index b40f7aff17c68f84cdc2c405681054f05404c709..5ab506caffa7a2a1e15fdd3016982d4d82fe4a45 100644 (file)
@@ -183,7 +183,7 @@ njs_buffer_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,
 }
 
 
-njs_typed_array_t *
+static njs_typed_array_t *
 njs_buffer_alloc(njs_vm_t *vm, size_t size, njs_bool_t zeroing)
 {
     njs_value_t        value;
@@ -621,7 +621,7 @@ njs_buffer_slot_internal(njs_vm_t *vm, njs_value_t *value)
 }
 
 
-njs_typed_array_t *
+static njs_typed_array_t *
 njs_buffer_slot(njs_vm_t *vm, njs_value_t *value, const char *name)
 {
     njs_typed_array_t  *array;
@@ -637,6 +637,36 @@ njs_buffer_slot(njs_vm_t *vm, njs_value_t *value, const char *name)
 }
 
 
+njs_int_t
+njs_value_buffer_get(njs_vm_t *vm, njs_value_t *value, njs_str_t *dst)
+{
+    njs_typed_array_t   *array;
+    njs_array_buffer_t  *array_buffer;
+
+    if (njs_slow_path(!(njs_is_typed_array(value)
+                        || njs_is_data_view(value))))
+    {
+        njs_type_error(vm, "first argument must be a Buffer or DataView");
+        return NJS_ERROR;
+    }
+
+    array = njs_typed_array(value);
+    if (njs_slow_path(array == NULL)) {
+        return NJS_ERROR;
+    }
+
+    array_buffer = njs_typed_array_writable(vm, array);
+    if (njs_slow_path(array_buffer == NULL)) {
+        return NJS_ERROR;
+    }
+
+    dst->length = array->byte_length;
+    dst->start = &array_buffer->u.u8[array->offset];
+
+    return NJS_OK;
+}
+
+
 static njs_int_t
 njs_buffer_array_range(njs_vm_t *vm, njs_typed_array_t *array,
     const njs_value_t *start, const njs_value_t *end, const char *name,
index a765fedd2ca686d282cdaa99298947cc2bfef623..696653c2dd12ea33d6bf64d31dd6bffe5afaddd7 100644 (file)
@@ -21,14 +21,10 @@ typedef struct {
 } njs_buffer_encoding_t;
 
 
-njs_typed_array_t *njs_buffer_slot(njs_vm_t *vm, njs_value_t *value,
-    const char *name);
 njs_int_t njs_buffer_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,
     uint32_t size);
 njs_int_t njs_buffer_new(njs_vm_t *vm, njs_value_t *value, const u_char *start,
     uint32_t size);
-njs_typed_array_t *njs_buffer_alloc(njs_vm_t *vm, size_t size,
-    njs_bool_t zeroing);
 
 const njs_buffer_encoding_t *njs_buffer_encoding(njs_vm_t *vm,
     const njs_value_t *value, njs_bool_t thrw);