*/
enum fblocktype { WHILE_LOOP, FOR_LOOP, TRY_EXCEPT, FINALLY_TRY, FINALLY_END,
- WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE, EXCEPTION_HANDLER };
+ WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE, EXCEPTION_HANDLER,
+ ASYNC_COMPREHENSION_GENERATOR };
struct fblockinfo {
enum fblocktype fb_type;
switch (info->fb_type) {
case WHILE_LOOP:
case EXCEPTION_HANDLER:
+ case ASYNC_COMPREHENSION_GENERATOR:
return 1;
case FOR_LOOP:
}
compiler_use_next_block(c, start);
+ /* Runtime will push a block here, so we need to account for that */
+ if (!compiler_push_fblock(c, ASYNC_COMPREHENSION_GENERATOR, start,
+ NULL, NULL)) {
+ return 0;
+ }
ADDOP_JUMP(c, SETUP_FINALLY, except);
ADDOP(c, GET_ANEXT);
compiler_use_next_block(c, if_cleanup);
ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
+ compiler_pop_fblock(c, ASYNC_COMPREHENSION_GENERATOR, start);
+
compiler_use_next_block(c, except);
ADDOP(c, END_ASYNC_FOR);