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