From 187f7ba01e061aa41584c20087af61fd55091ec3 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 10 Dec 2014 21:10:59 +1100 Subject: [PATCH] Remove regenerator finished generator error --- .../transformers/es6-generators/runtime.js | 11 +++++++---- test/_generator-helpers.js | 12 ++---------- .../exec.js | 12 ++---------- 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/lib/6to5/transformation/transformers/es6-generators/runtime.js b/lib/6to5/transformation/transformers/es6-generators/runtime.js index 2adc60afdd..bdfd846382 100644 --- a/lib/6to5/transformation/transformers/es6-generators/runtime.js +++ b/lib/6to5/transformation/transformers/es6-generators/runtime.js @@ -87,9 +87,7 @@ function Generator(innerFn, outerFn, self, tryList) { throw new Error("Generator is already running"); } - if (state === GenStateCompleted) { - throw new Error("Generator has already finished"); - } + var alreadyFinished = state === GenStateCompleted; while (true) { var delegate = context.delegate; @@ -162,7 +160,8 @@ function Generator(innerFn, outerFn, self, tryList) { state = GenStateExecuting; try { - var value = innerFn.call(self, context); + var value; + if (!alreadyFinished) value = innerFn.call(self, context); // If an exception is thrown from innerFn, we leave state === // GenStateExecuting and loop back for another invocation. @@ -267,6 +266,10 @@ runtime.keys = function (object) { }; }; +function isIn(key, obj) { + return typeof obj !== "string" && typeof obj !== "number" && key in obj; +} + function values(iterable) { var iterator = iterable; if (iteratorSymbol in iterable) { diff --git a/test/_generator-helpers.js b/test/_generator-helpers.js index 4d1a390058..4eef535ee0 100644 --- a/test/_generator-helpers.js +++ b/test/_generator-helpers.js @@ -20,14 +20,6 @@ exports.raise = function raise(argument) { }; exports.assertAlreadyFinished = function assertAlreadyFinished(generator) { - try { - generator.next(); - assert.ok(false, "should have thrown an exception"); - } catch (err) { - assert.ok(err instanceof Error); - assert.strictEqual( - err.message, - "Generator has already finished" - ); - } + var item = generator.next(); + assert.ok(item.done && item.value === undefined, "not finished"); }; diff --git a/test/fixtures/transformation/es6-generators/function-declaration-hoisting-should-work-even-if-the-declarations-are-out-of-order/exec.js b/test/fixtures/transformation/es6-generators/function-declaration-hoisting-should-work-even-if-the-declarations-are-out-of-order/exec.js index 202b84a0d1..1b1de7c33b 100644 --- a/test/fixtures/transformation/es6-generators/function-declaration-hoisting-should-work-even-if-the-declarations-are-out-of-order/exec.js +++ b/test/fixtures/transformation/es6-generators/function-declaration-hoisting-should-work-even-if-the-declarations-are-out-of-order/exec.js @@ -15,18 +15,10 @@ function *gen(n) { function decrement(x) { return x - 1; } - } else { - // The behavior of function declarations nested inside conditional - // blocks is notoriously underspecified, and in V8 it appears the - // halve function is still defined when we take this branch, so - // "undefine" it for consistency with regenerator semantics. - halve = void 0; } - yield typeof halve; - yield increment(increment(n)); } -genHelpers.check(gen(3), [4, 1, "function", 5]); -genHelpers.check(gen(4), [5, "undefined", 6]); +genHelpers.check(gen(3), [4, 1, 5]); +genHelpers.check(gen(4), [5, 6]);