Skip to content

Commit

Permalink
GH-106152: Add PY_THROW event to cProfile (GH-106161)
Browse files Browse the repository at this point in the history
  • Loading branch information
gaogaotiantian committed Jun 29, 2023
1 parent 7b2d94d commit cea9d4e
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 0 deletions.
20 changes: 20 additions & 0 deletions Lib/test/test_cprofile.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,26 @@ def test_second_profiler(self):
self.assertRaises(ValueError, pr2.enable)
pr.disable()

def test_throw(self):
"""
gh-106152
generator.throw() should trigger a call in cProfile
In the any() call below, there should be two entries for the generator:
* one for the call to __next__ which gets a True and terminates any
* one when the generator is garbage collected which will effectively
do a throw.
"""
pr = self.profilerclass()
pr.enable()
any(a == 1 for a in (1, 2))
pr.disable()
pr.create_stats()

for func, (cc, nc, _, _, _) in pr.stats.items():
if func[2] == "<genexpr>":
self.assertEqual(cc, 2)
self.assertEqual(nc, 2)


class TestCommandLine(unittest.TestCase):
def test_sort(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added PY_THROW event hook for :mod:`cProfile` for generators
1 change: 1 addition & 0 deletions Modules/_lsprof.c
Original file line number Diff line number Diff line change
Expand Up @@ -678,6 +678,7 @@ static const struct {
} callback_table[] = {
{PY_MONITORING_EVENT_PY_START, "_pystart_callback"},
{PY_MONITORING_EVENT_PY_RESUME, "_pystart_callback"},
{PY_MONITORING_EVENT_PY_THROW, "_pystart_callback"},
{PY_MONITORING_EVENT_PY_RETURN, "_pyreturn_callback"},
{PY_MONITORING_EVENT_PY_YIELD, "_pyreturn_callback"},
{PY_MONITORING_EVENT_PY_UNWIND, "_pyreturn_callback"},
Expand Down

0 comments on commit cea9d4e

Please sign in to comment.