[pypy-commit] pypy default: issue1223 resolved
arigo
noreply at buildbot.pypy.org
Wed Aug 8 15:11:58 CEST 2012
Author: Armin Rigo <arigo at 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
#
More information about the pypy-commit
mailing list