v8/test/mjsunit/es6/generators-states.js
wingo@igalia.com 757f400246 Leaving a generator via an exception causes it to close
R=rossberg@chromium.org
BUG=v8:3096
LOG=Y

Review URL: https://codereview.chromium.org/717123002

Cr-Commit-Position: refs/heads/master@{#25297}
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25297 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
2014-11-12 14:29:22 +00:00

68 lines
1.9 KiB
JavaScript

// Copyright 2014 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.
// Test generator states.
function Foo() {}
function Bar() {}
function assertIteratorResult(value, done, result) {
assertEquals({ value: value, done: done}, result);
}
function assertIteratorIsClosed(iter) {
assertIteratorResult(undefined, true, iter.next());
// Next and throw on a closed iterator.
assertDoesNotThrow(function() { iter.next(); });
assertThrows(function() { iter.throw(new Bar); }, Bar);
}
var iter;
function* nextGenerator() { yield iter.next(); }
function* throwGenerator() { yield iter.throw(new Bar); }
// Throw on a suspendedStart iterator.
iter = nextGenerator();
assertThrows(function() { iter.throw(new Foo) }, Foo)
assertThrows(function() { iter.throw(new Foo) }, Foo)
assertIteratorIsClosed(iter);
// The same.
iter = throwGenerator();
assertThrows(function() { iter.throw(new Foo) }, Foo)
assertThrows(function() { iter.throw(new Foo) }, Foo)
assertIteratorIsClosed(iter);
// Next on an executing iterator raises a TypeError.
iter = nextGenerator();
assertThrows(function() { iter.next() }, TypeError)
assertIteratorIsClosed(iter);
// Throw on an executing iterator raises a TypeError.
iter = throwGenerator();
assertThrows(function() { iter.next() }, TypeError)
assertIteratorIsClosed(iter);
// Next on an executing iterator doesn't change the state of the
// generator.
iter = (function* () {
try {
iter.next();
yield 1;
} catch (e) {
try {
// This next() should raise the same exception, because the first
// next() left the iter in the executing state.
iter.next();
yield 2;
} catch (e) {
yield 3;
}
}
yield 4;
})();
assertIteratorResult(3, false, iter.next());
assertIteratorResult(4, false, iter.next());
assertIteratorIsClosed(iter);