[pypy-commit] pypy py3k: cpython issue13188: generators now use value.__traceback__ when no traceback

pjenvey noreply at buildbot.pypy.org
Sat Feb 23 23:20:51 CET 2013


Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3k
Changeset: r61711:9d6e4fcf6f60
Date: 2013-02-23 14:19 -0800
http://bitbucket.org/pypy/pypy/changeset/9d6e4fcf6f60/

Log:	cpython issue13188: generators now use value.__traceback__ when no
	traceback was specified

diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -107,6 +107,11 @@
 
         operr = OperationError(w_type, w_val, tb)
         operr.normalize_exception(space)
+        if tb is None:
+            tb = space.getattr(operr.get_w_value(space),
+                               space.wrap('__traceback__'))
+            if not space.is_w(tb, space.w_None):
+                operr.set_traceback(tb)
         return self.send_ex(space.w_None, operr)
 
     def descr_next(self):
diff --git a/pypy/interpreter/test/test_generator.py b/pypy/interpreter/test/test_generator.py
--- a/pypy/interpreter/test/test_generator.py
+++ b/pypy/interpreter/test/test_generator.py
@@ -163,6 +163,26 @@
         raises(StopIteration, next, g)
         raises(NameError, g.throw, NameError)
 
+    def test_throw_tb(self):
+        def f():
+            try:
+                yield
+            except:
+                raise
+        g = f()
+        try:
+            1/0
+        except ZeroDivisionError as v:
+            try:
+                g.throw(v)
+            except Exception as w:
+                tb = w.__traceback__
+        levels = 0
+        while tb:
+            levels += 1
+            tb = tb.tb_next
+        assert levels == 3
+
     def test_close(self):
         def f():
             yield 1


More information about the pypy-commit mailing list