summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js
blob: da1e4c8c297286189f07f40233a7bb60cc8bb02f (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
// |reftest| skip-if(!this.hasOwnProperty('Iterator'))

const methods = [
  [iter => iter.map, x => x],
  [iter => iter.filter, x => true],
  [iter => iter.flatMap, x => [x]],
];

for (const method of methods) {
  const iter = [1, 2, 3].values();
  const iterMethod = method[0](iter);
  let iterHelper;
  let reentered = false;
  iterHelper = iterMethod.call(iter, x => {
    if (x == 2) {
      // Reenter the currently running generator.
      reentered = true;
      assertThrowsInstanceOf(() => iterHelper.next(), TypeError);
    }
    return method[1](x);
  });

  let result = iterHelper.next();
  assertEq(result.value, 1);
  assertEq(result.done, false);

  assertEq(reentered, false);
  result = iterHelper.next();
  assertEq(reentered, true);
  assertEq(result.value, 2);
  assertEq(result.done, false);

  result = iterHelper.next();
  assertEq(result.value, 3);
  assertEq(result.done, false);

  result = iterHelper.next();
  assertEq(result.value, undefined);
  assertEq(result.done, true);
}

if (typeof reportCompare == 'function')
  reportCompare(0, 0);