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);
*/
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;
}
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);
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.
}
-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;
}
-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;
}
+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,
} 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);