]> granicus.if.org Git - python/commitdiff
Fix for the recursion_level bug Armin Rigo reported in sf
authorMichael W. Hudson <mwh@python.net>
Wed, 2 Oct 2002 13:13:45 +0000 (13:13 +0000)
committerMichael W. Hudson <mwh@python.net>
Wed, 2 Oct 2002 13:13:45 +0000 (13:13 +0000)
patch #617312, both on the trunk and the 22-maint branch.

Also added a test case, and ported the test_trace I wrote for HEAD
to 2.2.2 (with all those horrible extra 'line' events ;-).

Lib/test/test_trace.py
Python/ceval.c

index 314801d8bd17be6f7f671f205d08bacea2663776..91112e8b2113eee9dc876e0910c40f48996de262 100644 (file)
@@ -177,8 +177,28 @@ class TraceTestCase(unittest.TestCase):
     def test_9_settrace_and_raise(self):
         self.run_test2(settrace_and_raise)
 
+class RaisingTraceFuncTestCase(unittest.TestCase):
+    def test_it(self):
+        def tr(frame, event, arg):
+            raise ValueError # just something that isn't RuntimeError
+        def f():
+            return 1
+        try:
+            for i in xrange(sys.getrecursionlimit() + 1):
+                sys.settrace(tr)
+                try:
+                    f()
+                except ValueError:
+                    pass
+                else:
+                    self.fail("exception not thrown!")
+        except RuntimeError:
+            self.fail("recursion counter not reset")
+            
+
 def test_main():
     test_support.run_unittest(TraceTestCase)
+    test_support.run_unittest(RaisingTraceFuncTestCase)
 
 if __name__ == "__main__":
     test_main()
index 362cd0bce706ee96b5ed924777ff58ffc84b0b3c..493043303e8e38d02cfdbe067437827357f7ece3 100644 (file)
@@ -636,6 +636,8 @@ eval_frame(PyFrameObject *f)
                        if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
                                       f, PyTrace_CALL, Py_None)) {
                                /* Trace function raised an error */
+                               --tstate->recursion_depth;
+                               tstate->frame = f->f_back;
                                return NULL;
                        }
                }
@@ -646,6 +648,8 @@ eval_frame(PyFrameObject *f)
                                       tstate->c_profileobj,
                                       f, PyTrace_CALL, Py_None)) {
                                /* Profile function raised an error */
+                               --tstate->recursion_depth;
+                               tstate->frame = f->f_back;
                                return NULL;
                        }
                }