tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

async-gen-yield-star-sync-next.js (6807B)


      1 // |reftest| async
      2 // This file was procedurally generated from the following sources:
      3 // - src/async-generators/yield-star-sync-next.case
      4 // - src/async-generators/default/async-obj-method.template
      5 /*---
      6 description: execution order for yield* with sync iterator and next() (Async generator method)
      7 esid: prod-AsyncGeneratorMethod
      8 features: [Symbol.iterator, async-iteration, Symbol.asyncIterator]
      9 flags: [generated, async]
     10 info: |
     11    Async Generator Function Definitions
     12 
     13    AsyncGeneratorMethod :
     14      async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody }
     15 
     16 
     17    YieldExpression: yield * AssignmentExpression
     18 
     19    ...
     20    2. Let value be ? GetValue(exprRef).
     21    3. Let generatorKind be ! GetGeneratorKind().
     22    4. Let iterator be ? GetIterator(value, generatorKind).
     23    5. Let received be NormalCompletion(undefined).
     24    6. Repeat
     25      a. If received.[[Type]] is normal, then
     26        i. Let innerResult be ? IteratorNext(iterator, received.[[Value]]).
     27        ii. Let innerResult be ? Invoke(iterator, "next",
     28            « received.[[Value]] »).
     29        iii. If generatorKind is async, then set innerResult to
     30             ? Await(innerResult).
     31        ...
     32        v. Let done be ? IteratorComplete(innerResult).
     33        vi. If done is true, then
     34           1. Return ? IteratorValue(innerResult).
     35        vii. Let received be GeneratorYield(innerResult).
     36      ...
     37 
     38    GetIterator ( obj [ , hint ] )
     39 
     40    ...
     41    3. If hint is async,
     42      a. Set method to ? GetMethod(obj, @@asyncIterator).
     43      b. If method is undefined,
     44        i. Let syncMethod be ? GetMethod(obj, @@iterator).
     45        ii. Let syncIterator be ? Call(syncMethod, obj).
     46        iii. Return ? CreateAsyncFromSyncIterator(syncIterator).
     47    ...
     48 
     49    %AsyncFromSyncIteratorPrototype%.next ( value )
     50 
     51    ...
     52    5. Let nextResult be IteratorNext(syncIterator, value).
     53    ...
     54    7. Let nextValue be IteratorValue(nextResult).
     55    ...
     56    9. Let nextDone be IteratorComplete(nextResult).
     57    ...
     58    12. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined,
     59        « nextValue »).
     60    ...
     61    14. Set onFulfilled.[[Done]] to nextDone.
     62    15. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]],
     63        onFulfilled, undefined, promiseCapability).
     64    ...
     65 
     66    Async Iterator Value Unwrap Functions
     67 
     68    1. Return ! CreateIterResultObject(value, F.[[Done]]).
     69 
     70 ---*/
     71 var log = [];
     72 var obj = {
     73  get [Symbol.iterator]() {
     74    log.push({
     75      name: "get [Symbol.iterator]",
     76      thisValue: this
     77    });
     78    return function() {
     79      log.push({
     80        name: "call [Symbol.iterator]",
     81        thisValue: this,
     82        args: [...arguments]
     83      });
     84      var nextCount = 0;
     85      return {
     86        name: "syncIterator",
     87        get next() {
     88          log.push({
     89            name: "get next",
     90            thisValue: this
     91          });
     92          return function() {
     93            log.push({
     94              name: "call next",
     95              thisValue: this,
     96              args: [...arguments]
     97            });
     98 
     99            nextCount++;
    100            if (nextCount == 1) {
    101              return {
    102                name: "next-result-1",
    103                get value() {
    104                  log.push({
    105                    name: "get next value (1)",
    106                    thisValue: this
    107                  });
    108                  return "next-value-1";
    109                },
    110                get done() {
    111                  log.push({
    112                    name: "get next done (1)",
    113                    thisValue: this
    114                  });
    115                  return false;
    116                }
    117              };
    118            }
    119 
    120            return {
    121              name: "next-result-2",
    122              get value() {
    123                log.push({
    124                  name: "get next value (2)",
    125                  thisValue: this
    126                });
    127                return "next-value-2";
    128              },
    129              get done() {
    130                log.push({
    131                  name: "get next done (2)",
    132                  thisValue: this
    133                });
    134                return true;
    135              }
    136            };
    137          };
    138        }
    139      };
    140    };
    141  },
    142  get [Symbol.asyncIterator]() {
    143    log.push({ name: "get [Symbol.asyncIterator]" });
    144    return null;
    145  }
    146 };
    147 
    148 
    149 var callCount = 0;
    150 
    151 var gen = {
    152  async *method() {
    153    callCount += 1;
    154    log.push({ name: "before yield*" });
    155      var v = yield* obj;
    156      log.push({
    157        name: "after yield*",
    158        value: v
    159      });
    160      return "return-value";
    161 
    162  }
    163 }.method;
    164 
    165 var iter = gen();
    166 
    167 assert.sameValue(log.length, 0, "log.length");
    168 
    169 iter.next("next-arg-1").then(v => {
    170  assert.sameValue(log[0].name, "before yield*");
    171 
    172  assert.sameValue(log[1].name, "get [Symbol.asyncIterator]");
    173 
    174  assert.sameValue(log[2].name, "get [Symbol.iterator]");
    175  assert.sameValue(log[2].thisValue, obj, "get [Symbol.iterator] thisValue");
    176 
    177  assert.sameValue(log[3].name, "call [Symbol.iterator]");
    178  assert.sameValue(log[3].thisValue, obj, "[Symbol.iterator] thisValue");
    179  assert.sameValue(log[3].args.length, 0, "[Symbol.iterator] args.length");
    180 
    181  assert.sameValue(log[4].name, "get next");
    182  assert.sameValue(log[4].thisValue.name, "syncIterator", "get next thisValue");
    183 
    184  assert.sameValue(log[5].name, "call next");
    185  assert.sameValue(log[5].thisValue.name, "syncIterator", "next thisValue");
    186  assert.sameValue(log[5].args.length, 1, "next args.length");
    187  assert.sameValue(log[5].args[0], undefined, "next args[0]");
    188 
    189  assert.sameValue(log[6].name, "get next done (1)");
    190  assert.sameValue(log[6].thisValue.name, "next-result-1", "get next done thisValue");
    191 
    192  assert.sameValue(log[7].name, "get next value (1)");
    193  assert.sameValue(log[7].thisValue.name, "next-result-1", "get next value thisValue");
    194 
    195  assert.sameValue(v.value, "next-value-1");
    196  assert.sameValue(v.done, false);
    197 
    198  assert.sameValue(log.length, 8, "log.length");
    199 
    200  iter.next("next-arg-2").then(v => {
    201    assert.sameValue(log[8].name, "call next");
    202    assert.sameValue(log[8].thisValue.name, "syncIterator", "next thisValue");
    203    assert.sameValue(log[8].args.length, 1, "next args.length");
    204    assert.sameValue(log[8].args[0], "next-arg-2", "next args[0]");
    205 
    206    assert.sameValue(log[9].name, "get next done (2)");
    207    assert.sameValue(log[9].thisValue.name, "next-result-2", "get next done thisValue");
    208 
    209    assert.sameValue(log[10].name, "get next value (2)");
    210    assert.sameValue(log[10].thisValue.name, "next-result-2", "get next value thisValue");
    211 
    212    assert.sameValue(log[11].name, "after yield*");
    213    assert.sameValue(log[11].value, "next-value-2");
    214 
    215    assert.sameValue(v.value, "return-value");
    216    assert.sameValue(v.done, true);
    217 
    218    assert.sameValue(log.length, 12, "log.length");
    219  }).then($DONE, $DONE);
    220 }).catch($DONE);
    221 
    222 assert.sameValue(callCount, 1);