@@ -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 ;
@@ -1700,6 +1701,7 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1700
1701
switch (info -> fb_type ) {
1701
1702
case WHILE_LOOP :
1702
1703
case EXCEPTION_HANDLER :
1704
+ case ASYNC_COMPREHENSION_GENERATOR :
1703
1705
return 1 ;
1704
1706
1705
1707
case FOR_LOOP :
@@ -4573,6 +4575,11 @@ compiler_async_comprehension_generator(struct compiler *c,
4573
4575
}
4574
4576
4575
4577
compiler_use_next_block (c , start );
4578
+ /* Runtime will push a block here, so we need to account for that */
4579
+ if (!compiler_push_fblock (c , ASYNC_COMPREHENSION_GENERATOR , start ,
4580
+ NULL , NULL )) {
4581
+ return 0 ;
4582
+ }
4576
4583
4577
4584
ADDOP_JUMP (c , SETUP_FINALLY , except );
4578
4585
ADDOP (c , GET_ANEXT );
@@ -4627,6 +4634,8 @@ compiler_async_comprehension_generator(struct compiler *c,
4627
4634
compiler_use_next_block (c , if_cleanup );
4628
4635
ADDOP_JUMP (c , JUMP_ABSOLUTE , start );
4629
4636
4637
+ compiler_pop_fblock (c , ASYNC_COMPREHENSION_GENERATOR , start );
4638
+
4630
4639
compiler_use_next_block (c , except );
4631
4640
ADDOP (c , END_ASYNC_FOR );
4632
4641
0 commit comments