Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r56654:97b5c7080684 Date: 2012-08-08 15:11 +0200 http://bitbucket.org/pypy/pypy/changeset/97b5c7080684/
Log: issue1223 resolved Fix GreenletExit: catch it in _greenlet_start(), i.e. where the greenlet was originally started from, rather than catching it within switch()/throw(). diff --git a/lib_pypy/greenlet.py b/lib_pypy/greenlet.py --- a/lib_pypy/greenlet.py +++ b/lib_pypy/greenlet.py @@ -77,8 +77,6 @@ try: unbound_method = getattr(_continulet, methodname) args = unbound_method(current, *args, to=target) - except GreenletExit, e: - args = (e,) finally: _tls.current = current # @@ -132,6 +130,8 @@ _tls.current = greenlet try: res = greenlet.run(*args) + except GreenletExit, e: + res = e finally: _continuation.permute(greenlet, greenlet.parent) return (res,) diff --git a/pypy/module/test_lib_pypy/test_greenlet.py b/pypy/module/test_lib_pypy/test_greenlet.py --- a/pypy/module/test_lib_pypy/test_greenlet.py +++ b/pypy/module/test_lib_pypy/test_greenlet.py @@ -134,6 +134,40 @@ res = g1.switch() assert res == "ok" + def test_throw_GreenletExit(self): + from greenlet import greenlet + gmain = greenlet.getcurrent() + l = [0] + # + def func(): + l[0] += 1 + gmain.switch() + l[0] += 1 + # + g = greenlet(func) + g.switch() + assert l[0] == 1 + g.throw() + assert l[0] == 1 + + def test_throw_GreenletExit_result(self): + from greenlet import greenlet + gmain = greenlet.getcurrent() + l = [0] + # + def func(): + l[0] += 1 + gmain.switch() + l[0] += 1 + # + g = greenlet(func) + g.switch() + assert l[0] == 1 + ge1 = greenlet.GreenletExit(1, 2, 3) + ge2 = g.throw(ge1) + assert l[0] == 1 + assert ge1 is ge2 + def test_nondefault_parent(self): from greenlet import greenlet # _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit