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