251 lines
7.5 KiB
C
251 lines
7.5 KiB
C
#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
|