| // 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()); |
| }); |
| })(); |