mirror of
https://github.com/python/cpython.git
synced 2025-10-26 16:27:06 +00:00
GH-91054: Add code object watchers API (GH-99859)
* Add API to allow extensions to set callback function on creation and destruction of PyCodeObject Co-authored-by: Ye11ow-Flash <janshah@cs.stonybrook.edu>
This commit is contained in:
parent
0563be23a5
commit
3c137dc613
11 changed files with 364 additions and 0 deletions
|
|
@ -181,6 +181,41 @@ PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int);
|
|||
|
||||
PyAPI_FUNC(int) PyCode_Addr2Location(PyCodeObject *, int, int *, int *, int *, int *);
|
||||
|
||||
typedef enum PyCodeEvent {
|
||||
PY_CODE_EVENT_CREATE,
|
||||
PY_CODE_EVENT_DESTROY
|
||||
} PyCodeEvent;
|
||||
|
||||
|
||||
/*
|
||||
* A callback that is invoked for different events in a code object's lifecycle.
|
||||
*
|
||||
* The callback is invoked with a borrowed reference to co, after it is
|
||||
* created and before it is destroyed.
|
||||
*
|
||||
* If the callback returns with an exception set, it must return -1. Otherwise
|
||||
* it should return 0.
|
||||
*/
|
||||
typedef int (*PyCode_WatchCallback)(
|
||||
PyCodeEvent event,
|
||||
PyCodeObject* co);
|
||||
|
||||
/*
|
||||
* Register a per-interpreter callback that will be invoked for code object
|
||||
* lifecycle events.
|
||||
*
|
||||
* Returns a handle that may be passed to PyCode_ClearWatcher on success,
|
||||
* or -1 and sets an error if no more handles are available.
|
||||
*/
|
||||
PyAPI_FUNC(int) PyCode_AddWatcher(PyCode_WatchCallback callback);
|
||||
|
||||
/*
|
||||
* Clear the watcher associated with the watcher_id handle.
|
||||
*
|
||||
* Returns 0 on success or -1 if no watcher exists for the provided id.
|
||||
*/
|
||||
PyAPI_FUNC(int) PyCode_ClearWatcher(int watcher_id);
|
||||
|
||||
/* for internal use only */
|
||||
struct _opaque {
|
||||
int computed_line;
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CODE_MAX_WATCHERS 8
|
||||
|
||||
/* PEP 659
|
||||
* Specialization and quickening structs and helper functions
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -191,6 +191,9 @@ struct _is {
|
|||
|
||||
PyObject *audit_hooks;
|
||||
PyType_WatchCallback type_watchers[TYPE_MAX_WATCHERS];
|
||||
PyCode_WatchCallback code_watchers[CODE_MAX_WATCHERS];
|
||||
// One bit is set for each non-NULL entry in code_watchers
|
||||
uint8_t active_code_watchers;
|
||||
|
||||
struct _Py_unicode_state unicode;
|
||||
struct _Py_float_state float_state;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue