| #ifndef Py_CPYTHON_MONITORING_H |
| # error "this header file must not be included directly" |
| #endif |
| |
| /* Local events. |
| * These require bytecode instrumentation */ |
| |
| #define PY_MONITORING_EVENT_PY_START 0 |
| #define PY_MONITORING_EVENT_PY_RESUME 1 |
| #define PY_MONITORING_EVENT_PY_RETURN 2 |
| #define PY_MONITORING_EVENT_PY_YIELD 3 |
| #define PY_MONITORING_EVENT_CALL 4 |
| #define PY_MONITORING_EVENT_LINE 5 |
| #define PY_MONITORING_EVENT_INSTRUCTION 6 |
| #define PY_MONITORING_EVENT_JUMP 7 |
| #define PY_MONITORING_EVENT_BRANCH 8 |
| #define PY_MONITORING_EVENT_STOP_ITERATION 9 |
| |
| #define PY_MONITORING_IS_INSTRUMENTED_EVENT(ev) \ |
| ((ev) < _PY_MONITORING_LOCAL_EVENTS) |
| |
| /* Other events, mainly exceptions */ |
| |
| #define PY_MONITORING_EVENT_RAISE 10 |
| #define PY_MONITORING_EVENT_EXCEPTION_HANDLED 11 |
| #define PY_MONITORING_EVENT_PY_UNWIND 12 |
| #define PY_MONITORING_EVENT_PY_THROW 13 |
| #define PY_MONITORING_EVENT_RERAISE 14 |
| |
| |
| /* Ancillary events */ |
| |
| #define PY_MONITORING_EVENT_C_RETURN 15 |
| #define PY_MONITORING_EVENT_C_RAISE 16 |
| |
| |
| typedef struct _PyMonitoringState { |
| uint8_t active; |
| uint8_t opaque; |
| } PyMonitoringState; |
| |
| |
| PyAPI_FUNC(int) |
| PyMonitoring_EnterScope(PyMonitoringState *state_array, uint64_t *version, |
| const uint8_t *event_types, Py_ssize_t length); |
| |
| PyAPI_FUNC(int) |
| PyMonitoring_ExitScope(void); |
| |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FirePyStartEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FirePyResumeEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FirePyReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject *retval); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FirePyYieldEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject *retval); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FireCallEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject* callable, PyObject *arg0); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FireLineEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| int lineno); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FireJumpEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject *target_offset); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FireBranchEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject *target_offset); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FireCReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject *retval); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FirePyThrowEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FireRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FireReraiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FireExceptionHandledEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FireCRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FirePyUnwindEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); |
| |
| PyAPI_FUNC(int) |
| _PyMonitoring_FireStopIterationEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value); |
| |
| |
| #define _PYMONITORING_IF_ACTIVE(STATE, X) \ |
| if ((STATE)->active) { \ |
| return (X); \ |
| } \ |
| else { \ |
| return 0; \ |
| } |
| |
| static inline int |
| PyMonitoring_FirePyStartEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FirePyStartEvent(state, codelike, offset)); |
| } |
| |
| static inline int |
| PyMonitoring_FirePyResumeEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FirePyResumeEvent(state, codelike, offset)); |
| } |
| |
| static inline int |
| PyMonitoring_FirePyReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject *retval) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FirePyReturnEvent(state, codelike, offset, retval)); |
| } |
| |
| static inline int |
| PyMonitoring_FirePyYieldEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject *retval) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FirePyYieldEvent(state, codelike, offset, retval)); |
| } |
| |
| static inline int |
| PyMonitoring_FireCallEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject* callable, PyObject *arg0) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FireCallEvent(state, codelike, offset, callable, arg0)); |
| } |
| |
| static inline int |
| PyMonitoring_FireLineEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| int lineno) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FireLineEvent(state, codelike, offset, lineno)); |
| } |
| |
| static inline int |
| PyMonitoring_FireJumpEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject *target_offset) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FireJumpEvent(state, codelike, offset, target_offset)); |
| } |
| |
| static inline int |
| PyMonitoring_FireBranchEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject *target_offset) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FireBranchEvent(state, codelike, offset, target_offset)); |
| } |
| |
| static inline int |
| PyMonitoring_FireCReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, |
| PyObject *retval) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FireCReturnEvent(state, codelike, offset, retval)); |
| } |
| |
| static inline int |
| PyMonitoring_FirePyThrowEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FirePyThrowEvent(state, codelike, offset)); |
| } |
| |
| static inline int |
| PyMonitoring_FireRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FireRaiseEvent(state, codelike, offset)); |
| } |
| |
| static inline int |
| PyMonitoring_FireReraiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FireReraiseEvent(state, codelike, offset)); |
| } |
| |
| static inline int |
| PyMonitoring_FireExceptionHandledEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FireExceptionHandledEvent(state, codelike, offset)); |
| } |
| |
| static inline int |
| PyMonitoring_FireCRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FireCRaiseEvent(state, codelike, offset)); |
| } |
| |
| static inline int |
| PyMonitoring_FirePyUnwindEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FirePyUnwindEvent(state, codelike, offset)); |
| } |
| |
| static inline int |
| PyMonitoring_FireStopIterationEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value) |
| { |
| _PYMONITORING_IF_ACTIVE( |
| state, |
| _PyMonitoring_FireStopIterationEvent(state, codelike, offset, value)); |
| } |
| |
| #undef _PYMONITORING_IF_ACTIVE |