@@ -116,7 +116,8 @@ compiler IR.
116
116
*/
117
117
118
118
enum fblocktype { WHILE_LOOP , FOR_LOOP , TRY_EXCEPT , FINALLY_TRY , FINALLY_END ,
119
- WITH , ASYNC_WITH , HANDLER_CLEANUP , POP_VALUE , EXCEPTION_HANDLER };
119
+ WITH , ASYNC_WITH , HANDLER_CLEANUP , POP_VALUE , EXCEPTION_HANDLER ,
120
+ ASYNC_COMPREHENSION_GENERATOR };
120
121
121
122
struct fblockinfo {
122
123
enum fblocktype fb_type ;
@@ -1713,6 +1714,7 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1713
1714
switch (info -> fb_type ) {
1714
1715
case WHILE_LOOP :
1715
1716
case EXCEPTION_HANDLER :
1717
+ case ASYNC_COMPREHENSION_GENERATOR :
1716
1718
return 1 ;
1717
1719
1718
1720
case FOR_LOOP :
@@ -4580,6 +4582,11 @@ compiler_async_comprehension_generator(struct compiler *c,
4580
4582
}
4581
4583
4582
4584
compiler_use_next_block (c , start );
4585
+ /* Runtime will push a block here, so we need to account for that */
4586
+ if (!compiler_push_fblock (c , ASYNC_COMPREHENSION_GENERATOR , start ,
4587
+ NULL , NULL )) {
4588
+ return 0 ;
4589
+ }
4583
4590
4584
4591
ADDOP_JUMP (c , SETUP_FINALLY , except );
4585
4592
ADDOP (c , GET_ANEXT );
@@ -4634,6 +4641,8 @@ compiler_async_comprehension_generator(struct compiler *c,
4634
4641
compiler_use_next_block (c , if_cleanup );
4635
4642
ADDOP_JUMP (c , JUMP_ABSOLUTE , start );
4636
4643
4644
+ compiler_pop_fblock (c , ASYNC_COMPREHENSION_GENERATOR , start );
4645
+
4637
4646
compiler_use_next_block (c , except );
4638
4647
ADDOP (c , END_ASYNC_FOR );
4639
4648
0 commit comments