Skip to content

Commit 273e7ab

Browse files
committed
Fix test_generator_gi_yieldfrom
1 parent 69cce0f commit 273e7ab

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_generators.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,4 +476,34 @@ def generator():
476476
assert type(g.send(None)) == NotImplementedError # 13
477477
assert type(g.send(None)) == NameError # 14
478478
assert g.send(None) is None # 15
479-
assert g.send(None) is None # 16
479+
assert g.send(None) is None # 16
480+
481+
482+
def test_generator_gi_yieldfrom_multiple():
483+
# the same test as in CPython test suite, but with multiple yield from
484+
def a():
485+
yield
486+
487+
def q():
488+
yield
489+
490+
def b():
491+
yield from a()
492+
yield
493+
yield from q()
494+
yield
495+
496+
gen_b = b()
497+
assert gen_b.gi_yieldfrom is None
498+
499+
gen_b.send(None)
500+
assert gen_b.gi_yieldfrom.gi_code.co_name == 'a'
501+
502+
gen_b.send(None)
503+
assert gen_b.gi_yieldfrom is None
504+
505+
gen_b.send(None)
506+
assert gen_b.gi_yieldfrom.gi_code.co_name == 'q'
507+
508+
gen_b.send(None)
509+
assert gen_b.gi_yieldfrom is None

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_generators.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,5 @@ test.test_generators.GeneratorThrowTest.test_exception_context_with_yield_from @
3434
test.test_generators.GeneratorThrowTest.test_exception_context_with_yield_from_with_context_cycle @ linux-x86_64
3535
test.test_generators.GeneratorThrowTest.test_exception_context_with_yield_inside_generator @ linux-x86_64
3636
test.test_generators.GeneratorThrowTest.test_throw_after_none_exc_type @ linux-x86_64
37+
test.test_generators.YieldFromTests.test_generator_gi_yieldfrom @ linux-x86_64
38+

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2731,10 +2731,10 @@ public void emitYieldFrom(Runnable generatorOrCoroutineProducer, BytecodeLocal r
27312731
if (!savedYieldFromGenerator) {
27322732
savedYieldFromGenerator = true;
27332733
yieldFromGenerator = b.createLocal();
2734-
b.beginStoreLocal(yieldFromGenerator);
2735-
b.emitLoadLocal(generator);
2736-
b.endStoreLocal();
27372734
}
2735+
b.beginStoreLocal(yieldFromGenerator);
2736+
b.emitLoadLocal(generator);
2737+
b.endStoreLocal();
27382738

27392739
b.beginStoreLocal(returnValue);
27402740
b.emitLoadConstant(PNone.NONE);
@@ -2786,6 +2786,9 @@ public void emitYieldFrom(Runnable generatorOrCoroutineProducer, BytecodeLocal r
27862786

27872787
// Step 4: the returnValue local is assigned when branching to "end" label
27882788
b.emitLabel(end);
2789+
b.beginStoreLocal(yieldFromGenerator);
2790+
b.emitLoadNull();
2791+
b.endStoreLocal();
27892792
b.endBlock();
27902793
}
27912794

0 commit comments

Comments
 (0)