njs_int_t ret;
njs_value_t *val1, *val2;
njs_typed_array_t *source, *target;
- njs_array_buffer_t *buffer, *array;
+ njs_array_buffer_t *buffer;
val1 = njs_argument(args, 0);
val2 = njs_arg(args, nargs, 1);
return NJS_ERROR;
}
- array = njs_typed_array_buffer(source);
-
size = njs_min(trg_end - trg, src_end - src);
- if (buffer->u.data != array->u.data) {
+ if (!njs_memory_overlaps(trg, size, src, size)) {
memcpy(trg, src, size);
} else {
(((u_char *) memcpy(dst, src, n)) + (n))
+njs_inline njs_bool_t
+njs_memory_overlaps(const u_char *p1, size_t n1, const u_char *p2, size_t n2)
+{
+ uintptr_t s1, s2;
+
+ s1 = (uintptr_t) p1;
+ s2 = (uintptr_t) p2;
+
+ return (s1 < s2 + n2 && s2 < s1 + n1);
+}
+
+
#define \
njs_strncmp(s1, s2, n) \
strncmp((char *) s1, (char *) s2, n)
static void
njs_slice_memcpy(uint8_t *dst, const uint8_t *src, size_t len)
{
- if (dst + len <= src || dst >= src + len) {
- /* no overlap: can use memcpy */
+ if (!njs_memory_overlaps(dst, len, src, len)) {
memcpy(dst, src, len);
} else {
return buffer;
}
- if (src.start >= (dst.start + dst.length)
- || dst.start >= (dst.start + dst.length))
+ if (!njs_memory_overlaps(dst.start + offset, end - offset,
+ src.start, src.length))
{
while (offset < end) {
n = njs_min(src.length, end - offset);
size = njs_min(src.length, target.length);
- if (src.start >= (target.start + size)
- || target.start >= (src.start + size))
- {
+ if (!njs_memory_overlaps(target.start, size, src.start, size)) {
memcpy(target.start, src.start, size);
} else {
name: "buf.fill() tests",
skip: () => (!has_buffer()),
T: async (params) => {
+ let value = params.value;
+
+ if (params.value_from_buf) {
+ value = params.buf.subarray(params.value_from_buf[0],
+ params.value_from_buf[1]);
+ }
+
if (params.detach_value) {
- detach(params.value.buffer);
+ detach(value.buffer);
}
- let r = params.buf.fill(params.value, params.offset, params.end);
+ let r = params.buf.fill(value, params.offset, params.end);
if (r.toString() !== params.expected) {
throw Error(`unexpected output "${r.toString()}" != "${params.expected}"`);
{ buf: Buffer.from(new Uint8Array([0x60, 0x61, 0x62, 0x63]).buffer, 1),
value: Buffer.from('def'),
expected: 'def' },
+ { buf: Buffer.from('0123456789'),
+ value_from_buf: [0, 4],
+ offset: 6,
+ expected: '0123450123' },
+ { buf: Buffer.from('0123456789'),
+ value_from_buf: [0, 4],
+ offset: 2,
+ end: 8,
+ expected: '0101230189' },
],
};