summaryrefslogtreecommitdiffstats
path: root/js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js')
-rw-r--r--js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js65
1 files changed, 65 insertions, 0 deletions
diff --git a/js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js b/js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js
new file mode 100644
index 0000000000..c105dfd70b
--- /dev/null
+++ b/js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js
@@ -0,0 +1,65 @@
+// |reftest| async
+// Copyright (C) 2022 Chengzhong Wu. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-asyncgenerator-prototype-return
+description: >
+ A broken promise should resume the generator and reject with
+ the exception when the generator's state is suspendedYield.
+info: |
+ AsyncGenerator.prototype.return ( value )
+ ...
+ 9. Else if state is suspendedYield, then
+ a. Perform AsyncGeneratorResume(generator, completion).
+ ...
+
+ AsyncGeneratorCompleteStep ( generator, completion, done [ , realm ] )
+ Resumes the steps defined at AsyncGeneratorStart ( generator, generatorBody )
+ ...
+ 4. Set the code evaluation state of genContext such that when evaluation is resumed for that execution context the following steps will be performed:
+ ...
+ i. Perform AsyncGeneratorDrainQueue(generator).
+ j. Return undefined.
+
+ AsyncGeneratorDrainQueue ( generator )
+ ...
+ 5. Repeat, while done is false,
+ a. Let next be the first element of queue.
+ b. Let completion be Completion(next.[[Completion]]).
+ c. If completion.[[Type]] is return, then
+ i. Set generator.[[AsyncGeneratorState]] to awaiting-return.
+ ii. Perform AsyncGeneratorAwaitReturn(generator).
+ iii. Set done to true.
+ ...
+
+flags: [async]
+features: [async-iteration]
+---*/
+
+let caughtErr;
+var g = async function*() {
+ try {
+ yield;
+ return 'this is never returned';
+ } catch (err) {
+ caughtErr = err;
+ return 1;
+ }
+};
+
+let brokenPromise = Promise.resolve(42);
+Object.defineProperty(brokenPromise, 'constructor', {
+ get: function () {
+ throw new Error('broken promise');
+ }
+});
+
+var it = g();
+it.next().then(() => {
+ return it.return(brokenPromise);
+}).then(ret => {
+ assert.sameValue(caughtErr.message, 'broken promise');
+ assert.sameValue(ret.value, 1, 'returned value');
+ assert.sameValue(ret.done, true, 'iterator is closed');
+}).then($DONE, $DONE);