diff options
author | Itamar Ostricher <itamarost@gmail.com> | 2022-12-02 17:28:27 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-02 17:28:27 (GMT) |
commit | 3c137dc613c860f605d3520d7fd722cd8ed79da6 (patch) | |
tree | 1d790ed26497a0f7c5262a4a00ca6311cf3950e9 /Include/cpython | |
parent | 0563be23a557917228a8b48cbb31bda285a3a815 (diff) | |
download | cpython-3c137dc613c860f605d3520d7fd722cd8ed79da6.zip cpython-3c137dc613c860f605d3520d7fd722cd8ed79da6.tar.gz cpython-3c137dc613c860f605d3520d7fd722cd8ed79da6.tar.bz2 |
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>
Diffstat (limited to 'Include/cpython')
-rw-r--r-- | Include/cpython/code.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/Include/cpython/code.h b/Include/cpython/code.h index fd57e00..f11d099 100644 --- a/Include/cpython/code.h +++ b/Include/cpython/code.h @@ -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; |