promise-2.js (1649B)
1 function testOwnConstructorProp() { 2 let p = Promise.resolve(0); 3 let c = 0; 4 Object.defineProperty(p, "constructor", {get() { 5 c++; 6 return Promise; 7 }}); 8 p.then(() => {}); 9 p.then(() => {}); 10 assertEq(c, 2); 11 } 12 testOwnConstructorProp(); 13 14 function testOtherProtoConstructorProp() { 15 let p = Promise.resolve(0); 16 let proto = Object.create(Promise.prototype); 17 Object.setPrototypeOf(p, proto); 18 let c = 0; 19 Object.defineProperty(proto, "constructor", {get() { 20 c++; 21 return Promise; 22 }}); 23 p.then(() => {}); 24 p.then(() => {}); 25 assertEq(c, 2); 26 } 27 testOtherProtoConstructorProp(); 28 29 function testOwnThenProp() { 30 let p = new Promise(function() {}); 31 let c = 0; 32 Object.defineProperty(p, "then", {get() { 33 c++; 34 return Promise.prototype.then; 35 }}); 36 p.catch(); 37 assertEq(c, 1); 38 } 39 testOwnThenProp(); 40 41 function testOtherProtoThenProp() { 42 let p = new Promise(function() {}); 43 let proto = Object.create(Promise.prototype); 44 Object.setPrototypeOf(p, proto); 45 let c = 0; 46 Object.defineProperty(proto, "then", {get() { 47 c++; 48 return Promise.prototype.then; 49 }}); 50 p.catch(); 51 assertEq(c, 1); 52 } 53 testOtherProtoThenProp(); 54 55 // Fuse should still be intact after all that. 56 assertEq(getFuseState().OptimizePromiseLookupFuse.intact, true); 57 58 function testClobberResolve() { 59 newGlobal().evaluate(` 60 let origResolve = Promise.resolve; 61 let c = 0; 62 Promise.resolve = function() { 63 c++; 64 return origResolve.apply(this, arguments); 65 }; 66 let p1 = new Promise(function() {}); 67 let p2 = new Promise(function() {}); 68 Promise.all([p1, p2]); 69 assertEq(c, 2); 70 `); 71 } 72 testClobberResolve();