Skip to content

Commit a2b7a69

Browse files
committed
change unpacking semantics for genexps: no delegation
1 parent e1f3f9a commit a2b7a69

1 file changed

Lines changed: 16 additions & 12 deletions

File tree

Python/codegen.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4488,11 +4488,18 @@ 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);
44914493
VISIT(c, expr, elt->v.Starred.value);
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);
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);
44954498
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);
44964503
}
44974504
else{
44984505
VISIT(c, expr, elt);
@@ -4621,19 +4628,16 @@ codegen_async_comprehension_generator(compiler *c, location loc,
46214628
switch (type) {
46224629
case COMP_GENEXP:
46234630
if (elt->kind == Starred_kind){
4624-
/* ADD_YIELD_FROM won't work here like it does in the
4625-
synchronous case, so use an explicit loop to mimic the
4626-
bytecode for (z async for y in x for z in y). */
4627-
NEW_JUMP_TARGET_LABEL(c, async_unpack_start);
4628-
NEW_JUMP_TARGET_LABEL(c, async_unpack_end);
4631+
NEW_JUMP_TARGET_LABEL(c, unpack_start);
4632+
NEW_JUMP_TARGET_LABEL(c, unpack_end);
46294633
VISIT(c, expr, elt->v.Starred.value);
46304634
ADDOP(c, elt_loc, GET_ITER);
4631-
USE_LABEL(c, async_unpack_start);
4632-
ADDOP_JUMP(c, elt_loc, FOR_ITER, async_unpack_end);
4635+
USE_LABEL(c, unpack_start);
4636+
ADDOP_JUMP(c, elt_loc, FOR_ITER, unpack_end);
46334637
ADDOP_YIELD(c, elt_loc);
46344638
ADDOP(c, elt_loc, POP_TOP);
4635-
ADDOP_JUMP(c, NO_LOCATION, JUMP, async_unpack_start);
4636-
USE_LABEL(c, async_unpack_end);
4639+
ADDOP_JUMP(c, NO_LOCATION, JUMP, unpack_start);
4640+
USE_LABEL(c, unpack_end);
46374641
ADDOP(c, NO_LOCATION, END_FOR);
46384642
ADDOP(c, NO_LOCATION, POP_ITER);
46394643
}

0 commit comments

Comments
 (0)