@@ -2237,23 +2237,19 @@ compiler_async_for(struct compiler *c, stmt_ty s)
22372237 ADDOP (c , DUP_TOP );
22382238 ADDOP_O (c , LOAD_GLOBAL , stop_aiter_error , names );
22392239 ADDOP_I (c , COMPARE_OP , PyCmp_EXC_MATCH );
2240- ADDOP_JABS (c , POP_JUMP_IF_FALSE , try_cleanup );
2241-
2242- ADDOP (c , POP_TOP );
2243- ADDOP (c , POP_TOP );
2244- ADDOP (c , POP_TOP );
2245- ADDOP (c , POP_EXCEPT ); /* for SETUP_EXCEPT */
2246- ADDOP (c , POP_BLOCK ); /* for SETUP_LOOP */
2247- ADDOP_JABS (c , JUMP_ABSOLUTE , after_loop_else );
2248-
2249-
2250- compiler_use_next_block (c , try_cleanup );
2240+ ADDOP_JABS (c , POP_JUMP_IF_TRUE , try_cleanup );
22512241 ADDOP (c , END_FINALLY );
22522242
22532243 compiler_use_next_block (c , after_try );
22542244 VISIT_SEQ (c , stmt , s -> v .AsyncFor .body );
22552245 ADDOP_JABS (c , JUMP_ABSOLUTE , try );
22562246
2247+ compiler_use_next_block (c , try_cleanup );
2248+ ADDOP (c , POP_TOP );
2249+ ADDOP (c , POP_TOP );
2250+ ADDOP (c , POP_TOP );
2251+ ADDOP (c , POP_EXCEPT ); /* for SETUP_EXCEPT */
2252+ ADDOP (c , POP_TOP ); /* for correct calculation of stack effect */
22572253 ADDOP (c , POP_BLOCK ); /* for SETUP_LOOP */
22582254 compiler_pop_fblock (c , LOOP , try );
22592255
@@ -3750,7 +3746,7 @@ compiler_async_comprehension_generator(struct compiler *c,
37503746 _Py_IDENTIFIER (StopAsyncIteration );
37513747
37523748 comprehension_ty gen ;
3753- basicblock * anchor , * if_cleanup , * try ,
3749+ basicblock * if_cleanup , * try ,
37543750 * after_try , * except , * try_cleanup ;
37553751 Py_ssize_t i , n ;
37563752
@@ -3761,12 +3757,11 @@ compiler_async_comprehension_generator(struct compiler *c,
37613757
37623758 try = compiler_new_block (c );
37633759 after_try = compiler_new_block (c );
3764- try_cleanup = compiler_new_block (c );
37653760 except = compiler_new_block (c );
37663761 if_cleanup = compiler_new_block (c );
3767- anchor = compiler_new_block (c );
3762+ try_cleanup = compiler_new_block (c );
37683763
3769- if (if_cleanup == NULL || anchor == NULL ||
3764+ if (if_cleanup == NULL ||
37703765 try == NULL || after_try == NULL ||
37713766 except == NULL || try_cleanup == NULL ) {
37723767 return 0 ;
@@ -3807,16 +3802,7 @@ compiler_async_comprehension_generator(struct compiler *c,
38073802 ADDOP (c , DUP_TOP );
38083803 ADDOP_O (c , LOAD_GLOBAL , stop_aiter_error , names );
38093804 ADDOP_I (c , COMPARE_OP , PyCmp_EXC_MATCH );
3810- ADDOP_JABS (c , POP_JUMP_IF_FALSE , try_cleanup );
3811-
3812- ADDOP (c , POP_TOP );
3813- ADDOP (c , POP_TOP );
3814- ADDOP (c , POP_TOP );
3815- ADDOP (c , POP_EXCEPT ); /* for SETUP_EXCEPT */
3816- ADDOP_JABS (c , JUMP_ABSOLUTE , anchor );
3817-
3818-
3819- compiler_use_next_block (c , try_cleanup );
3805+ ADDOP_JABS (c , POP_JUMP_IF_TRUE , try_cleanup );
38203806 ADDOP (c , END_FINALLY );
38213807
38223808 compiler_use_next_block (c , after_try );
@@ -3865,7 +3851,12 @@ compiler_async_comprehension_generator(struct compiler *c,
38653851 }
38663852 compiler_use_next_block (c , if_cleanup );
38673853 ADDOP_JABS (c , JUMP_ABSOLUTE , try );
3868- compiler_use_next_block (c , anchor );
3854+
3855+ compiler_use_next_block (c , try_cleanup );
3856+ ADDOP (c , POP_TOP );
3857+ ADDOP (c , POP_TOP );
3858+ ADDOP (c , POP_TOP );
3859+ ADDOP (c , POP_EXCEPT ); /* for SETUP_EXCEPT */
38693860 ADDOP (c , POP_TOP );
38703861
38713862 return 1 ;
0 commit comments