Skip to content

Commit 0ef51c7

Browse files
committed
[New] add support for SharedArrayBuffer
1 parent 0360ee1 commit 0ef51c7

File tree

4 files changed

+84
-12
lines changed

4 files changed

+84
-12
lines changed

.eslintrc

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"files": "example/**",
2626
"rules": {
2727
"no-console": 0,
28-
"no-magic-numbers": 0,
28+
"no-magic-numbers": 0,
2929
}
3030
},
3131
{

index.js

+21-11
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
'use strict';
22

3-
var objectKeys = require('object-keys');
4-
var isArguments = require('is-arguments');
5-
var is = require('object-is');
6-
var isRegex = require('is-regex');
3+
var assign = require('object.assign');
4+
var callBound = require('call-bind/callBound');
75
var flags = require('regexp.prototype.flags');
6+
var GetIntrinsic = require('get-intrinsic');
7+
var getIterator = require('es-get-iterator');
8+
var getSideChannel = require('side-channel');
9+
var is = require('object-is');
10+
var isArguments = require('is-arguments');
811
var isArray = require('isarray');
12+
var isArrayBuffer = require('is-array-buffer');
913
var isDate = require('is-date-object');
14+
var isRegex = require('is-regex');
15+
var isSharedArrayBuffer = require('is-shared-array-buffer');
16+
var objectKeys = require('object-keys');
1017
var whichBoxedPrimitive = require('which-boxed-primitive');
11-
var GetIntrinsic = require('get-intrinsic');
12-
var callBound = require('call-bind/callBound');
1318
var whichCollection = require('which-collection');
14-
var getIterator = require('es-get-iterator');
15-
var getSideChannel = require('side-channel');
1619
var whichTypedArray = require('which-typed-array');
17-
var assign = require('object.assign');
18-
var isArrayBuffer = require('is-array-buffer');
1920

20-
var byteLength = callBound('%ArrayBuffer.prototype.byteLength%', true)
21+
var byteLength = callBound('ArrayBuffer.prototype.byteLength', true)
2122
|| function byteLength(ab) { return ab.byteLength; }; // in node < 0.11, byteLength is an own nonconfigurable property
23+
var sabByteLength = callBound('SharedArrayBuffer.prototype.byteLength', true);
2224

2325
var $getTime = callBound('Date.prototype.getTime');
2426
var gPO = Object.getPrototypeOf;
@@ -335,6 +337,14 @@ function objEquiv(a, b, opts, channel) {
335337
return typeof Uint8Array === 'function' && internalDeepEqual(new Uint8Array(a), new Uint8Array(b), opts, channel);
336338
}
337339

340+
var aIsSAB = isSharedArrayBuffer(a);
341+
var bIsSAB = isSharedArrayBuffer(b);
342+
if (aIsSAB !== bIsSAB) { return false; }
343+
if (aIsSAB || bIsSAB) { // && would work too, because both are true or both false here
344+
if (sabByteLength(a) !== sabByteLength(b)) { return false; }
345+
return typeof Uint8Array === 'function' && internalDeepEqual(new Uint8Array(a), new Uint8Array(b), opts, channel);
346+
}
347+
338348
if (typeof a !== typeof b) { return false; }
339349

340350
var ka = objectKeys(a);

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
"is-array-buffer": "^3.0.1",
3939
"is-date-object": "^1.0.5",
4040
"is-regex": "^1.1.4",
41+
"is-shared-array-buffer": "^1.0.2",
4142
"isarray": "^2.0.5",
4243
"object-is": "^1.1.5",
4344
"object-keys": "^1.1.1",

test/cmp.js

+61
Original file line numberDiff line numberDiff line change
@@ -1236,5 +1236,66 @@ test('TypedArrays', { skip: !hasTypedArrays }, function (t) {
12361236
st.end();
12371237
});
12381238

1239+
t.test('SharedArrayBuffers', { skip: typeof SharedArrayBuffer !== 'function' }, function (st) {
1240+
var buffer1 = new SharedArrayBuffer(8); // initial value of 0's
1241+
var buffer2 = new SharedArrayBuffer(8); // initial value of 0's
1242+
1243+
var view1 = new Int8Array(buffer1);
1244+
var view2 = new Int8Array(buffer2);
1245+
1246+
st.deepEqualTest(
1247+
view1,
1248+
view2,
1249+
'Int8Arrays of similar SharedArrayBuffers',
1250+
true,
1251+
true
1252+
);
1253+
1254+
st.deepEqualTest(
1255+
buffer1,
1256+
buffer2,
1257+
'similar SharedArrayBuffers',
1258+
true,
1259+
true
1260+
);
1261+
1262+
for (var i = 0; i < view1.byteLength; i += 1) {
1263+
view1[i] = 9; // change all values to 9's
1264+
}
1265+
1266+
st.deepEqualTest(
1267+
view1,
1268+
view2,
1269+
'Int8Arrays of different SharedArrayBuffers',
1270+
false,
1271+
false
1272+
);
1273+
1274+
st.deepEqualTest(
1275+
buffer1,
1276+
buffer2,
1277+
'different SharedArrayBuffers',
1278+
false,
1279+
false
1280+
);
1281+
1282+
t.test('lies about byteLength', { skip: !('byteLength' in SharedArrayBuffer.prototype) }, function (s2t) {
1283+
var empty4 = new SharedArrayBuffer(4);
1284+
var empty6 = new SharedArrayBuffer(6);
1285+
Object.defineProperty(empty6, 'byteLength', { value: 4 });
1286+
1287+
s2t.deepEqualTest(
1288+
empty4,
1289+
empty6,
1290+
'different-length SharedArrayBuffers, one lying',
1291+
false,
1292+
false
1293+
);
1294+
s2t.end();
1295+
});
1296+
1297+
st.end();
1298+
});
1299+
12391300
t.end();
12401301
});

0 commit comments

Comments
 (0)