Skip to content

Commit e239ab2

Browse files
committed
[Fix] ES2015+: ValidateTypedArray: proper detachment check and return value
1 parent 48b2d9f commit e239ab2

11 files changed

+93
-86
lines changed

.gitattributes

-1
Original file line numberDiff line numberDiff line change
@@ -1124,7 +1124,6 @@
11241124
/2022/UTF16EncodeCodePoint.js spackled linguist-generated=true
11251125
/2022/UTF16SurrogatePairToCodePoint.js spackled linguist-generated=true
11261126
/2022/UnicodeEscape.js spackled linguist-generated=true
1127-
/2022/ValidateTypedArray.js spackled linguist-generated=true
11281127
/2022/WeakRefDeref.js spackled linguist-generated=true
11291128
/2022/WeekDay.js spackled linguist-generated=true
11301129
/2022/WordCharacters.js spackled linguist-generated=true

2015/ValidateTypedArray.js

+9-9
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,27 @@ var GetIntrinsic = require('get-intrinsic');
44

55
var $TypeError = GetIntrinsic('%TypeError%');
66

7-
var callBound = require('call-bind/callBound');
8-
var $taSome = callBound('TypedArray.prototype.some', true);
9-
7+
var IsDetachedBuffer = require('./IsDetachedBuffer');
108
var Type = require('./Type');
119

1210
var isTypedArray = require('is-typed-array');
11+
var typedArrayBuffer = require('typed-array-buffer');
1312

1413
// https://262.ecma-international.org/6.0/#sec-validatetypedarray
1514

1615
module.exports = function ValidateTypedArray(O) {
1716
if (Type(O) !== 'Object') {
18-
throw new $TypeError('Assertion failed: O must be an Object');
17+
throw new $TypeError('Assertion failed: `O` must be an Object'); // step 1
1918
}
2019
if (!isTypedArray(O)) {
21-
throw new $TypeError('Assertion failed: O must be a TypedArray');
20+
throw new $TypeError('Assertion failed: `O` must be a Typed Array'); // steps 2 - 3
2221
}
2322

24-
// without `.some` (like in node 0.10), there's no way to check buffer detachment, but also no way to be detached
25-
if ($taSome) {
26-
$taSome(O, function () { return true; });
23+
var buffer = typedArrayBuffer(O); // step 4
24+
25+
if (IsDetachedBuffer(buffer)) {
26+
throw new $TypeError('`O` must be backed by a non-detached buffer'); // step 5
2727
}
2828

29-
return O.buffer;
29+
return buffer; // step 6
3030
};

2016/ValidateTypedArray.js

+9-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2017/ValidateTypedArray.js

+9-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2018/ValidateTypedArray.js

+9-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2019/ValidateTypedArray.js

+9-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2020/ValidateTypedArray.js

+9-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2021/ValidateTypedArray.js

+9-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2022/ValidateTypedArray.js

+9-11
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,25 @@ var GetIntrinsic = require('get-intrinsic');
44

55
var $TypeError = GetIntrinsic('%TypeError%');
66

7-
var callBound = require('call-bind/callBound');
8-
var $taSome = callBound('TypedArray.prototype.some', true);
9-
7+
var IsDetachedBuffer = require('./IsDetachedBuffer');
108
var Type = require('./Type');
119

1210
var isTypedArray = require('is-typed-array');
11+
var typedArrayBuffer = require('typed-array-buffer');
1312

14-
// https://262.ecma-international.org/6.0/#sec-validatetypedarray
13+
// https://262.ecma-international.org/13.0/#sec-validatetypedarray
1514

1615
module.exports = function ValidateTypedArray(O) {
1716
if (Type(O) !== 'Object') {
18-
throw new $TypeError('Assertion failed: O must be an Object');
17+
throw new $TypeError('Assertion failed: `O` must be an Object'); // step 1
1918
}
2019
if (!isTypedArray(O)) {
21-
throw new $TypeError('Assertion failed: O must be a TypedArray');
20+
throw new $TypeError('Assertion failed: `O` must be a Typed Array'); // steps 1 - 2
2221
}
2322

24-
// without `.some` (like in node 0.10), there's no way to check buffer detachment, but also no way to be detached
25-
if ($taSome) {
26-
$taSome(O, function () { return true; });
27-
}
23+
var buffer = typedArrayBuffer(O); // step 3
2824

29-
return O.buffer;
25+
if (IsDetachedBuffer(buffer)) {
26+
throw new $TypeError('`O` must be backed by a non-detached buffer'); // step 4
27+
}
3028
};

2023/ValidateTypedArray.js

+9-11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/tests.js

+12
Original file line numberDiff line numberDiff line change
@@ -5526,6 +5526,18 @@ var es2015 = function ES2015(ES, ops, expectedMissing, skips) {
55265526
function () { ES.ValidateTypedArray(ta); },
55275527
debug(ta) + ' is a TypedArray'
55285528
);
5529+
5530+
st.test('can detach', { skip: !canDetach }, function (s2t) {
5531+
ES.DetachArrayBuffer(ta.buffer);
5532+
5533+
s2t['throws'](
5534+
function () { ES.ValidateTypedArray(ta); },
5535+
TypeError,
5536+
debug(ta) + ' is a detached TypedArray'
5537+
);
5538+
5539+
s2t.end();
5540+
});
55295541
});
55305542

55315543
st.end();

0 commit comments

Comments
 (0)