details: https://hg.nginx.org/njs/rev/830c81bb573f branches: changeset: 2098:830c81bb573f user: Dmitry Volyntsev <xei...@nginx.com> date: Mon May 01 17:54:48 2023 -0700 description: Introduced njs_value_buffer_get().
diffstat: 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(-) diffs (147 lines): diff -r 1776189b0de6 -r 830c81bb573f external/njs_fs_module.c --- a/external/njs_fs_module.c Tue May 02 20:33:30 2023 -0700 +++ b/external/njs_fs_module.c Mon May 01 17:54:48 2023 -0700 @@ -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 *a */ 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 *a 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 -r 1776189b0de6 -r 830c81bb573f src/njs.h --- a/src/njs.h Tue May 02 20:33:30 2023 -0700 +++ b/src/njs.h Mon May 01 17:54:48 2023 -0700 @@ -423,6 +423,8 @@ NJS_EXPORT njs_int_t njs_vm_string_compa 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 -r 1776189b0de6 -r 830c81bb573f src/njs_buffer.c --- a/src/njs_buffer.c Tue May 02 20:33:30 2023 -0700 +++ b/src/njs_buffer.c Mon May 01 17:54:48 2023 -0700 @@ -183,7 +183,7 @@ njs_buffer_set(njs_vm_t *vm, njs_value_t } -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, n } -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_ } +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 -r 1776189b0de6 -r 830c81bb573f src/njs_buffer.h --- a/src/njs_buffer.h Tue May 02 20:33:30 2023 -0700 +++ b/src/njs_buffer.h Mon May 01 17:54:48 2023 -0700 @@ -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); _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel