From ab6fae9dbff0e381b024ec0c96fbff7b671b5048 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sat, 3 Aug 2024 19:15:03 +0200 Subject: [PATCH] buffer: faster type check Also add support for any TypedArray as target. PR-URL: https://github.com/nodejs/node/pull/54088 Reviewed-By: Yagiz Nizipli Reviewed-By: Matteo Collina Reviewed-By: James M Snell Reviewed-By: Benjamin Gruenbaum --- lib/buffer.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index 6b56169cdab9a5..4e6031afdb3919 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -23,6 +23,7 @@ const { Array, + ArrayBufferIsView, ArrayIsArray, ArrayPrototypeForEach, MathFloor, @@ -202,9 +203,9 @@ function toInteger(n, defaultVal) { } function copyImpl(source, target, targetStart, sourceStart, sourceEnd) { - if (!isUint8Array(source)) + if (!ArrayBufferIsView(source)) throw new ERR_INVALID_ARG_TYPE('source', ['Buffer', 'Uint8Array'], source); - if (!isUint8Array(target)) + if (!ArrayBufferIsView(target)) throw new ERR_INVALID_ARG_TYPE('target', ['Buffer', 'Uint8Array'], target); if (targetStart === undefined) { @@ -219,30 +220,30 @@ function copyImpl(source, target, targetStart, sourceStart, sourceEnd) { sourceStart = 0; } else { sourceStart = NumberIsInteger(sourceStart) ? sourceStart : toInteger(sourceStart, 0); - if (sourceStart < 0 || sourceStart > source.length) - throw new ERR_OUT_OF_RANGE('sourceStart', `>= 0 && <= ${source.length}`, sourceStart); + if (sourceStart < 0 || sourceStart > source.byteLength) + throw new ERR_OUT_OF_RANGE('sourceStart', `>= 0 && <= ${source.byteLength}`, sourceStart); } if (sourceEnd === undefined) { - sourceEnd = source.length; + sourceEnd = source.byteLength; } else { sourceEnd = NumberIsInteger(sourceEnd) ? sourceEnd : toInteger(sourceEnd, 0); if (sourceEnd < 0) throw new ERR_OUT_OF_RANGE('sourceEnd', '>= 0', sourceEnd); } - if (targetStart >= target.length || sourceStart >= sourceEnd) + if (targetStart >= target.byteLength || sourceStart >= sourceEnd) return 0; return _copyActual(source, target, targetStart, sourceStart, sourceEnd); } function _copyActual(source, target, targetStart, sourceStart, sourceEnd) { - if (sourceEnd - sourceStart > target.length - targetStart) - sourceEnd = sourceStart + target.length - targetStart; + if (sourceEnd - sourceStart > target.byteLength - targetStart) + sourceEnd = sourceStart + target.byteLength - targetStart; let nb = sourceEnd - sourceStart; - const sourceLen = source.length - sourceStart; + const sourceLen = source.byteLength - sourceStart; if (nb > sourceLen) nb = sourceLen;