Skip to content

Commit d68a5c7

Browse files
Implement TransferArrayBuffer correctly in reference implementation
1 parent 4f2a2c1 commit d68a5c7

File tree

1 file changed

+4
-17
lines changed

1 file changed

+4
-17
lines changed

reference-implementation/lib/abstract-ops/ecmascript.js

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use strict';
22
const assert = require('assert');
33

4-
const isFakeDetached = Symbol('is "detached" for our purposes');
4+
const ArrayBufferPrototypeTransferToFixedLength = ArrayBuffer.prototype.transferToFixedLength;
5+
const ArrayBufferPrototypeDetachedGetter = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'detached').get;
56

67
exports.typeIsObject = x => (typeof x === 'object' && x !== null) || typeof x === 'function';
78

@@ -15,31 +16,17 @@ exports.CopyDataBlockBytes = (dest, destOffset, src, srcOffset, n) => {
1516
new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);
1617
};
1718

18-
// Not implemented correctly
1919
exports.TransferArrayBuffer = O => {
2020
assert(!exports.IsDetachedBuffer(O));
21-
const transferredIshVersion = O.slice();
22-
23-
// This is specifically to fool tests that test "is transferred" by taking a non-zero-length
24-
// ArrayBuffer and checking if its byteLength starts returning 0.
25-
Object.defineProperty(O, 'byteLength', {
26-
get() {
27-
return 0;
28-
}
29-
});
30-
O[isFakeDetached] = true;
31-
32-
return transferredIshVersion;
21+
return ArrayBufferPrototypeTransferToFixedLength.call(O);
3322
};
3423

35-
// Not implemented correctly
3624
exports.CanTransferArrayBuffer = O => {
3725
return !exports.IsDetachedBuffer(O);
3826
};
3927

40-
// Not implemented correctly
4128
exports.IsDetachedBuffer = O => {
42-
return isFakeDetached in O;
29+
return ArrayBufferPrototypeDetachedGetter.call(O) === true;
4330
};
4431

4532
exports.Call = (F, V, args = []) => {

0 commit comments

Comments
 (0)