[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