Skip to content

Commit 8c14040

Browse files
authored
fix: catch fake collections throwing (#100)
Fixes #99
1 parent 4e914be commit 8c14040

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

index.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,18 @@ function regexpEqual(leftHandOperand, rightHandOperand) {
289289
*/
290290

291291
function entriesEqual(leftHandOperand, rightHandOperand, options) {
292-
// IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach
293-
if (leftHandOperand.size !== rightHandOperand.size) {
292+
try {
293+
// IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach
294+
if (leftHandOperand.size !== rightHandOperand.size) {
295+
return false;
296+
}
297+
if (leftHandOperand.size === 0) {
298+
return true;
299+
}
300+
} catch (sizeError) {
301+
// things that aren't actual Maps or Sets will throw here
294302
return false;
295303
}
296-
if (leftHandOperand.size === 0) {
297-
return true;
298-
}
299304
var leftHandItems = [];
300305
var rightHandItems = [];
301306
leftHandOperand.forEach(function gatherEntries(key, value) {

test/new-ecmascript-types.js

+14
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ describe('ES2015 Specific', function () {
9595
assert(eql(mapA, mapB), 'eql(Map { a => 1, b => 2, c => 3 }, Map { a => 1, b => 2, c => 3 })');
9696
});
9797

98+
(setExists ? it : it.skip)('returns false for fake Maps', function () {
99+
var maplikeSet = new Set();
100+
Object.defineProperty(maplikeSet, 'constructor', { enumerable: false, value: Map });
101+
102+
assert(eql(maplikeSet, new Map()) === false, 'eql(Set pretending to be a Map, Map { })');
103+
});
104+
98105
});
99106

100107
describeIf(symbolAndMapExist && typeof Map.prototype[Symbol.iterator] === 'function')('map iterator', function () {
@@ -238,6 +245,13 @@ describe('ES2015 Specific', function () {
238245
assert(eql(setA, setB) === true, 'eql(Set { -> }, Set { <- }) === true');
239246
});
240247

248+
(mapExists ? it : it.skip)('returns false for fake Sets', function () {
249+
var setlikeMap = new Map();
250+
Object.defineProperty(setlikeMap, 'constructor', { enumerable: false, value: Set });
251+
252+
assert(eql(setlikeMap, new Set()) === false, 'eql(Map pretending to be a Set, Set { })');
253+
});
254+
241255
});
242256

243257
describeIf(symbolAndSetExist && typeof Set.prototype[Symbol.iterator] === 'function')('set iterator', function () {

0 commit comments

Comments
 (0)