Commit c775ad61 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #23192: Fixed generator lambdas. Patch by Bruno Cauet.

parent cf4a2f29
...@@ -49,6 +49,26 @@ class FinalizationTest(unittest.TestCase): ...@@ -49,6 +49,26 @@ class FinalizationTest(unittest.TestCase):
self.assertTrue(finalized) self.assertTrue(finalized)
self.assertEqual(gc.garbage, old_garbage) self.assertEqual(gc.garbage, old_garbage)
def test_lambda_generator(self):
# Issue #23192: Test that a lambda returning a generator behaves
# like the equivalent function
f = lambda: (yield 1)
def g(): return (yield 1)
# test 'yield from'
f2 = lambda: (yield from g())
def g2(): return (yield from g())
f3 = lambda: (yield from f())
def g3(): return (yield from f())
for gen_fun in (f, g, f2, g2, f3, g3):
gen = gen_fun()
self.assertEqual(next(gen), 1)
with self.assertRaises(StopIteration) as cm:
gen.send(2)
self.assertEqual(cm.exception.value, 2)
class ExceptionTest(unittest.TestCase): class ExceptionTest(unittest.TestCase):
# Tests for the issue #23353: check that the currently handled exception # Tests for the issue #23353: check that the currently handled exception
......
...@@ -216,6 +216,7 @@ Pierre Carrier ...@@ -216,6 +216,7 @@ Pierre Carrier
Terry Carroll Terry Carroll
Edward Catmur Edward Catmur
Lorenzo M. Catucci Lorenzo M. Catucci
Bruno Cauet
Donn Cave Donn Cave
Charles Cazabon Charles Cazabon
Jesús Cea Avión Jesús Cea Avión
......
...@@ -10,6 +10,8 @@ Release date: tba ...@@ -10,6 +10,8 @@ Release date: tba
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #23192: Fixed generator lambdas. Patch by Bruno Cauet.
- Issue #23629: Fix the default __sizeof__ implementation for variable-sized - Issue #23629: Fix the default __sizeof__ implementation for variable-sized
objects. objects.
......
...@@ -1897,12 +1897,12 @@ compiler_lambda(struct compiler *c, expr_ty e) ...@@ -1897,12 +1897,12 @@ compiler_lambda(struct compiler *c, expr_ty e)
c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
VISIT_IN_SCOPE(c, expr, e->v.Lambda.body); VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
if (c->u->u_ste->ste_generator) { if (c->u->u_ste->ste_generator) {
ADDOP_IN_SCOPE(c, POP_TOP); co = assemble(c, 0);
} }
else { else {
ADDOP_IN_SCOPE(c, RETURN_VALUE); ADDOP_IN_SCOPE(c, RETURN_VALUE);
co = assemble(c, 1);
} }
co = assemble(c, 1);
qualname = c->u->u_qualname; qualname = c->u->u_qualname;
Py_INCREF(qualname); Py_INCREF(qualname);
compiler_exit_scope(c); compiler_exit_scope(c);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment