summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_profilehooks.py
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2001-09-24 18:44:11 (GMT)
committerFred Drake <fdrake@acm.org>2001-09-24 18:44:11 (GMT)
commit2d879017b3a259e13b1e1cec5b8bc652432c1849 (patch)
treec1e8823792decd3b9a238869a1df1091ab3c08d4 /Lib/test/test_profilehooks.py
parent2205642fe0af9c00bbfa713dae1c8ba4562d2236 (diff)
downloadcpython-2d879017b3a259e13b1e1cec5b8bc652432c1849.zip
cpython-2d879017b3a259e13b1e1cec5b8bc652432c1849.tar.gz
cpython-2d879017b3a259e13b1e1cec5b8bc652432c1849.tar.bz2
Add more tests showing the relationship between exceptions raised & caught
and the information provided to the profiler. This stuff is a mess!
Diffstat (limited to 'Lib/test/test_profilehooks.py')
-rw-r--r--Lib/test/test_profilehooks.py73
1 files changed, 64 insertions, 9 deletions
diff --git a/Lib/test/test_profilehooks.py b/Lib/test/test_profilehooks.py
index 93ad552..c247728 100644
--- a/Lib/test/test_profilehooks.py
+++ b/Lib/test/test_profilehooks.py
@@ -28,10 +28,10 @@ class HookWatcher:
def get_events(self):
"""Remove calls to add_event()."""
- add_event = self.add_event.im_func.func_code
- disallowed = (add_event.co_firstlineno, add_event.co_name)
+ disallowed = [ident(self.add_event.im_func), ident(ident)]
+ self.frames = None
- return [item for item in self.events if item[2] != disallowed]
+ return [item for item in self.events if item[2] not in disallowed]
class ProfileHookTestCase(unittest.TestCase):
@@ -52,34 +52,89 @@ class ProfileHookTestCase(unittest.TestCase):
def test_exception(self):
def f(p):
- try:
- 1/0
- except:
- pass
+ try: 1/0
+ except: pass
f_ident = ident(f)
self.check_events(f, [(0, 'call', f_ident),
(0, 'exception', f_ident),
(0, 'return', f_ident),
])
+ def test_caught_nested_exception(self):
+ def f(p):
+ try: 1/0
+ except: pass
+ def g(p):
+ f(p)
+ f_ident = ident(f)
+ g_ident = ident(g)
+ self.check_events(g, [(0, 'call', g_ident),
+ (1, 'call', f_ident),
+ (1, 'exception', f_ident),
+ (1, 'return', f_ident),
+ (0, 'return', g_ident),
+ ])
+
def test_nested_exception(self):
def f(p):
1/0
def g(p):
+ try: f(p)
+ except: pass
+ f_ident = ident(f)
+ g_ident = ident(g)
+ self.check_events(g, [(0, 'call', g_ident),
+ (1, 'call', f_ident),
+ (1, 'exception', f_ident),
+ # This isn't what I expected:
+ (0, 'exception', g_ident),
+ # I expected this again:
+ # (1, 'exception', f_ident),
+ (0, 'return', g_ident),
+ ])
+
+ def test_exception_in_except_clause(self):
+ def f(p):
+ 1/0
+ def g(p):
try:
f(p)
except:
- pass
+ try: f(p)
+ except: pass
f_ident = ident(f)
g_ident = ident(g)
self.check_events(g, [(0, 'call', g_ident),
(1, 'call', f_ident),
(1, 'exception', f_ident),
- # This isn't what I expected:
+ (0, 'exception', g_ident),
+ (2, 'call', f_ident),
+ (2, 'exception', f_ident),
(0, 'exception', g_ident),
(0, 'return', g_ident),
])
+ def test_exception_propogation(self):
+ def f(p):
+ 1/0
+ def g(p):
+ try: f(p)
+ finally: p.add_event("falling through")
+ def h(p):
+ try: g(p)
+ except: pass
+ f_ident = ident(f)
+ g_ident = ident(g)
+ h_ident = ident(h)
+ self.check_events(h, [(0, 'call', h_ident),
+ (1, 'call', g_ident),
+ (2, 'call', f_ident),
+ (2, 'exception', f_ident),
+ (1, 'exception', g_ident),
+ (1, 'falling through', g_ident),
+ (0, 'exception', h_ident),
+ (0, 'return', h_ident),
+ ])
def ident(function):
if hasattr(function, "f_code"):