summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/regress/async-generator-is-awaiting.js
blob: 869c1861ed47da26a39593684907eb3ff60f95ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Copyright 2021 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.

// Async generator builtins that suspend the generator set the is_awaiting bit
// to 1 before awaiting. This is cleared when resumed. This tests that the bit
// is set after the await operation successfully completes (i.e. returns the
// Promise), since it can throw, and that thrown exception can be caught by
// script. Otherwise the is_awaiting bit won't be cleared.

// This makes `await new Promise(() => {})` throw.
Object.defineProperty(Promise.prototype, 'constructor', {
  get() { throw 42; }
});

// AsyncGeneratorAwait
{
  async function *f() {
    try {
      await new Promise(() => {});
    } catch (e) {
    }
  }

  f().next();
}

// AsyncGeneratorYield
{
  async function *f() {
    try {
      yield new Promise(() => {});
    } catch (e) {
    }
  }

  f().next();
}

// AsyncGeneratorReturn isn't affected because it's not possible, in script, to
// catch an error thrown by a return resumption. It'll be caught by the
// synthetic try-catch around the whole body of the async generator, which will
// correctly reset the is_awaiting bit.