1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
// |reftest| skip -- set-methods is not supported
// Copyright (C) 2023 Anthony Frehner and Kevin Gibbons. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-set.prototype.intersection
description: Set.prototype.intersection maintains values even when a custom Set-like class mutates the receiver
features: [set-methods]
includes: [compareArray.js]
---*/
const baseSet = new Set(["a", "b", "c", "d", "e"]);
function mutatingIterator() {
let index = 0;
let values = ["x", "b", "b"];
return {
next() {
if (index === 0) {
baseSet.delete("b");
baseSet.delete("c");
baseSet.add("b");
baseSet.add("d");
}
return {
done: index >= values.length,
value: values[index++],
};
},
};
}
const evilSetLike = {
size: 3,
get has() {
baseSet.add("q");
return function () {
throw new Test262Error("Set.prototype.intersection should not invoke .has on its argument when this.size > other.size");
};
},
keys() {
return mutatingIterator();
},
};
const combined = baseSet.intersection(evilSetLike);
const expectedCombined = ["b"];
assert.compareArray([...combined], expectedCombined);
const expectedNewBase = ["a", "d", "e", "q", "b"];
assert.compareArray([...baseSet], expectedNewBase);
reportCompare(0, 0);
|