]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
(backport) test and fix for buggy handling of exceptions raised by C
authorArmin Rigo <arigo@tunes.org>
Tue, 20 Sep 2005 20:53:24 +0000 (20:53 +0000)
committerArmin Rigo <arigo@tunes.org>
Tue, 20 Sep 2005 20:53:24 +0000 (20:53 +0000)
functions, causing the profiler to crash on an AssertionError if the same
Python function catches multiple exceptions from C functions.

Lib/profile.py
Lib/test/test_profile.py

index 00a0ae96eaebc0c5956582e8da6d7c61047455d9..803173bd95d12e80d772a903d4fe6838b3ccb15c 100755 (executable)
@@ -360,7 +360,7 @@ class Profile:
         "exception": trace_dispatch_exception,
         "return": trace_dispatch_return,
         "c_call": trace_dispatch_c_call,
-        "c_exception": trace_dispatch_exception,
+        "c_exception": trace_dispatch_return,  # the C function returned
         "c_return": trace_dispatch_return,
         }
 
index e0bda5ccf0b10fcc243d3d2c8f4ea696fae5b1b6..aa0f26cf2ccb995d395ad496acd48c87f5bffd8f 100644 (file)
@@ -10,7 +10,7 @@ from test.test_support import TESTFN, vereq
 # included in the profile and would appear to consume all the time.)
 ticks = 0
 
-def test_main():
+def test_1():
     global ticks
     ticks = 0
     prof = profile.Profile(timer)
@@ -95,6 +95,25 @@ def test_2():
     vereq (x, 1)
     os.unlink (TESTFN)
 
+def test_3():
+    result = []
+    def testfunc1():
+        try: len(None)
+        except: pass
+        try: len(None)
+        except: pass
+        result.append(True)
+    def testfunc2():
+        testfunc1()
+        testfunc1()
+    profile.runctx("testfunc2()", locals(), locals(), TESTFN)
+    vereq(result, [True, True])
+    os.unlink(TESTFN)
+
+def test_main():
+    test_1()
+    test_2()
+    test_3()
+
 if __name__ == "__main__":
     test_main()
-    test_2()