From f21bcbec11eaf7bf4f2a35824b8fe54f7844e039 Mon Sep 17 00:00:00 2001 From: Vitja Makarov Date: Sun, 9 Jan 2011 12:41:08 +0300 Subject: [PATCH] Add support for return with no value inside generator --- Cython/Compiler/Nodes.py | 2 +- Cython/Compiler/ParseTreeTransforms.py | 4 ++-- tests/errors/e_generators.pyx | 9 ++------- tests/run/generators.pyx | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 55ba0212..8aedbde4 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -3019,7 +3019,7 @@ class GeneratorBodyDefNode(DefNode): # ----- Non-error return cleanup code.put_label(code.return_label) - + code.put_xdecref(Naming.retval_cname, py_object_type) code.putln('%s->%s.resume_label = -1;' % (Naming.cur_scope_cname, Naming.obj_base_cname)) code.put_finish_refcount_context() code.putln('return NULL;'); diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index 5c9e2afa..2a97619e 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -1370,8 +1370,8 @@ class MarkClosureVisitor(CythonTransform): collector.visitchildren(node) if collector.yields: - if collector.returns and not collector.has_return_value: - error(collector.returns[0].pos, "'return' inside generators not yet supported ") + #if collector.returns and not collector.has_return_value: + # error(collector.returns[0].pos, "'return' inside generators not yet supported ") gbody = Nodes.GeneratorBodyDefNode(pos=node.pos, name=node.name, diff --git a/tests/errors/e_generators.pyx b/tests/errors/e_generators.pyx index 5cee59dc..af5ca738 100644 --- a/tests/errors/e_generators.pyx +++ b/tests/errors/e_generators.pyx @@ -6,10 +6,6 @@ def bar(a): return 0 yield -def xxx(): - yield - return - yield class Foo: @@ -18,7 +14,6 @@ class Foo: _ERRORS = u""" 3:4: 'return' with argument inside generator 7:4: 'yield' outside function -11:4: 'return' inside generators not yet supported -13:0: 'yield' not supported here -16:4: 'yield' not supported here +9:0: 'yield' not supported here +12:4: 'yield' not supported here """ diff --git a/tests/run/generators.pyx b/tests/run/generators.pyx index fe2efb5f..42e61352 100644 --- a/tests/run/generators.pyx +++ b/tests/run/generators.pyx @@ -244,3 +244,18 @@ def test_decorated(*args): for i in args: yield i +def test_return(a): + """ + >>> d = dict() + >>> obj = test_return(d) + >>> next(obj) + 1 + >>> next(obj) + Traceback (most recent call last): + StopIteration + >>> d['i_was_here'] + True + """ + yield 1 + a['i_was_here'] = True + return -- 2.26.2