Source code
Revision control
Copy as Markdown
Other Tools
function testOwnConstructorProp() {
let p = Promise.resolve(0);
let c = 0;
Object.defineProperty(p, "constructor", {get() {
c++;
return Promise;
}});
p.then(() => {});
p.then(() => {});
assertEq(c, 2);
}
testOwnConstructorProp();
function testOtherProtoConstructorProp() {
let p = Promise.resolve(0);
let proto = Object.create(Promise.prototype);
Object.setPrototypeOf(p, proto);
let c = 0;
Object.defineProperty(proto, "constructor", {get() {
c++;
return Promise;
}});
p.then(() => {});
p.then(() => {});
assertEq(c, 2);
}
testOtherProtoConstructorProp();
function testOwnThenProp() {
let p = new Promise(function() {});
let c = 0;
Object.defineProperty(p, "then", {get() {
c++;
return Promise.prototype.then;
}});
p.catch();
assertEq(c, 1);
}
testOwnThenProp();
function testOtherProtoThenProp() {
let p = new Promise(function() {});
let proto = Object.create(Promise.prototype);
Object.setPrototypeOf(p, proto);
let c = 0;
Object.defineProperty(proto, "then", {get() {
c++;
return Promise.prototype.then;
}});
p.catch();
assertEq(c, 1);
}
testOtherProtoThenProp();
// Fuse should still be intact after all that.
assertEq(getFuseState().OptimizePromiseLookupFuse.intact, true);
function testClobberResolve() {
newGlobal().evaluate(`
let origResolve = Promise.resolve;
let c = 0;
Promise.resolve = function() {
c++;
return origResolve.apply(this, arguments);
};
let p1 = new Promise(function() {});
let p2 = new Promise(function() {});
Promise.all([p1, p2]);
assertEq(c, 2);
`);
}
testClobberResolve();