mirror of
https://github.com/nodejs/node.git
synced 2026-10-14 10:26:26 -04:00
buffer: improve fill(number) performance
PR-URL: https://github.com/nodejs/node/pull/31489 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
1 file changed
+26
-5
+26
-5
@@ -34,9 +34,12 @@ const {
|
||||
ObjectCreate,
|
||||
ObjectDefineProperties,
|
||||
ObjectDefineProperty,
|
||||
ObjectGetOwnPropertyDescriptor,
|
||||
ObjectGetPrototypeOf,
|
||||
ObjectSetPrototypeOf,
|
||||
SymbolSpecies,
|
||||
SymbolToPrimitive,
|
||||
Uint8ArrayPrototype,
|
||||
} = primordials;
|
||||
|
||||
const {
|
||||
@@ -101,6 +104,13 @@ const {
|
||||
addBufferPrototypeMethods
|
||||
} = require('internal/buffer');
|
||||
|
||||
const TypedArrayPrototype = ObjectGetPrototypeOf(Uint8ArrayPrototype);
|
||||
|
||||
const TypedArrayProto_byteLength =
|
||||
ObjectGetOwnPropertyDescriptor(TypedArrayPrototype,
|
||||
'byteLength').get;
|
||||
const TypedArrayFill = TypedArrayPrototype.fill;
|
||||
|
||||
FastBuffer.prototype.constructor = Buffer;
|
||||
Buffer.prototype = FastBuffer.prototype;
|
||||
addBufferPrototypeMethods(Buffer.prototype);
|
||||
@@ -1001,11 +1011,22 @@ function _fill(buf, value, offset, end, encoding) {
|
||||
return buf;
|
||||
}
|
||||
|
||||
const res = bindingFill(buf, value, offset, end, encoding);
|
||||
if (res < 0) {
|
||||
if (res === -1)
|
||||
throw new ERR_INVALID_ARG_VALUE('value', value);
|
||||
throw new ERR_BUFFER_OUT_OF_BOUNDS();
|
||||
|
||||
if (typeof value === 'number') {
|
||||
// OOB check
|
||||
const byteLen = TypedArrayProto_byteLength.call(buf);
|
||||
const fillLength = end - offset;
|
||||
if (offset > end || fillLength + offset > byteLen)
|
||||
throw new ERR_BUFFER_OUT_OF_BOUNDS();
|
||||
|
||||
TypedArrayFill.call(buf, value, offset, end);
|
||||
} else {
|
||||
const res = bindingFill(buf, value, offset, end, encoding);
|
||||
if (res < 0) {
|
||||
if (res === -1)
|
||||
throw new ERR_INVALID_ARG_VALUE('value', value);
|
||||
throw new ERR_BUFFER_OUT_OF_BOUNDS();
|
||||
}
|
||||
}
|
||||
|
||||
return buf;
|
||||
|
||||
Reference in new issue
Block a user