Index: test/mjsunit/harmony/generators-iteration.js |
diff --git a/test/mjsunit/harmony/generators-iteration.js b/test/mjsunit/harmony/generators-iteration.js |
deleted file mode 100644 |
index 1a793678d93c4e0d3acbec82059b90d658bac71e..0000000000000000000000000000000000000000 |
--- a/test/mjsunit/harmony/generators-iteration.js |
+++ /dev/null |
@@ -1,698 +0,0 @@ |
-// Copyright 2013 the V8 project authors. All rights reserved. |
-// Redistribution and use in source and binary forms, with or without |
-// modification, are permitted provided that the following conditions are |
-// met: |
-// |
-// * Redistributions of source code must retain the above copyright |
-// notice, this list of conditions and the following disclaimer. |
-// * Redistributions in binary form must reproduce the above |
-// copyright notice, this list of conditions and the following |
-// disclaimer in the documentation and/or other materials provided |
-// with the distribution. |
-// * Neither the name of Google Inc. nor the names of its |
-// contributors may be used to endorse or promote products derived |
-// from this software without specific prior written permission. |
-// |
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- |
-// Flags: --harmony-generators --expose-gc |
- |
-// Test generator iteration. |
- |
-var GeneratorFunction = (function*(){yield 1;}).__proto__.constructor; |
- |
-function assertIteratorResult(value, done, result) { |
- assertEquals({ value: value, done: done}, result); |
-} |
- |
-function assertIteratorIsClosed(iter) { |
- assertIteratorResult(undefined, true, iter.next()); |
- assertDoesNotThrow(function() { iter.next(); }); |
-} |
- |
-function assertThrownIteratorIsClosed(iter) { |
- // TODO(yusukesuzuki): Since status of a thrown generator is "executing", |
- // following tests are failed. |
- // https://code.google.com/p/v8/issues/detail?id=3096 |
- // assertIteratorIsClosed(iter); |
-} |
- |
-function TestGeneratorResultPrototype() { |
- function* g() { yield 1; } |
- var iter = g(); |
- var result = iter.next(); |
- |
- assertSame(Object.prototype, Object.getPrototypeOf(result)); |
- property_names = Object.getOwnPropertyNames(result); |
- property_names.sort(); |
- assertEquals(["done", "value"], property_names); |
- assertIteratorResult(1, false, result); |
-} |
-TestGeneratorResultPrototype() |
- |
-function TestGenerator(g, expected_values_for_next, |
- send_val, expected_values_for_send) { |
- function testNext(thunk) { |
- var iter = thunk(); |
- for (var i = 0; i < expected_values_for_next.length; i++) { |
- var v1 = expected_values_for_next[i]; |
- var v2 = i == expected_values_for_next.length - 1; |
- // var v3 = iter.next(); |
- assertIteratorResult(v1, v2, iter.next()); |
- } |
- assertIteratorIsClosed(iter); |
- } |
- function testSend(thunk) { |
- var iter = thunk(); |
- for (var i = 0; i < expected_values_for_send.length; i++) { |
- assertIteratorResult(expected_values_for_send[i], |
- i == expected_values_for_send.length - 1, |
- iter.next(send_val)); |
- } |
- assertIteratorIsClosed(iter); |
- } |
- function testThrow(thunk) { |
- for (var i = 0; i < expected_values_for_next.length; i++) { |
- var iter = thunk(); |
- for (var j = 0; j < i; j++) { |
- assertIteratorResult(expected_values_for_next[j], |
- j == expected_values_for_next.length - 1, |
- iter.next()); |
- } |
- function Sentinel() {} |
- assertThrows(function () { iter.throw(new Sentinel); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- } |
- |
- testNext(g); |
- testSend(g); |
- testThrow(g); |
- |
- testNext(function*() { return yield* g(); }); |
- testSend(function*() { return yield* g(); }); |
- testThrow(function*() { return yield* g(); }); |
- |
- if (g instanceof GeneratorFunction) { |
- testNext(function() { return new g(); }); |
- testSend(function() { return new g(); }); |
- testThrow(function() { return new g(); }); |
- } |
-} |
- |
-TestGenerator(function* g1() { }, |
- [undefined], |
- "foo", |
- [undefined]); |
- |
-TestGenerator(function* g2() { yield 1; }, |
- [1, undefined], |
- "foo", |
- [1, undefined]); |
- |
-TestGenerator(function* g3() { yield 1; yield 2; }, |
- [1, 2, undefined], |
- "foo", |
- [1, 2, undefined]); |
- |
-TestGenerator(function* g4() { yield 1; yield 2; return 3; }, |
- [1, 2, 3], |
- "foo", |
- [1, 2, 3]); |
- |
-TestGenerator(function* g5() { return 1; }, |
- [1], |
- "foo", |
- [1]); |
- |
-TestGenerator(function* g6() { var x = yield 1; return x; }, |
- [1, undefined], |
- "foo", |
- [1, "foo"]); |
- |
-TestGenerator(function* g7() { var x = yield 1; yield 2; return x; }, |
- [1, 2, undefined], |
- "foo", |
- [1, 2, "foo"]); |
- |
-TestGenerator(function* g8() { for (var x = 0; x < 4; x++) { yield x; } }, |
- [0, 1, 2, 3, undefined], |
- "foo", |
- [0, 1, 2, 3, undefined]); |
- |
-// Generator with arguments. |
-TestGenerator( |
- function g9() { |
- return (function*(a, b, c, d) { |
- yield a; yield b; yield c; yield d; |
- })("fee", "fi", "fo", "fum"); |
- }, |
- ["fee", "fi", "fo", "fum", undefined], |
- "foo", |
- ["fee", "fi", "fo", "fum", undefined]); |
- |
-// Too few arguments. |
-TestGenerator( |
- function g10() { |
- return (function*(a, b, c, d) { |
- yield a; yield b; yield c; yield d; |
- })("fee", "fi"); |
- }, |
- ["fee", "fi", undefined, undefined, undefined], |
- "foo", |
- ["fee", "fi", undefined, undefined, undefined]); |
- |
-// Too many arguments. |
-TestGenerator( |
- function g11() { |
- return (function*(a, b, c, d) { |
- yield a; yield b; yield c; yield d; |
- })("fee", "fi", "fo", "fum", "I smell the blood of an Englishman"); |
- }, |
- ["fee", "fi", "fo", "fum", undefined], |
- "foo", |
- ["fee", "fi", "fo", "fum", undefined]); |
- |
-// The arguments object. |
-TestGenerator( |
- function g12() { |
- return (function*(a, b, c, d) { |
- for (var i = 0; i < arguments.length; i++) { |
- yield arguments[i]; |
- } |
- })("fee", "fi", "fo", "fum", "I smell the blood of an Englishman"); |
- }, |
- ["fee", "fi", "fo", "fum", "I smell the blood of an Englishman", |
- undefined], |
- "foo", |
- ["fee", "fi", "fo", "fum", "I smell the blood of an Englishman", |
- undefined]); |
- |
-// Access to captured free variables. |
-TestGenerator( |
- function g13() { |
- return (function(a, b, c, d) { |
- return (function*() { |
- yield a; yield b; yield c; yield d; |
- })(); |
- })("fee", "fi", "fo", "fum"); |
- }, |
- ["fee", "fi", "fo", "fum", undefined], |
- "foo", |
- ["fee", "fi", "fo", "fum", undefined]); |
- |
-// Abusing the arguments object. |
-TestGenerator( |
- function g14() { |
- return (function*(a, b, c, d) { |
- arguments[0] = "Be he live"; |
- arguments[1] = "or be he dead"; |
- arguments[2] = "I'll grind his bones"; |
- arguments[3] = "to make my bread"; |
- yield a; yield b; yield c; yield d; |
- })("fee", "fi", "fo", "fum"); |
- }, |
- ["Be he live", "or be he dead", "I'll grind his bones", "to make my bread", |
- undefined], |
- "foo", |
- ["Be he live", "or be he dead", "I'll grind his bones", "to make my bread", |
- undefined]); |
- |
-// Abusing the arguments object: strict mode. |
-TestGenerator( |
- function g15() { |
- return (function*(a, b, c, d) { |
- "use strict"; |
- arguments[0] = "Be he live"; |
- arguments[1] = "or be he dead"; |
- arguments[2] = "I'll grind his bones"; |
- arguments[3] = "to make my bread"; |
- yield a; yield b; yield c; yield d; |
- })("fee", "fi", "fo", "fum"); |
- }, |
- ["fee", "fi", "fo", "fum", undefined], |
- "foo", |
- ["fee", "fi", "fo", "fum", undefined]); |
- |
-// GC. |
-TestGenerator(function* g16() { yield "baz"; gc(); yield "qux"; }, |
- ["baz", "qux", undefined], |
- "foo", |
- ["baz", "qux", undefined]); |
- |
-// Receivers. |
-TestGenerator( |
- function g17() { |
- function* g() { yield this.x; yield this.y; } |
- var o = { start: g, x: 1, y: 2 }; |
- return o.start(); |
- }, |
- [1, 2, undefined], |
- "foo", |
- [1, 2, undefined]); |
- |
-TestGenerator( |
- function g18() { |
- function* g() { yield this.x; yield this.y; } |
- var iter = new g; |
- iter.x = 1; |
- iter.y = 2; |
- return iter; |
- }, |
- [1, 2, undefined], |
- "foo", |
- [1, 2, undefined]); |
- |
-TestGenerator( |
- function* g19() { |
- var x = 1; |
- yield x; |
- with({x:2}) { yield x; } |
- yield x; |
- }, |
- [1, 2, 1, undefined], |
- "foo", |
- [1, 2, 1, undefined]); |
- |
-TestGenerator( |
- function* g20() { yield (1 + (yield 2) + 3); }, |
- [2, NaN, undefined], |
- "foo", |
- [2, "1foo3", undefined]); |
- |
-TestGenerator( |
- function* g21() { return (1 + (yield 2) + 3); }, |
- [2, NaN], |
- "foo", |
- [2, "1foo3"]); |
- |
-TestGenerator( |
- function* g22() { yield (1 + (yield 2) + 3); yield (4 + (yield 5) + 6); }, |
- [2, NaN, 5, NaN, undefined], |
- "foo", |
- [2, "1foo3", 5, "4foo6", undefined]); |
- |
-TestGenerator( |
- function* g23() { |
- return (yield (1 + (yield 2) + 3)) + (yield (4 + (yield 5) + 6)); |
- }, |
- [2, NaN, 5, NaN, NaN], |
- "foo", |
- [2, "1foo3", 5, "4foo6", "foofoo"]); |
- |
-// Rewind a try context with and without operands on the stack. |
-TestGenerator( |
- function* g24() { |
- try { |
- return (yield (1 + (yield 2) + 3)) + (yield (4 + (yield 5) + 6)); |
- } catch (e) { |
- throw e; |
- } |
- }, |
- [2, NaN, 5, NaN, NaN], |
- "foo", |
- [2, "1foo3", 5, "4foo6", "foofoo"]); |
- |
-// Yielding in a catch context, with and without operands on the stack. |
-TestGenerator( |
- function* g25() { |
- try { |
- throw (yield (1 + (yield 2) + 3)) |
- } catch (e) { |
- if (typeof e == 'object') throw e; |
- return e + (yield (4 + (yield 5) + 6)); |
- } |
- }, |
- [2, NaN, 5, NaN, NaN], |
- "foo", |
- [2, "1foo3", 5, "4foo6", "foofoo"]); |
- |
-// Yield with no arguments yields undefined. |
-TestGenerator( |
- function* g26() { return yield yield }, |
- [undefined, undefined, undefined], |
- "foo", |
- [undefined, "foo", "foo"]); |
- |
-// A newline causes the parser to stop looking for an argument to yield. |
-TestGenerator( |
- function* g27() { |
- yield |
- 3 |
- return |
- }, |
- [undefined, undefined], |
- "foo", |
- [undefined, undefined]); |
- |
-// TODO(wingo): We should use TestGenerator for these, except that |
-// currently yield* will unconditionally propagate a throw() to the |
-// delegate iterator, which fails for these iterators that don't have |
-// throw(). See http://code.google.com/p/v8/issues/detail?id=3484. |
-(function() { |
- function* g28() { |
- yield* [1, 2, 3]; |
- } |
- var iter = g28(); |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- assertIteratorResult(3, false, iter.next()); |
- assertIteratorResult(undefined, true, iter.next()); |
-})(); |
- |
-(function() { |
- function* g29() { |
- yield* "abc"; |
- } |
- var iter = g29(); |
- assertIteratorResult("a", false, iter.next()); |
- assertIteratorResult("b", false, iter.next()); |
- assertIteratorResult("c", false, iter.next()); |
- assertIteratorResult(undefined, true, iter.next()); |
-})(); |
- |
-// Generator function instances. |
-TestGenerator(GeneratorFunction(), |
- [undefined], |
- "foo", |
- [undefined]); |
- |
-TestGenerator(new GeneratorFunction(), |
- [undefined], |
- "foo", |
- [undefined]); |
- |
-TestGenerator(GeneratorFunction('yield 1;'), |
- [1, undefined], |
- "foo", |
- [1, undefined]); |
- |
-TestGenerator( |
- function() { return GeneratorFunction('x', 'y', 'yield x + y;')(1, 2) }, |
- [3, undefined], |
- "foo", |
- [3, undefined]); |
- |
-// Access to this with formal arguments. |
-TestGenerator( |
- function () { |
- return ({ x: 42, g: function* (a) { yield this.x } }).g(0); |
- }, |
- [42, undefined], |
- "foo", |
- [42, undefined]); |
- |
-// Test that yield* re-yields received results without re-boxing. |
-function TestDelegatingYield() { |
- function results(results) { |
- var i = 0; |
- function next() { |
- return results[i++]; |
- } |
- var iter = { next: next }; |
- var ret = {}; |
- ret[Symbol.iterator] = function() { return iter; }; |
- return ret; |
- } |
- function* yield_results(expected) { |
- return yield* results(expected); |
- } |
- function collect_results(iterable) { |
- var iter = iterable[Symbol.iterator](); |
- var ret = []; |
- var result; |
- do { |
- result = iter.next(); |
- ret.push(result); |
- } while (!result.done); |
- return ret; |
- } |
- // We have to put a full result for the end, because the return will re-box. |
- var expected = [{value: 1}, 13, "foo", {value: 34, done: true}]; |
- |
- // Sanity check. |
- assertEquals(expected, collect_results(results(expected))); |
- assertEquals(expected, collect_results(yield_results(expected))); |
-} |
-TestDelegatingYield(); |
- |
-function TestTryCatch(instantiate) { |
- function* g() { yield 1; try { yield 2; } catch (e) { yield e; } yield 3; } |
- function Sentinel() {} |
- |
- function Test1(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- assertIteratorResult(3, false, iter.next()); |
- assertIteratorIsClosed(iter); |
- } |
- Test1(instantiate(g)); |
- |
- function Test2(iter) { |
- assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test2(instantiate(g)); |
- |
- function Test3(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test3(instantiate(g)); |
- |
- function Test4(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- var exn = new Sentinel; |
- assertIteratorResult(exn, false, iter.throw(exn)); |
- assertIteratorResult(3, false, iter.next()); |
- assertIteratorIsClosed(iter); |
- } |
- Test4(instantiate(g)); |
- |
- function Test5(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- var exn = new Sentinel; |
- assertIteratorResult(exn, false, iter.throw(exn)); |
- assertIteratorResult(3, false, iter.next()); |
- assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test5(instantiate(g)); |
- |
- function Test6(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- var exn = new Sentinel; |
- assertIteratorResult(exn, false, iter.throw(exn)); |
- assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test6(instantiate(g)); |
- |
- function Test7(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- assertIteratorResult(3, false, iter.next()); |
- assertIteratorIsClosed(iter); |
- } |
- Test7(instantiate(g)); |
-} |
-TestTryCatch(function (g) { return g(); }); |
-TestTryCatch(function* (g) { return yield* g(); }); |
- |
-function TestTryFinally(instantiate) { |
- function* g() { yield 1; try { yield 2; } finally { yield 3; } yield 4; } |
- function Sentinel() {} |
- function Sentinel2() {} |
- |
- function Test1(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- assertIteratorResult(3, false, iter.next()); |
- assertIteratorResult(4, false, iter.next()); |
- assertIteratorIsClosed(iter); |
- } |
- Test1(instantiate(g)); |
- |
- function Test2(iter) { |
- assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test2(instantiate(g)); |
- |
- function Test3(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test3(instantiate(g)); |
- |
- function Test4(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- assertIteratorResult(3, false, iter.throw(new Sentinel)); |
- assertThrows(function() { iter.next(); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test4(instantiate(g)); |
- |
- function Test5(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- assertIteratorResult(3, false, iter.throw(new Sentinel)); |
- assertThrows(function() { iter.throw(new Sentinel2); }, Sentinel2); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test5(instantiate(g)); |
- |
- function Test6(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- assertIteratorResult(3, false, iter.next()); |
- assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test6(instantiate(g)); |
- |
- function Test7(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- assertIteratorResult(3, false, iter.next()); |
- assertIteratorResult(4, false, iter.next()); |
- assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test7(instantiate(g)); |
- |
- function Test8(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- assertIteratorResult(3, false, iter.next()); |
- assertIteratorResult(4, false, iter.next()); |
- assertIteratorIsClosed(iter); |
- } |
- Test8(instantiate(g)); |
-} |
-TestTryFinally(function (g) { return g(); }); |
-TestTryFinally(function* (g) { return yield* g(); }); |
- |
-function TestNestedTry(instantiate) { |
- function* g() { |
- try { |
- yield 1; |
- try { yield 2; } catch (e) { yield e; } |
- yield 3; |
- } finally { |
- yield 4; |
- } |
- yield 5; |
- } |
- function Sentinel() {} |
- function Sentinel2() {} |
- |
- function Test1(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- assertIteratorResult(3, false, iter.next()); |
- assertIteratorResult(4, false, iter.next()); |
- assertIteratorResult(5, false, iter.next()); |
- assertIteratorIsClosed(iter); |
- } |
- Test1(instantiate(g)); |
- |
- function Test2(iter) { |
- assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test2(instantiate(g)); |
- |
- function Test3(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(4, false, iter.throw(new Sentinel)); |
- assertThrows(function() { iter.next(); }, Sentinel); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test3(instantiate(g)); |
- |
- function Test4(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(4, false, iter.throw(new Sentinel)); |
- assertThrows(function() { iter.throw(new Sentinel2); }, Sentinel2); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test4(instantiate(g)); |
- |
- function Test5(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- var exn = new Sentinel; |
- assertIteratorResult(exn, false, iter.throw(exn)); |
- assertIteratorResult(3, false, iter.next()); |
- assertIteratorResult(4, false, iter.next()); |
- assertIteratorResult(5, false, iter.next()); |
- assertIteratorIsClosed(iter); |
- } |
- Test5(instantiate(g)); |
- |
- function Test6(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- var exn = new Sentinel; |
- assertIteratorResult(exn, false, iter.throw(exn)); |
- assertIteratorResult(4, false, iter.throw(new Sentinel2)); |
- assertThrows(function() { iter.next(); }, Sentinel2); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test6(instantiate(g)); |
- |
- function Test7(iter) { |
- assertIteratorResult(1, false, iter.next()); |
- assertIteratorResult(2, false, iter.next()); |
- var exn = new Sentinel; |
- assertIteratorResult(exn, false, iter.throw(exn)); |
- assertIteratorResult(3, false, iter.next()); |
- assertIteratorResult(4, false, iter.throw(new Sentinel2)); |
- assertThrows(function() { iter.next(); }, Sentinel2); |
- assertThrownIteratorIsClosed(iter); |
- } |
- Test7(instantiate(g)); |
- |
- // That's probably enough. |
-} |
-TestNestedTry(function (g) { return g(); }); |
-TestNestedTry(function* (g) { return yield* g(); }); |
- |
-function TestRecursion() { |
- function TestNextRecursion() { |
- function* g() { yield iter.next(); } |
- var iter = g(); |
- return iter.next(); |
- } |
- function TestSendRecursion() { |
- function* g() { yield iter.next(42); } |
- var iter = g(); |
- return iter.next(); |
- } |
- function TestThrowRecursion() { |
- function* g() { yield iter.throw(1); } |
- var iter = g(); |
- return iter.next(); |
- } |
- assertThrows(TestNextRecursion, Error); |
- assertThrows(TestSendRecursion, Error); |
- assertThrows(TestThrowRecursion, Error); |
-} |
-TestRecursion(); |