GeneratorPrototype.js [plain text]
@globalPrivate
function generatorResume(generator, state, generatorThis, sentValue, value, resumeMode)
{
"use strict";
var done = state === @GeneratorStateCompleted;
if (!done) {
try {
generator.@generatorState = @GeneratorStateExecuting;
value = generator.@generatorNext.@call(generatorThis, generator, state, sentValue, resumeMode, generator.@generatorFrame);
if (generator.@generatorState === @GeneratorStateExecuting) {
generator.@generatorState = @GeneratorStateCompleted;
done = true;
}
} catch (error) {
generator.@generatorState = @GeneratorStateCompleted;
throw error;
}
}
return { done, value };
}
function next(value)
{
"use strict";
var state = this.@generatorState;
if (typeof state !== "number")
@throwTypeError("|this| should be a generator");
if (state === @GeneratorStateExecuting)
@throwTypeError("Generator is executing");
return @generatorResume(this, state, this.@generatorThis, value, @undefined, @GeneratorResumeModeNormal);
}
function return(value)
{
"use strict";
var state = this.@generatorState;
if (typeof state !== "number")
@throwTypeError("|this| should be a generator");
if (state === @GeneratorStateExecuting)
@throwTypeError("Generator is executing");
return @generatorResume(this, state, this.@generatorThis, value, value, @GeneratorResumeModeReturn);
}
function throw(exception)
{
"use strict";
var state = this.@generatorState;
if (typeof state !== "number")
@throwTypeError("|this| should be a generator");
if (state === @GeneratorStateExecuting)
@throwTypeError("Generator is executing");
if (state === @GeneratorStateCompleted)
throw exception;
return @generatorResume(this, state, this.@generatorThis, exception, @undefined, @GeneratorResumeModeThrow);
}