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

This commit is contained in:
Serhiy Storchaka 2015-03-11 18:20:35 +02:00
parent cf4a2f29ad
commit c775ad615a
4 changed files with 25 additions and 2 deletions

View file

@ -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

View file

@ -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

View file

@ -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.

View file

@ -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);