From 263f46b3eee86e4e0e54522e9c1dd7cc3e796b0a Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Mon, 1 May 2023 17:54:48 -0700 Subject: [PATCH] Introduced njs_value_buffer_get(). --- external/njs_fs_module.c | 31 ++++++++++++------------------- src/njs.h | 2 ++ src/njs_buffer.c | 34 ++++++++++++++++++++++++++++++++-- src/njs_buffer.h | 4 ---- 4 files changed, 46 insertions(+), 25 deletions(-) diff --git a/external/njs_fs_module.c b/external/njs_fs_module.c index 68d4cf67..b9df95c6 100644 --- a/external/njs_fs_module.c +++ b/external/njs_fs_module.c @@ -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); diff --git a/src/njs.h b/src/njs.h index 0a051fc7..2d540c14 100644 --- 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. diff --git a/src/njs_buffer.c b/src/njs_buffer.c index b40f7aff..5ab506ca 100644 --- a/src/njs_buffer.c +++ b/src/njs_buffer.c @@ -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, diff --git a/src/njs_buffer.h b/src/njs_buffer.h index a765fedd..696653c2 100644 --- a/src/njs_buffer.h +++ b/src/njs_buffer.h @@ -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); -- 2.47.3