@@ -4488,18 +4488,11 @@ codegen_sync_comprehension_generator(compiler *c, location loc,
44884488 switch (type ) {
44894489 case COMP_GENEXP :
44904490 if (elt -> kind == Starred_kind ){
4491- NEW_JUMP_TARGET_LABEL (c , unpack_start );
4492- NEW_JUMP_TARGET_LABEL (c , unpack_end );
44934491 VISIT (c , expr , elt -> v .Starred .value );
4494- ADDOP (c , elt_loc , GET_ITER );
4495- USE_LABEL (c , unpack_start );
4496- ADDOP_JUMP (c , elt_loc , FOR_ITER , unpack_end );
4497- ADDOP_YIELD (c , elt_loc );
4492+ ADDOP (c , elt_loc , GET_YIELD_FROM_ITER );
4493+ ADDOP_LOAD_CONST (c , elt_loc , Py_None );
4494+ ADD_YIELD_FROM (c , elt_loc , 0 );
44984495 ADDOP (c , elt_loc , POP_TOP );
4499- ADDOP_JUMP (c , NO_LOCATION , JUMP , unpack_start );
4500- USE_LABEL (c , unpack_end );
4501- ADDOP (c , NO_LOCATION , END_FOR );
4502- ADDOP (c , NO_LOCATION , POP_ITER );
45034496 }
45044497 else {
45054498 VISIT (c , expr , elt );
@@ -4628,16 +4621,19 @@ codegen_async_comprehension_generator(compiler *c, location loc,
46284621 switch (type ) {
46294622 case COMP_GENEXP :
46304623 if (elt -> kind == Starred_kind ){
4631- NEW_JUMP_TARGET_LABEL (c , unpack_start );
4632- NEW_JUMP_TARGET_LABEL (c , unpack_end );
4624+ /* async generators don't support `yield from`, so use an
4625+ explicit loop to mimic the bytecode for (z async for y in x for
4626+ z in y). */
4627+ NEW_JUMP_TARGET_LABEL (c , async_unpack_start );
4628+ NEW_JUMP_TARGET_LABEL (c , async_unpack_end );
46334629 VISIT (c , expr , elt -> v .Starred .value );
46344630 ADDOP (c , elt_loc , GET_ITER );
4635- USE_LABEL (c , unpack_start );
4636- ADDOP_JUMP (c , elt_loc , FOR_ITER , unpack_end );
4631+ USE_LABEL (c , async_unpack_start );
4632+ ADDOP_JUMP (c , elt_loc , FOR_ITER , async_unpack_end );
46374633 ADDOP_YIELD (c , elt_loc );
46384634 ADDOP (c , elt_loc , POP_TOP );
4639- ADDOP_JUMP (c , NO_LOCATION , JUMP , unpack_start );
4640- USE_LABEL (c , unpack_end );
4635+ ADDOP_JUMP (c , NO_LOCATION , JUMP , async_unpack_start );
4636+ USE_LABEL (c , async_unpack_end );
46414637 ADDOP (c , NO_LOCATION , END_FOR );
46424638 ADDOP (c , NO_LOCATION , POP_ITER );
46434639 }
0 commit comments