blob: 3a0980d4253fbea3ece4ca23ca430e1b5cd3d4b2 [file] [log] [blame]
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --allow-natives-syntax
load('test/mjsunit/test-async.js');
// We store the index in the hash code field of the Promise.all resolve
// element closures, so make sure we properly handle the cases where this
// magical field turns into a PropertyArray later.
(function() {
class MyPromise extends Promise {
then(resolve, reject) {
this.resolve = resolve;
}
};
const myPromise = new MyPromise(() => {});
MyPromise.all([myPromise]);
myPromise.resolve.x = 1;
myPromise.resolve(1);
})();
// Same test as above, but for PropertyDictionary.
(function() {
class MyPromise extends Promise {
then(resolve, reject) {
this.resolve = resolve;
}
};
const myPromise = new MyPromise(() => {});
MyPromise.all([myPromise]);
for (let i = 0; i < 1025; ++i) {
myPromise.resolve[`x${i}`] = i;
}
myPromise.resolve(1);
})();
// Test that we return a proper array even if (custom) "then" invokes the
// resolve callbacks right away.
(function() {
class MyPromise extends Promise {
constructor(executor, id) {
super(executor);
this.id = id;
}
then(resolve, reject) {
if (this.id) return resolve(this.id);
return super.then(resolve, reject)
}
};
const a = new MyPromise(() => {}, 'a');
const b = new MyPromise(() => {}, 'b');
testAsync(assert => {
assert.plan(1);
MyPromise.all([a, b]).then(
v => assert.equals(['a', 'b'], v),
assert.unexpectedRejection());
});
})();
// Test that we properly handle holes introduced into the resulting array
// by resolving some late elements immediately.
(function() {
class MyPromise extends Promise {
then(resolve, reject) {
if (this.immediately) {
resolve(42);
} else {
super.then(resolve, reject);
}
}
};
const a = new Array(1024);
a.fill(MyPromise.resolve(1));
const p = MyPromise.resolve(0);
p.immediately = true;
a.push(p);
testAsync(assert => {
assert.plan(1);
MyPromise.all(a).then(
b => assert.equals(42, b[1024]),
assert.unexpectedRejection());
});
})();