Set-ctor-with-Set.js (2828B)
1 load(libdir + "asserts.js"); 2 3 function testOptimized1() { 4 var obj = {}; 5 var s = new Set([obj, undefined, 3.1415]); 6 for (var i = 0; i < 15; i++) { 7 var clone = new Set(s); 8 s.add(i); // Not added to `clone`. 9 s = clone; 10 } 11 assertEq(s.size, 3); 12 assertEq(s.has(obj), true); 13 assertEq(s.has(undefined), true); 14 assertEq(s.has(3.1415), true); 15 assertEq(Array.from(s).toString(), "[object Object],,3.1415"); 16 return s; 17 } 18 testOptimized1(); 19 20 function testOptimized2() { 21 var s = new Set(); 22 for (var i = 0; i < 15; i++) { 23 s = new Set(s); 24 s.add(i); 25 } 26 assertEq(s.size, 15); 27 assertEq(Array.from(s).toString(), "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14"); 28 return s; 29 } 30 testOptimized2(); 31 32 function testOtherProto() { 33 var s = new Set([1, 2, 3]); 34 Object.setPrototypeOf(s, null); 35 for (var i = 0; i < 15; i++) { 36 assertThrowsInstanceOf(() => new Set(s), TypeError); 37 } 38 } 39 testOtherProto(); 40 41 function testOwnIteratorProp() { 42 var s = new Set([1, 2, 3]); 43 var c = 0; 44 s[Symbol.iterator] = function() { 45 c++; 46 return {next() { return {done: true}; }}; 47 }; 48 for (var i = 0; i < 15; i++) { 49 assertEq(new Set(s).size, 0); 50 } 51 assertEq(c, 15); 52 } 53 testOwnIteratorProp(); 54 55 function testCustomProtoIteratorProp() { 56 // Use a new global because this pops a realm fuse. 57 newGlobal().evaluate(` 58 var s = new Set([1, 2, 3]); 59 var c = 0; 60 assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, true); 61 Set.prototype[Symbol.iterator] = function() { 62 c++; 63 return {next() { return {done: true}; }}; 64 }; 65 assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, false); 66 for (var i = 0; i < 15; i++) { 67 assertEq(new Set(s).size, 0); 68 } 69 assertEq(c, 15); 70 `); 71 } 72 testCustomProtoIteratorProp(); 73 74 function testCustomProtoIteratorPropEmpty() { 75 newGlobal().evaluate(` 76 var s = new Set(); 77 var c = 0; 78 assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, true); 79 Set.prototype[Symbol.iterator] = function() { 80 c++; 81 return {next() { return {done: true}; }}; 82 }; 83 assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, false); 84 for (var i = 0; i < 15; i++) { 85 assertEq(new Set(s).size, 0); 86 } 87 assertEq(c, 15); 88 `); 89 } 90 testCustomProtoIteratorPropEmpty(); 91 92 function testCustomIteratorNext() { 93 newGlobal().evaluate(` 94 var iterProto = Object.getPrototypeOf(new Set()[Symbol.iterator]()); 95 var s = new Set([1, 2, 3]); 96 var c = 0; 97 assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, true); 98 iterProto.next = function() { 99 c++; 100 return {done: true}; 101 }; 102 assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, false); 103 for (var i = 0; i < 15; i++) { 104 assertEq(new Set(s).size, 0); 105 } 106 assertEq(c, 15); 107 `); 108 } 109 testCustomIteratorNext();