X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/2d39b0e377c0896910ee49ae70082ba665faf986..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/tests/stress/modify-set-during-iteration.js diff --git a/tests/stress/modify-set-during-iteration.js b/tests/stress/modify-set-during-iteration.js new file mode 100644 index 0000000..a739847 --- /dev/null +++ b/tests/stress/modify-set-during-iteration.js @@ -0,0 +1,91 @@ + +function testValue(value, expected) { + if (value !== expected) + throw new Error("bad value: expected:(" + expected + "),actual:(" + value +")."); +} + +var set = new Set([0]); +var counter = 0; +for (var elm of set) { + testValue(elm, counter); + set.add(elm + 1); + if (elm > 10000) { + set.clear(); + } + ++counter; +} +testValue(counter, 10002); + +var set = new Set([0, 1, 2, 3]); +var counter = 0; +for (var elm of set) { + testValue(elm, counter); + set.clear(); + ++counter; +} +testValue(counter, 1); + +var set = new Set([0, 1, 2, 3]); +var exp = [0, 2, 3]; +var counter = 0; +for (var elm of set) { + testValue(elm, exp[counter]); + set.delete(counter + 1); + ++counter; +} +testValue(counter, 3); + +var set = new Set([0, 1, 2, 3]); +var iter = set[Symbol.iterator](); +var iter2 = set[Symbol.iterator](); +testValue(iter2.next().value, 0); + +// Consume all output of iter. +for (var elm of iter); + +testValue(iter.next().done, true); +testValue(iter.next().value, undefined); + +set.clear(); +set.add(1).add(2).add(3); + +testValue(iter.next().done, true); +testValue(iter.next().value, undefined); +testValue(iter2.next().value, 1); +testValue(iter2.next().value, 2); +testValue(iter2.next().value, 3); + +var set = new Set(); +set.add(1); +set.delete(1); +set.forEach(function (i) { + throw new Error("unreeachable."); +}); + +var set = new Set(); +var iter = set[Symbol.iterator](); +set.add(1); +set.delete(1); +for (var elm of iter) { + throw new Error("unreeachable."); +} + +var set = new Set([0, 1, 2, 3, 4]); +var iter = set[Symbol.iterator](); +testValue(set.size, 5); +testValue(iter.next().value, 0); +testValue(iter.next().value, 1); +testValue(iter.next().value, 2); +testValue(iter.next().value, 3); +set.delete(0); +set.delete(1); +set.delete(2); +set.delete(3); +// It will cause MapData packing. +for (var i = 5; i < 1000; ++i) + set.add(i); +gc(); +for (var i = 4; i < 1000; ++i) + testValue(iter.next().value, i); +testValue(iter.next().value, undefined); +