static void _ejs_generator_start(EJSGenerator* gen) { _ejs_gc_push_generator(gen); _ejs_invoke_closure(gen->body, _ejs_undefined, 0, NULL); _ejs_gc_pop_generator(); gen->yielded_value = _ejs_create_iter_result(_ejs_undefined, _ejs_true); }
ejsval _ejs_generator_yield (ejsval generator, ejsval arg) { EJSGenerator* gen = (EJSGenerator*)EJSVAL_TO_OBJECT(generator); gen->yielded_value = _ejs_create_iter_result(arg, _ejs_false); gen->sent_value = _ejs_undefined; _ejs_gc_pop_generator(); swapcontext(&gen->generator_context, &gen->caller_context); _ejs_gc_push_generator(gen); if (gen->throwing) { gen->throwing = EJS_FALSE; _ejs_throw (gen->sent_value); } return gen->sent_value; }