Skip to content

Commit 377458d

Browse files
authored
fix: catch fake collections throwing (#100) (#101)
Fixes #99
1 parent 0e417c7 commit 377458d

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

index.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -274,13 +274,18 @@ function regexpEqual(leftHandOperand, rightHandOperand) {
274274
*/
275275

276276
function entriesEqual(leftHandOperand, rightHandOperand, options) {
277-
// IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach
278-
if (leftHandOperand.size !== rightHandOperand.size) {
277+
try {
278+
// IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach
279+
if (leftHandOperand.size !== rightHandOperand.size) {
280+
return false;
281+
}
282+
if (leftHandOperand.size === 0) {
283+
return true;
284+
}
285+
} catch (sizeError) {
286+
// things that aren't actual Maps or Sets will throw here
279287
return false;
280288
}
281-
if (leftHandOperand.size === 0) {
282-
return true;
283-
}
284289
var leftHandItems = [];
285290
var rightHandItems = [];
286291
leftHandOperand.forEach(function gatherEntries(key, value) {

test/new-ecmascript-types.js

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

100+
(setExists ? it : it.skip)('returns false for fake Maps', function () {
101+
var maplikeSet = new Set();
102+
Object.defineProperty(maplikeSet, 'constructor', { enumerable: false, value: Map });
103+
Object.setPrototypeOf(maplikeSet, Map.prototype);
104+
105+
assert(eql(maplikeSet, new Map()) === false, 'eql(Set pretending to be a Map, Map { })');
106+
});
107+
100108
});
101109

102110
describeIf(symbolAndMapExist && typeof Map.prototype[Symbol.iterator] === 'function')('map iterator', function () {
@@ -240,6 +248,14 @@ describe('ES2015 Specific', function () {
240248
assert(eql(setA, setB) === true, 'eql(Set { -> }, Set { <- }) === true');
241249
});
242250

251+
(mapExists ? it : it.skip)('returns false for fake Sets', function () {
252+
var setlikeMap = new Map();
253+
Object.defineProperty(setlikeMap, 'constructor', { enumerable: false, value: Set });
254+
Object.setPrototypeOf(setlikeMap, Set.prototype);
255+
256+
assert(eql(setlikeMap, new Set()) === false, 'eql(Map pretending to be a Set, Set { })');
257+
});
258+
243259
});
244260

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

0 commit comments

Comments
 (0)