[pypy-commit] pypy default: Fix a corner case.
arigo
noreply at buildbot.pypy.org
Sat Sep 3 16:32:17 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r47045:c3d09f049028
Date: 2011-09-03 16:31 +0200
http://bitbucket.org/pypy/pypy/changeset/c3d09f049028/
Log: Fix a corner case.
diff --git a/lib_pypy/greenlet.py b/lib_pypy/greenlet.py
--- a/lib_pypy/greenlet.py
+++ b/lib_pypy/greenlet.py
@@ -59,7 +59,12 @@
#
while not target:
if not target.__started:
- _continulet.__init__(target, _greenlet_start, *args)
+ if unbound_method != _continulet.throw:
+ greenlet_func = _greenlet_start
+ else:
+ greenlet_func = _greenlet_throw
+ _continulet.__init__(target, greenlet_func, *args)
+ unbound_method = _continulet.switch
args = ()
target.__started = True
break
@@ -136,3 +141,11 @@
if greenlet.parent is not _tls.main:
_continuation.permute(greenlet, greenlet.parent)
return (res,)
+
+def _greenlet_throw(greenlet, exc, value, tb):
+ _tls.current = greenlet
+ try:
+ raise exc, value, tb
+ finally:
+ if greenlet.parent is not _tls.main:
+ _continuation.permute(greenlet, greenlet.parent)
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
@@ -231,3 +231,13 @@
assert res == "next step"
res = g2.switch("goes to f1 instead")
assert res == "all ok"
+
+ def test_throw_in_not_started_yet(self):
+ from greenlet import greenlet
+ #
+ def f1():
+ never_reached
+ #
+ g1 = greenlet(f1)
+ raises(ValueError, g1.throw, ValueError)
+ assert g1.dead
More information about the pypy-commit
mailing list