Skip to content

Commit e62ba07

Browse files
committed
YieldNode fix: set active after executing the expression (fixes nested yields)
1 parent d6a19b5 commit e62ba07

File tree

2 files changed

+29
-21
lines changed

2 files changed

+29
-21
lines changed

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

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -235,26 +235,33 @@ def f():
235235
next(g)
236236

237237

238-
# def test_return_tuple(self):
239-
# def g():
240-
# return (yield 1)
241-
242-
# gen = g()
243-
# self.assertEqual(next(gen), 1)
244-
# with self.assertRaises(StopIteration) as cm:
245-
# gen.send((2,))
246-
# self.assertEqual(cm.exception.value, (2,))
247-
248-
# def test_return_stopiteration(self):
249-
# def g():
250-
# return (yield 1)
251-
252-
# gen = g()
253-
# self.assertEqual(next(gen), 1)
254-
# with self.assertRaises(StopIteration) as cm:
255-
# gen.send(StopIteration(2))
256-
# self.assertTrue(isinstance(cm.exception.value, StopIteration))
257-
# self.assertEqual(cm.exception.value.value, 2)
238+
def test_return_tuple(self):
239+
def g():
240+
return (yield 1)
241+
242+
gen = g()
243+
self.assertEqual(next(gen), 1)
244+
with self.assertRaises(StopIteration) as cm:
245+
gen.send((2,))
246+
self.assertEqual(cm.exception.value, (2,))
247+
248+
def test_return_stopiteration(self):
249+
def g():
250+
return (yield 1)
251+
252+
gen = g()
253+
self.assertEqual(next(gen), 1)
254+
with self.assertRaises(StopIteration) as cm:
255+
gen.send(StopIteration(2))
256+
self.assertTrue(isinstance(cm.exception.value, StopIteration))
257+
self.assertEqual(cm.exception.value.value, 2)
258+
259+
def test_yield_expr_value_without_send(self):
260+
def fn():
261+
yield (1,(yield 42))
262+
g = fn()
263+
self.assertEqual(next(g), 42)
264+
self.assertEqual(next(g), (1,None))
258265

259266
def test_generator_caller_frame(self):
260267
def gen():

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/generator/YieldNode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,10 @@ public Object execute(VirtualFrame frame) {
6868
return specialArgument;
6969
}
7070
} else {
71+
Object result = right.execute(frame);
7172
access.setActive(frame, flagSlot, true);
7273
access.setLastYieldIndex(frame, yieldIndex);
73-
throw new YieldException(right.execute(frame));
74+
throw new YieldException(result);
7475
}
7576
}
7677
}

0 commit comments

Comments
 (0)