mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
gh-110514: Add PY_THROW to sys.setprofile
events (GH-110524)
This commit is contained in:
parent
9f8282de6b
commit
dd4bb0529e
3 changed files with 27 additions and 1 deletions
|
@ -255,6 +255,25 @@ class ProfileHookTestCase(TestCaseBase):
|
||||||
(1, 'return', g_ident),
|
(1, 'return', g_ident),
|
||||||
])
|
])
|
||||||
|
|
||||||
|
def test_unfinished_generator(self):
|
||||||
|
def f():
|
||||||
|
for i in range(2):
|
||||||
|
yield i
|
||||||
|
def g(p):
|
||||||
|
next(f())
|
||||||
|
|
||||||
|
f_ident = ident(f)
|
||||||
|
g_ident = ident(g)
|
||||||
|
self.check_events(g, [(1, 'call', g_ident),
|
||||||
|
(2, 'call', f_ident),
|
||||||
|
(2, 'return', f_ident),
|
||||||
|
# once more; the generator is being garbage collected
|
||||||
|
# and it will do a PY_THROW
|
||||||
|
(2, 'call', f_ident),
|
||||||
|
(2, 'return', f_ident),
|
||||||
|
(1, 'return', g_ident),
|
||||||
|
])
|
||||||
|
|
||||||
def test_stop_iteration(self):
|
def test_stop_iteration(self):
|
||||||
def f():
|
def f():
|
||||||
for i in range(2):
|
for i in range(2):
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Add ``PY_THROW`` to :func:`sys.setprofile` events
|
|
@ -377,6 +377,11 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
|
||||||
PY_MONITORING_EVENT_PY_START, PY_MONITORING_EVENT_PY_RESUME)) {
|
PY_MONITORING_EVENT_PY_START, PY_MONITORING_EVENT_PY_RESUME)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID,
|
||||||
|
(vectorcallfunc)sys_profile_func3, PyTrace_CALL,
|
||||||
|
PY_MONITORING_EVENT_PY_THROW, -1)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID,
|
if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID,
|
||||||
(vectorcallfunc)sys_profile_func3, PyTrace_RETURN,
|
(vectorcallfunc)sys_profile_func3, PyTrace_RETURN,
|
||||||
PY_MONITORING_EVENT_PY_RETURN, PY_MONITORING_EVENT_PY_YIELD)) {
|
PY_MONITORING_EVENT_PY_RETURN, PY_MONITORING_EVENT_PY_YIELD)) {
|
||||||
|
@ -417,7 +422,8 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
|
||||||
events =
|
events =
|
||||||
(1 << PY_MONITORING_EVENT_PY_START) | (1 << PY_MONITORING_EVENT_PY_RESUME) |
|
(1 << PY_MONITORING_EVENT_PY_START) | (1 << PY_MONITORING_EVENT_PY_RESUME) |
|
||||||
(1 << PY_MONITORING_EVENT_PY_RETURN) | (1 << PY_MONITORING_EVENT_PY_YIELD) |
|
(1 << PY_MONITORING_EVENT_PY_RETURN) | (1 << PY_MONITORING_EVENT_PY_YIELD) |
|
||||||
(1 << PY_MONITORING_EVENT_CALL) | (1 << PY_MONITORING_EVENT_PY_UNWIND);
|
(1 << PY_MONITORING_EVENT_CALL) | (1 << PY_MONITORING_EVENT_PY_UNWIND) |
|
||||||
|
(1 << PY_MONITORING_EVENT_PY_THROW);
|
||||||
}
|
}
|
||||||
return _PyMonitoring_SetEvents(PY_MONITORING_SYS_PROFILE_ID, events);
|
return _PyMonitoring_SetEvents(PY_MONITORING_SYS_PROFILE_ID, events);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue