| Index: test/mjsunit/harmony/iterator-close.js
|
| diff --git a/test/mjsunit/harmony/iterator-close.js b/test/mjsunit/harmony/iterator-close.js
|
| deleted file mode 100644
|
| index 03cdeac0383b4660da1e267a7f41ae6024fc3b60..0000000000000000000000000000000000000000
|
| --- a/test/mjsunit/harmony/iterator-close.js
|
| +++ /dev/null
|
| @@ -1,1372 +0,0 @@
|
| -// Copyright 2016 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: --harmony-iterator-close
|
| -
|
| -
|
| -function* g() { yield 42; return 88 };
|
| -
|
| -
|
| -// Return method is "undefined".
|
| -{
|
| - g.prototype.return = null;
|
| -
|
| -
|
| - assertEquals(undefined, (() => {
|
| - for (var x of g()) { break; }
|
| - })());
|
| -
|
| - assertEquals(undefined, (() => {
|
| - for (let x of g()) { break; }
|
| - })());
|
| -
|
| - assertEquals(undefined, (() => {
|
| - for (const x of g()) { break; }
|
| - })());
|
| -
|
| - assertEquals(undefined, (() => {
|
| - for (x of g()) { break; }
|
| - })());
|
| -
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (var x of g()) { throw 42; }
|
| - }, 42);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) { throw 42; }
|
| - }, 42);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (const x of g()) { throw 42; }
|
| - }, 42);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (x of g()) { throw 42; }
|
| - }, 42);
|
| -
|
| -
|
| - assertEquals(42, (() => {
|
| - for (var x of g()) { return 42; }
|
| - })());
|
| -
|
| - assertEquals(42, (() => {
|
| - for (let x of g()) { return 42; }
|
| - })());
|
| -
|
| - assertEquals(42, (() => {
|
| - for (const x of g()) { return 42; }
|
| - })());
|
| -
|
| - assertEquals(42, (() => {
|
| - for (x of g()) { return 42; }
|
| - })());
|
| -
|
| -
|
| - assertEquals(42, eval('for (var x of g()) { x; }'));
|
| -
|
| - assertEquals(42, eval('for (let x of g()) { x; }'));
|
| -
|
| - assertEquals(42, eval('for (const x of g()) { x; }'));
|
| -
|
| - assertEquals(42, eval('for (x of g()) { x; }'));
|
| -
|
| -
|
| - assertEquals(42, (() => {
|
| - var [x] = g(); return x;
|
| - })());
|
| -
|
| - assertEquals(42, (() => {
|
| - let [x] = g(); return x;
|
| - })());
|
| -
|
| - assertEquals(42, (() => {
|
| - const [x] = g(); return x;
|
| - })());
|
| -
|
| - assertEquals(42, (() => {
|
| - [x] = g(); return x;
|
| - })());
|
| -
|
| - assertEquals(42,
|
| - (([x]) => x)(g())
|
| - );
|
| -}
|
| -
|
| -
|
| -// Return method is not callable.
|
| -{
|
| - g.prototype.return = 666;
|
| -
|
| -
|
| - assertThrows(() => {
|
| - for (var x of g()) { break; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (let x of g()) { break; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (const x of g()) { break; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (x of g()) { break; }
|
| - }, TypeError);
|
| -
|
| -
|
| - assertThrows(() => {
|
| - for (var x of g()) { throw 666; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (let x of g()) { throw 666; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (const x of g()) { throw 666; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (x of g()) { throw 666; }
|
| - }, TypeError);
|
| -
|
| -
|
| - assertThrows(() => {
|
| - for (var x of g()) { return 666; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (let x of g()) { return 666; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (const x of g()) { return 666; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (x of g()) { return 666; }
|
| - }, TypeError);
|
| -
|
| -
|
| - assertEquals(42, eval('for (var x of g()) { x; }'));
|
| -
|
| - assertEquals(42, eval('for (let x of g()) { x; }'));
|
| -
|
| - assertEquals(42, eval('for (const x of g()) { x; }'));
|
| -
|
| - assertEquals(42, eval('for (x of g()) { x; }'));
|
| -
|
| -
|
| - assertThrows(() => {
|
| - var [x] = g(); return x;
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - let [x] = g(); return x;
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - const [x] = g(); return x;
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - [x] = g(); return x;
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - (([x]) => x)(g());
|
| - }, TypeError);
|
| -}
|
| -
|
| -
|
| -// Return method does not return an object.
|
| -{
|
| - g.prototype.return = () => 666;
|
| -
|
| -
|
| - assertThrows(() => {
|
| - for (var x of g()) { break; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (let x of g()) { break; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (const x of g()) { break; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (x of g()) { break; }
|
| - }, TypeError);
|
| -
|
| -
|
| - // Throw from the body of a for loop 'wins' vs throw
|
| - // originating from a bad 'return' value.
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (var x of g()) { throw 666; }
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) { throw 666; }
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (const x of g()) { throw 666; }
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (x of g()) { throw 666; }
|
| - }, 666);
|
| -
|
| -
|
| - assertThrows(() => {
|
| - for (var x of g()) { return 666; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (let x of g()) { return 666; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (const x of g()) { return 666; }
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - for (x of g()) { return 666; }
|
| - }, TypeError);
|
| -
|
| -
|
| - assertEquals(42, eval('for (var x of g()) { x; }'));
|
| -
|
| - assertEquals(42, eval('for (let x of g()) { x; }'));
|
| -
|
| - assertEquals(42, eval('for (const x of g()) { x; }'));
|
| -
|
| - assertEquals(42, eval('for (x of g()) { x; }'));
|
| -
|
| -
|
| - assertThrows(() => {
|
| - var [x] = g(); return x;
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - let [x] = g(); return x;
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - const [x] = g(); return x;
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - [x] = g(); return x;
|
| - }, TypeError);
|
| -
|
| - assertThrows(() => {
|
| - (([x]) => x)(g());
|
| - }, TypeError);
|
| -}
|
| -
|
| -
|
| -// Return method returns an object.
|
| -{
|
| - let log = [];
|
| - g.prototype.return = (...args) => { log.push(args); return {} };
|
| -
|
| -
|
| - log = [];
|
| - for (var x of g()) { break; }
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - for (let x of g()) { break; }
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - for (const x of g()) { break; }
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - for (x of g()) { break; }
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (var x of g()) { throw 42; }
|
| - }, 42);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) { throw 42; }
|
| - }, 42);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (const x of g()) { throw 42; }
|
| - }, 42);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (x of g()) { throw 42; }
|
| - }, 42);
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - for (var x of g()) { return 42; }
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - for (let x of g()) { return 42; }
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - for (const x of g()) { return 42; }
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - for (x of g()) { return 42; }
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals(42, eval('for (var x of g()) { x; }'));
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, eval('for (let x of g()) { x; }'));
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, eval('for (const x of g()) { x; }'));
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, eval('for (x of g()) { x; }'));
|
| - assertEquals([], log);
|
| -
|
| -
|
| - // Even if doing the assignment throws, still call return
|
| - log = [];
|
| - x = { set attr(_) { throw 1234; } };
|
| - assertThrowsEquals(() => {
|
| - for (x.attr of g()) { throw 456; }
|
| - }, 1234);
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - var [x] = g(); return x;
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - let [x] = g(); return x;
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - const [x] = g(); return x;
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - [x] = g(); return x;
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = []
|
| - assertEquals(42,
|
| - (([x]) => x)(g())
|
| - );
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - var [x,] = g(); return x;
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - let [x,] = g(); return x;
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - const [x,] = g(); return x;
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - [x,] = g(); return x;
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = []
|
| - assertEquals(42,
|
| - (([x,]) => x)(g())
|
| - );
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - var [x,,] = g(); return x;
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - let [x,,] = g(); return x;
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - const [x,,] = g(); return x;
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, (() => {
|
| - [x,,] = g(); return x;
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertEquals(42,
|
| - (([x,,]) => x)(g())
|
| - );
|
| - assertEquals([], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals([42, undefined], (() => {
|
| - var [x, y] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42, undefined], (() => {
|
| - let [x, y] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42, undefined], (() => {
|
| - const [x, y] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42, undefined], (() => {
|
| - [x, y] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertEquals([42, undefined],
|
| - (([x, y]) => [x, y])(g())
|
| - );
|
| - assertEquals([], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals([42], (() => {
|
| - var [...x] = g(); return x;
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42], (() => {
|
| - let [...x] = g(); return x;
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42], (() => {
|
| - const [...x] = g(); return x;
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42], (() => {
|
| - [...x] = g(); return x;
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertEquals([42],
|
| - (([...x]) => x)(g())
|
| - );
|
| - assertEquals([], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals([42, []], (() => {
|
| - var [x, ...y] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42, []], (() => {
|
| - let [x, ...y] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42, []], (() => {
|
| - const [x, ...y] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42, []], (() => {
|
| - [x, ...y] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertEquals([42, []],
|
| - (([x, ...y]) => [x, y])(g())
|
| - );
|
| - assertEquals([], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals([], (() => {
|
| - var [] = g(); return [];
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals([], (() => {
|
| - let [] = g(); return [];
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals([], (() => {
|
| - const [] = g(); return [];
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertEquals([], (() => {
|
| - [] = g(); return [];
|
| - })());
|
| - assertEquals([[]], log);
|
| -
|
| - log = []
|
| - assertEquals([],
|
| - (([]) => [])(g())
|
| - );
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals([], (() => {
|
| - var [...[]] = g(); return [];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([], (() => {
|
| - let [...[]] = g(); return [];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([], (() => {
|
| - const [...[]] = g(); return [];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([], (() => {
|
| - [...[]] = g(); return [];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertEquals([],
|
| - (([...[]]) => [])(g())
|
| - );
|
| - assertEquals([], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals([42], (() => {
|
| - var [...[x]] = g(); return [x];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42], (() => {
|
| - let [...[x]] = g(); return [x];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42], (() => {
|
| - const [...[x]] = g(); return [x];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42], (() => {
|
| - [...[x]] = g(); return [x];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertEquals([42],
|
| - (([...[x]]) => [x])(g())
|
| - );
|
| - assertEquals([], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals([42, undefined], (() => {
|
| - var [...[x, y]] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42, undefined], (() => {
|
| - let [...[x, y]] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42, undefined], (() => {
|
| - const [...[x, y]] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals([42, undefined], (() => {
|
| - [...[x, y]] = g(); return [x, y];
|
| - })());
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertEquals([42, undefined],
|
| - (([...[x, y]]) => [x, y])(g())
|
| - );
|
| - assertEquals([], log);
|
| -
|
| -
|
| - log = []
|
| - assertThrowsEquals(() => {
|
| - let x = { set foo(_) { throw 666; } };
|
| - [x.foo] = g();
|
| - }, 666);
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = []
|
| - assertThrows(() => {
|
| - var [[]] = g();
|
| - }, TypeError);
|
| - assertEquals([[]], log);
|
| -
|
| - log = []
|
| - assertThrows(() => {
|
| - let [[]] = g();
|
| - }, TypeError);
|
| - assertEquals([[]], log);
|
| -
|
| - log = []
|
| - assertThrows(() => {
|
| - const [[]] = g();
|
| - }, TypeError);
|
| - assertEquals([[]], log);
|
| -
|
| - log = []
|
| - assertThrows(() => {
|
| - [[]] = g();
|
| - }, TypeError);
|
| - assertEquals([[]], log);
|
| -
|
| - log = []
|
| - assertThrows(() => {
|
| - (([[]]) => 0)(g());
|
| - }, TypeError);
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = []
|
| - assertThrows(() => {
|
| - var [...[[]]] = g();
|
| - }, TypeError);
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertThrows(() => {
|
| - let [...[[]]] = g();
|
| - }, TypeError);
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertThrows(() => {
|
| - const [...[[]]] = g();
|
| - }, TypeError);
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertThrows(() => {
|
| - [...[[]]] = g();
|
| - }, TypeError);
|
| - assertEquals([], log);
|
| -
|
| - log = []
|
| - assertThrows(() => {
|
| - (([...[[]]]) => 0)(g());
|
| - }, TypeError);
|
| - assertEquals([], log);
|
| -
|
| -
|
| - {
|
| - let backup = Array.prototype[Symbol.iterator];
|
| - Array.prototype[Symbol.iterator] = () => g();
|
| -
|
| -
|
| - log = [];
|
| - assertDoesNotThrow(() => {
|
| - var [x, ...[y]] = [1, 2, 3]
|
| - });
|
| - assertEquals(log, [[]]);
|
| -
|
| - log = [];
|
| - assertDoesNotThrow(() => {
|
| - let [x, ...[y]] = [1, 2, 3];
|
| - });
|
| - assertEquals(log, [[]]);
|
| -
|
| - log = [];
|
| - assertDoesNotThrow(() => {
|
| - const [x, ...[y]] = [1, 2, 3];
|
| - });
|
| - assertEquals(log, [[]]);
|
| -
|
| - log = [];
|
| - assertDoesNotThrow(() => {
|
| - (([x, ...[y]]) => {})([1, 2, 3]);
|
| - });
|
| - assertEquals(log, [[]]);
|
| -
|
| -
|
| - log = [];
|
| - assertThrows(() => {
|
| - var [x, ...[[]]] = [1, 2, 3];
|
| - }, TypeError);
|
| - assertEquals(log, [[]]);
|
| -
|
| - log = [];
|
| - assertThrows(() => {
|
| - let [x, ...[[]]] = [1, 2, 3];
|
| - }, TypeError);
|
| - assertEquals(log, [[]]);
|
| -
|
| - log = [];
|
| - assertThrows(() => {
|
| - const [x, ...[[]]] = [1, 2, 3];
|
| - }, TypeError);
|
| - assertEquals(log, [[]]);
|
| -
|
| - log = [];
|
| - assertThrows(() => {
|
| - (([x, ...[[]]]) => {})([1, 2, 3]);
|
| - }, TypeError);
|
| - assertEquals(log, [[]]);
|
| -
|
| -
|
| - log = [];
|
| - assertDoesNotThrow(() => {
|
| - var [x, ...[...y]] = [1, 2, 3];
|
| - });
|
| - assertEquals(log, []);
|
| -
|
| - log = [];
|
| - assertDoesNotThrow(() => {
|
| - let [x, ...[...y]] = [1, 2, 3];
|
| - });
|
| - assertEquals(log, []);
|
| -
|
| - log = [];
|
| - assertDoesNotThrow(() => {
|
| - const [x, ...[...y]] = [1, 2, 3];
|
| - });
|
| - assertEquals(log, []);
|
| -
|
| - log = [];
|
| - assertDoesNotThrow(() => {
|
| - (([x, ...[...y]]) => {})([1, 2, 3]);
|
| - });
|
| - assertEquals(log, []);
|
| -
|
| -
|
| - Array.prototype[Symbol.iterator] = backup;
|
| - }
|
| -}
|
| -
|
| -
|
| -// Return method throws.
|
| -{
|
| - let log = [];
|
| - g.prototype.return = (...args) => { log.push(args); throw 23 };
|
| -
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (var x of g()) { break; }
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) { break; }
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (const x of g()) { break; }
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (x of g()) { break; }
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (var x of g()) { throw 42; }
|
| - }, 42);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) { throw 42; }
|
| - }, 42);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (const x of g()) { throw 42; }
|
| - }, 42);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (x of g()) { throw 42; }
|
| - }, 42);
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (var x of g()) { return 42; }
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) { return 42; }
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (const x of g()) { return 42; }
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (x of g()) { return 42; }
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| -
|
| - log = [];
|
| - assertEquals(42, eval('for (var x of g()) { x; }'));
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, eval('for (let x of g()) { x; }'));
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, eval('for (const x of g()) { x; }'));
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertEquals(42, eval('for (x of g()) { x; }'));
|
| - assertEquals([], log);
|
| -
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - var [x] = g(); return x;
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - let [x] = g(); return x;
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - const [x] = g(); return x;
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - [x] = g(); return x;
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - (([x]) => x)(g())
|
| - }, 23);
|
| - assertEquals([[]], log);
|
| -}
|
| -
|
| -
|
| -// Next method throws.
|
| -{
|
| - g.prototype.next = () => { throw 666; };
|
| - g.prototype.return = () => { assertUnreachable() };
|
| -
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (var x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (const x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - var [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - let [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - const [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - (([x]) => x)(g());
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - var [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - let [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - const [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - (([...x]) => x)(g());
|
| - }, 666);
|
| -}
|
| -
|
| -
|
| -// Value throws.
|
| -{
|
| - g.prototype.next = () => ({get value() {throw 666}});
|
| - g.prototype.return = () => { assertUnreachable() };
|
| -
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (var x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (const x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - var [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - let [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - const [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - (([x]) => x)(g());
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - var [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - let [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - const [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - (([...x]) => x)(g());
|
| - }, 666);
|
| -}
|
| -
|
| -
|
| -// Done throws.
|
| -{
|
| - g.prototype.next = () => ({get done() {throw 666}});
|
| - g.prototype.return = () => { assertUnreachable() };
|
| -
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (var x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (const x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (x of g()) {}
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - var [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - let [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - const [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - [x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - (([x]) => x)(g());
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - var [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - let [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - const [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - [...x] = g();
|
| - }, 666);
|
| -
|
| - assertThrowsEquals(() => {
|
| - (([...x]) => x)(g());
|
| - }, 666);
|
| -}
|
| -
|
| -
|
| -// Nested loops.
|
| -{
|
| - function* g1() { yield 1; yield 2; throw 3; }
|
| - function* g2() { yield -1; yield -2; throw -3; }
|
| -
|
| - assertDoesNotThrow(() => {
|
| - for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - if (y == -2) break;
|
| - }
|
| - if (x == 2) break;
|
| - }
|
| - }, -3);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - }
|
| - }
|
| - }, -3);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - if (y == -2) break;
|
| - }
|
| - }
|
| - }, 3);
|
| -
|
| - assertDoesNotThrow(() => {
|
| - l: for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - if (y == -2) break l;
|
| - }
|
| - }
|
| - });
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - throw 4;
|
| - }
|
| - }
|
| - }, 4);
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - if (y == -2) throw 4;
|
| - }
|
| - }
|
| - }, 4);
|
| -
|
| - let log = [];
|
| - g1.prototype.return = () => { log.push(1); throw 5 };
|
| - g2.prototype.return = () => { log.push(2); throw -5 };
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - if (y == -2) break;
|
| - }
|
| - if (x == 2) break;
|
| - }
|
| - }, -5);
|
| - assertEquals([2, 1], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - }
|
| - }
|
| - }, -3);
|
| - assertEquals([1], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - if (y == -2) break;
|
| - }
|
| - }
|
| - }, -5);
|
| - assertEquals([2, 1], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - l: for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - if (y == -2) break l;
|
| - }
|
| - }
|
| - }, -5);
|
| - assertEquals([2, 1], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - throw 4;
|
| - }
|
| - }
|
| - }, 4);
|
| - assertEquals([2, 1], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - for (let y of g2()) {
|
| - if (y == -2) throw 4;
|
| - }
|
| - }
|
| - }, 4);
|
| - assertEquals([2, 1], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - try {
|
| - for (let y of g2()) {
|
| - }
|
| - } catch (_) {}
|
| - }
|
| - }, 3);
|
| - assertEquals([], log);
|
| -
|
| - log = [];
|
| - assertThrowsEquals(() => {
|
| - for (let x of g1()) {
|
| - try {
|
| - for (let y of g2()) {
|
| - }
|
| - } catch (_) {}
|
| - if (x == 2) break;
|
| - }
|
| - }, 5);
|
| - assertEquals([1], log);
|
| -}
|
| -
|
| -
|
| -// yield*, argument's return method is "undefined".
|
| -function TestYieldStarWithoutReturn(get_iterable) {
|
| - assertTrue(get_iterable().return == undefined);
|
| -
|
| - function* g() { yield* get_iterable() }
|
| -
|
| - {
|
| - let gen = g();
|
| - assertEquals({value: 1, done: false}, gen.next());
|
| - assertEquals({value: undefined, done: true}, gen.return());
|
| - }
|
| -
|
| - assertEquals(42, (() => {
|
| - for (let x of g()) break;
|
| - return 42;
|
| - })());
|
| -
|
| - assertEquals(42, (() => {
|
| - for (let x of g()) return 42;
|
| - })());
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) throw 42;
|
| - }, 42);
|
| -}
|
| -{
|
| - let get_iterable1 = () => [1, 2];
|
| - let get_iterable2 = function*() { yield 1; yield 2 };
|
| - get_iterable2.prototype.return = null;
|
| - TestYieldStarWithoutReturn(get_iterable1);
|
| - TestYieldStarWithoutReturn(get_iterable2);
|
| -}
|
| -
|
| -
|
| -// yield*, argument's return method is defined.
|
| -{
|
| - let get_iterable = function*() { yield 1; yield 2 };
|
| - const obj = {};
|
| - get_iterable.prototype.return = (...args) => obj;
|
| -
|
| - function* g() { yield* get_iterable() }
|
| -
|
| - {
|
| - let gen = g();
|
| - assertEquals({value: 1, done: false}, gen.next());
|
| - assertSame(obj, gen.return());
|
| - assertSame(obj, gen.return());
|
| - assertSame(obj, gen.return());
|
| - assertEquals({value: 2, done: false}, gen.next());
|
| - assertSame(obj, gen.return());
|
| - assertSame(obj, gen.return());
|
| - assertSame(obj, gen.return());
|
| - assertEquals({value: undefined, done: true}, gen.next());
|
| - assertEquals({value: undefined, done: true}, gen.return());
|
| - assertEquals({value: undefined, done: true}, gen.return());
|
| - }
|
| -
|
| - assertEquals(42, (() => {
|
| - for (let x of g()) break;
|
| - return 42;
|
| - })());
|
| -
|
| - assertEquals(42, (() => {
|
| - for (let x of g()) return 42;
|
| - })());
|
| -
|
| - assertThrowsEquals(() => {
|
| - for (let x of g()) throw 42;
|
| - }, 42);
|
| -}
|
|
|