@@ -910,6 +910,7 @@ stack_effect(int opcode, int oparg, int jump)
910910 return -1 ;
911911 case SETUP_ANNOTATIONS :
912912 return 0 ;
913+ case ASYNC_GEN_WRAP :
913914 case YIELD_VALUE :
914915 return 0 ;
915916 case POP_BLOCK :
@@ -1541,6 +1542,9 @@ compiler_addop_j_noline(struct compiler *c, int opcode, basicblock *b)
15411542#define POP_EXCEPT_AND_RERAISE (C ) \
15421543 RETURN_IF_FALSE(compiler_pop_except_and_reraise((C)))
15431544
1545+ #define ADDOP_YIELD (C ) \
1546+ RETURN_IF_FALSE(addop_yield(C))
1547+
15441548#define VISIT (C , TYPE , V ) {\
15451549 if (!compiler_visit_ ## TYPE((C), (V))) \
15461550 return 0; \
@@ -1844,6 +1848,7 @@ compiler_add_yield_from(struct compiler *c, int await)
18441848 compiler_use_next_block (c , start );
18451849 ADDOP_JUMP (c , SEND , exit );
18461850 compiler_use_next_block (c , resume );
1851+ ADDOP (c , YIELD_VALUE );
18471852 ADDOP_I (c , RESUME , await ? 3 : 2 );
18481853 ADDOP_JUMP (c , JUMP_NO_INTERRUPT , start );
18491854 compiler_use_next_block (c , exit );
@@ -4094,6 +4099,17 @@ addop_binary(struct compiler *c, operator_ty binop, bool inplace)
40944099 return 1 ;
40954100}
40964101
4102+
4103+ static int
4104+ addop_yield (struct compiler * c ) {
4105+ if (c -> u -> u_ste -> ste_generator && c -> u -> u_ste -> ste_coroutine ) {
4106+ ADDOP (c , ASYNC_GEN_WRAP );
4107+ }
4108+ ADDOP (c , YIELD_VALUE );
4109+ ADDOP_I (c , RESUME , 1 );
4110+ return 1 ;
4111+ }
4112+
40974113static int
40984114compiler_nameop (struct compiler * c , identifier name , expr_context_ty ctx )
40994115{
@@ -5144,8 +5160,7 @@ compiler_sync_comprehension_generator(struct compiler *c,
51445160 switch (type ) {
51455161 case COMP_GENEXP :
51465162 VISIT (c , expr , elt );
5147- ADDOP (c , YIELD_VALUE );
5148- ADDOP_I (c , RESUME , 1 );
5163+ ADDOP_YIELD (c );
51495164 ADDOP (c , POP_TOP );
51505165 break ;
51515166 case COMP_LISTCOMP :
@@ -5243,8 +5258,7 @@ compiler_async_comprehension_generator(struct compiler *c,
52435258 switch (type ) {
52445259 case COMP_GENEXP :
52455260 VISIT (c , expr , elt );
5246- ADDOP (c , YIELD_VALUE );
5247- ADDOP_I (c , RESUME , 1 );
5261+ ADDOP_YIELD (c );
52485262 ADDOP (c , POP_TOP );
52495263 break ;
52505264 case COMP_LISTCOMP :
@@ -5714,8 +5728,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
57145728 else {
57155729 ADDOP_LOAD_CONST (c , Py_None );
57165730 }
5717- ADDOP (c , YIELD_VALUE );
5718- ADDOP_I (c , RESUME , 1 );
5731+ ADDOP_YIELD (c );
57195732 break ;
57205733 case YieldFrom_kind :
57215734 if (c -> u -> u_ste -> ste_type != FunctionBlock )
0 commit comments