Skip to content

Commit 40490dd

Browse files
anonriglouwers
authored andcommitted
lib,src: use built-in array buffer detach, transfer
PR-URL: nodejs#54837 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Stephen Belanger <admin@stephenbelanger.com>
1 parent 5e69be6 commit 40490dd

File tree

5 files changed

+13
-57
lines changed

5 files changed

+13
-57
lines changed

lib/internal/util.js

-12
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use strict';
22

33
const {
4-
ArrayBufferPrototypeGetByteLength,
54
ArrayFrom,
65
ArrayIsArray,
76
ArrayPrototypePush,
@@ -57,7 +56,6 @@ const {
5756
} = require('internal/errors');
5857
const { signals } = internalBinding('constants').os;
5958
const {
60-
isArrayBufferDetached: _isArrayBufferDetached,
6159
guessHandleType: _guessHandleType,
6260
privateSymbols: {
6361
arrow_message_private_symbol,
@@ -798,15 +796,6 @@ function SideEffectFreeRegExpPrototypeSymbolSplit(regex, string, limit = undefin
798796
return getCrossRelmRegex(regex)[SymbolSplit](string, limit);
799797
}
800798

801-
802-
function isArrayBufferDetached(value) {
803-
if (ArrayBufferPrototypeGetByteLength(value) === 0) {
804-
return _isArrayBufferDetached(value);
805-
}
806-
807-
return false;
808-
}
809-
810799
/**
811800
* Helper function to lazy-load an initialize-once value.
812801
* @template T Return value of initializer
@@ -917,7 +906,6 @@ module.exports = {
917906
getSystemErrorMap,
918907
getSystemErrorName,
919908
guessHandleType,
920-
isArrayBufferDetached,
921909
isError,
922910
isInsideNodeModules,
923911
isMacOS,

lib/internal/webstreams/readablestream.js

+11-12
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
const {
44
ArrayBuffer,
55
ArrayBufferPrototypeGetByteLength,
6+
ArrayBufferPrototypeGetDetached,
67
ArrayBufferPrototypeSlice,
8+
ArrayBufferPrototypeTransfer,
79
ArrayPrototypePush,
810
ArrayPrototypeShift,
911
DataView,
@@ -49,7 +51,6 @@ const {
4951
const {
5052
createDeferredPromise,
5153
customInspectSymbol: kInspect,
52-
isArrayBufferDetached,
5354
kEmptyObject,
5455
kEnumerableProperty,
5556
SideEffectFreeRegExpPrototypeSymbolReplace,
@@ -103,11 +104,9 @@ const {
103104
extractHighWaterMark,
104105
extractSizeAlgorithm,
105106
lazyTransfer,
106-
isViewedArrayBufferDetached,
107107
isBrandCheck,
108108
resetQueue,
109109
setPromiseHandled,
110-
transferArrayBuffer,
111110
nonOpCancel,
112111
nonOpPull,
113112
nonOpStart,
@@ -698,7 +697,7 @@ class ReadableStreamBYOBRequest {
698697
const viewBuffer = ArrayBufferViewGetBuffer(view);
699698
const viewBufferByteLength = ArrayBufferPrototypeGetByteLength(viewBuffer);
700699

701-
if (isArrayBufferDetached(viewBuffer)) {
700+
if (ArrayBufferPrototypeGetDetached(viewBuffer)) {
702701
throw new ERR_INVALID_STATE.TypeError('Viewed ArrayBuffer is detached');
703702
}
704703

@@ -725,7 +724,7 @@ class ReadableStreamBYOBRequest {
725724

726725
validateBuffer(view, 'view');
727726

728-
if (isViewedArrayBufferDetached(view)) {
727+
if (ArrayBufferPrototypeGetDetached(view.buffer)) {
729728
throw new ERR_INVALID_STATE.TypeError('Viewed ArrayBuffer is detached');
730729
}
731730

@@ -1981,7 +1980,7 @@ function readableByteStreamControllerConvertPullIntoDescriptor(desc) {
19811980
if (bytesFilled > byteLength)
19821981
throw new ERR_INVALID_STATE.RangeError('The buffer size is invalid');
19831982
assert(!(bytesFilled % elementSize));
1984-
const transferredBuffer = transferArrayBuffer(buffer);
1983+
const transferredBuffer = ArrayBufferPrototypeTransfer(buffer);
19851984

19861985
if (ctor === Buffer) {
19871986
return Buffer.from(transferredBuffer, byteOffset, bytesFilled / elementSize);
@@ -2650,7 +2649,7 @@ function readableByteStreamControllerPullInto(
26502649

26512650
let transferredBuffer;
26522651
try {
2653-
transferredBuffer = transferArrayBuffer(buffer);
2652+
transferredBuffer = ArrayBufferPrototypeTransfer(buffer);
26542653
} catch (error) {
26552654
readIntoRequest[kError](error);
26562655
return;
@@ -2743,7 +2742,7 @@ function readableByteStreamControllerRespond(controller, bytesWritten) {
27432742
throw new ERR_INVALID_ARG_VALUE.RangeError('bytesWritten', bytesWritten);
27442743
}
27452744

2746-
desc.buffer = transferArrayBuffer(desc.buffer);
2745+
desc.buffer = ArrayBufferPrototypeTransfer(desc.buffer);
27472746

27482747
readableByteStreamControllerRespondInternal(controller, bytesWritten);
27492748
}
@@ -2793,20 +2792,20 @@ function readableByteStreamControllerEnqueue(controller, chunk) {
27932792
if (closeRequested || stream[kState].state !== 'readable')
27942793
return;
27952794

2796-
const transferredBuffer = transferArrayBuffer(buffer);
2795+
const transferredBuffer = ArrayBufferPrototypeTransfer(buffer);
27972796

27982797
if (pendingPullIntos.length) {
27992798
const firstPendingPullInto = pendingPullIntos[0];
28002799

2801-
if (isArrayBufferDetached(firstPendingPullInto.buffer)) {
2800+
if (ArrayBufferPrototypeGetDetached(firstPendingPullInto.buffer)) {
28022801
throw new ERR_INVALID_STATE.TypeError(
28032802
'Destination ArrayBuffer is detached',
28042803
);
28052804
}
28062805

28072806
readableByteStreamControllerInvalidateBYOBRequest(controller);
28082807

2809-
firstPendingPullInto.buffer = transferArrayBuffer(
2808+
firstPendingPullInto.buffer = ArrayBufferPrototypeTransfer(
28102809
firstPendingPullInto.buffer,
28112810
);
28122811

@@ -3104,7 +3103,7 @@ function readableByteStreamControllerRespondWithNewView(controller, view) {
31043103
if (bufferByteLength !== viewBufferByteLength)
31053104
throw new ERR_INVALID_ARG_VALUE.RangeError('view', view);
31063105

3107-
desc.buffer = transferArrayBuffer(viewBuffer);
3106+
desc.buffer = ArrayBufferPrototypeTransfer(viewBuffer);
31083107

31093108
readableByteStreamControllerRespondInternal(controller, viewByteLength);
31103109
}

lib/internal/webstreams/util.js

-21
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@ const {
2121
ERR_ARG_NOT_ITERABLE,
2222
ERR_INVALID_ARG_VALUE,
2323
ERR_INVALID_STATE,
24-
ERR_OPERATION_FAILED,
2524
},
2625
} = require('internal/errors');
2726

2827
const {
2928
copyArrayBuffer,
30-
detachArrayBuffer,
3129
} = internalBinding('buffer');
3230

3331
const {
@@ -42,7 +40,6 @@ const {
4240
} = internalBinding('util');
4341

4442
const assert = require('internal/assert');
45-
const { isArrayBufferDetached } = require('internal/util');
4643

4744
const {
4845
validateFunction,
@@ -118,22 +115,6 @@ function isBrandCheck(brand) {
118115
};
119116
}
120117

121-
function transferArrayBuffer(buffer) {
122-
const res = detachArrayBuffer(buffer);
123-
if (res === undefined) {
124-
throw new ERR_OPERATION_FAILED.TypeError(
125-
'The ArrayBuffer could not be transferred');
126-
}
127-
return res;
128-
}
129-
130-
function isViewedArrayBufferDetached(view) {
131-
return (
132-
ArrayBufferViewGetByteLength(view) === 0 &&
133-
isArrayBufferDetached(ArrayBufferViewGetBuffer(view))
134-
);
135-
}
136-
137118
function dequeueValue(controller) {
138119
assert(controller[kState].queue !== undefined);
139120
assert(controller[kState].queueTotalSize !== undefined);
@@ -291,11 +272,9 @@ module.exports = {
291272
invokePromiseCallback,
292273
isBrandCheck,
293274
isPromisePending,
294-
isViewedArrayBufferDetached,
295275
peekQueueValue,
296276
resetQueue,
297277
setPromiseHandled,
298-
transferArrayBuffer,
299278
nonOpCancel,
300279
nonOpFlush,
301280
nonOpPull,

src/node_util.cc

-12
Original file line numberDiff line numberDiff line change
@@ -162,15 +162,6 @@ static void GetCallerLocation(const FunctionCallbackInfo<Value>& args) {
162162
args.GetReturnValue().Set(Array::New(args.GetIsolate(), ret, arraysize(ret)));
163163
}
164164

165-
static void IsArrayBufferDetached(const FunctionCallbackInfo<Value>& args) {
166-
if (args[0]->IsArrayBuffer()) {
167-
auto buffer = args[0].As<v8::ArrayBuffer>();
168-
args.GetReturnValue().Set(buffer->WasDetached());
169-
return;
170-
}
171-
args.GetReturnValue().Set(false);
172-
}
173-
174165
static void PreviewEntries(const FunctionCallbackInfo<Value>& args) {
175166
if (!args[0]->IsObject())
176167
return;
@@ -306,7 +297,6 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
306297
registry->Register(GetPromiseDetails);
307298
registry->Register(GetProxyDetails);
308299
registry->Register(GetCallerLocation);
309-
registry->Register(IsArrayBufferDetached);
310300
registry->Register(PreviewEntries);
311301
registry->Register(GetCallSite);
312302
registry->Register(GetOwnNonIndexProperties);
@@ -406,8 +396,6 @@ void Initialize(Local<Object> target,
406396
SetMethodNoSideEffect(context, target, "getProxyDetails", GetProxyDetails);
407397
SetMethodNoSideEffect(
408398
context, target, "getCallerLocation", GetCallerLocation);
409-
SetMethodNoSideEffect(
410-
context, target, "isArrayBufferDetached", IsArrayBufferDetached);
411399
SetMethodNoSideEffect(context, target, "previewEntries", PreviewEntries);
412400
SetMethodNoSideEffect(
413401
context, target, "getOwnNonIndexProperties", GetOwnNonIndexProperties);

typings/primordials.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,9 @@ declare namespace primordials {
150150
export import ArrayBuffer = globalThis.ArrayBuffer;
151151
export const ArrayBufferPrototype: typeof ArrayBuffer.prototype
152152
export const ArrayBufferIsView: typeof ArrayBuffer.isView
153+
export const ArrayBufferPrototypeGetDetached: UncurryThis<typeof ArrayBuffer.prototype.detached>
153154
export const ArrayBufferPrototypeSlice: UncurryThis<typeof ArrayBuffer.prototype.slice>
155+
export const ArrayBufferPrototypeTransfer: UncurryThis<typeof ArrayBuffer.prototype.transfer>
154156
export const AsyncIteratorPrototype: AsyncIterable<any>;
155157
export import BigInt = globalThis.BigInt;
156158
export const BigIntPrototype: typeof BigInt.prototype

0 commit comments

Comments
 (0)