• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef Py_CPYTHON_MONITORING_H
2 #  error "this header file must not be included directly"
3 #endif
4 
5 /* Local events.
6  * These require bytecode instrumentation */
7 
8 #define PY_MONITORING_EVENT_PY_START 0
9 #define PY_MONITORING_EVENT_PY_RESUME 1
10 #define PY_MONITORING_EVENT_PY_RETURN 2
11 #define PY_MONITORING_EVENT_PY_YIELD 3
12 #define PY_MONITORING_EVENT_CALL 4
13 #define PY_MONITORING_EVENT_LINE 5
14 #define PY_MONITORING_EVENT_INSTRUCTION 6
15 #define PY_MONITORING_EVENT_JUMP 7
16 #define PY_MONITORING_EVENT_BRANCH 8
17 #define PY_MONITORING_EVENT_STOP_ITERATION 9
18 
19 #define PY_MONITORING_IS_INSTRUMENTED_EVENT(ev) \
20     ((ev) < _PY_MONITORING_LOCAL_EVENTS)
21 
22 /* Other events, mainly exceptions */
23 
24 #define PY_MONITORING_EVENT_RAISE 10
25 #define PY_MONITORING_EVENT_EXCEPTION_HANDLED 11
26 #define PY_MONITORING_EVENT_PY_UNWIND 12
27 #define PY_MONITORING_EVENT_PY_THROW 13
28 #define PY_MONITORING_EVENT_RERAISE 14
29 
30 
31 /* Ancillary events */
32 
33 #define PY_MONITORING_EVENT_C_RETURN 15
34 #define PY_MONITORING_EVENT_C_RAISE 16
35 
36 
37 typedef struct _PyMonitoringState {
38     uint8_t active;
39     uint8_t opaque;
40 } PyMonitoringState;
41 
42 
43 PyAPI_FUNC(int)
44 PyMonitoring_EnterScope(PyMonitoringState *state_array, uint64_t *version,
45                          const uint8_t *event_types, Py_ssize_t length);
46 
47 PyAPI_FUNC(int)
48 PyMonitoring_ExitScope(void);
49 
50 
51 PyAPI_FUNC(int)
52 _PyMonitoring_FirePyStartEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset);
53 
54 PyAPI_FUNC(int)
55 _PyMonitoring_FirePyResumeEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset);
56 
57 PyAPI_FUNC(int)
58 _PyMonitoring_FirePyReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
59                                 PyObject *retval);
60 
61 PyAPI_FUNC(int)
62 _PyMonitoring_FirePyYieldEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
63                                PyObject *retval);
64 
65 PyAPI_FUNC(int)
66 _PyMonitoring_FireCallEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
67                             PyObject* callable, PyObject *arg0);
68 
69 PyAPI_FUNC(int)
70 _PyMonitoring_FireLineEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
71                             int lineno);
72 
73 PyAPI_FUNC(int)
74 _PyMonitoring_FireJumpEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
75                             PyObject *target_offset);
76 
77 PyAPI_FUNC(int)
78 _PyMonitoring_FireBranchEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
79                               PyObject *target_offset);
80 
81 PyAPI_FUNC(int)
82 _PyMonitoring_FireCReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
83                                PyObject *retval);
84 
85 PyAPI_FUNC(int)
86 _PyMonitoring_FirePyThrowEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset);
87 
88 PyAPI_FUNC(int)
89 _PyMonitoring_FireRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset);
90 
91 PyAPI_FUNC(int)
92 _PyMonitoring_FireReraiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset);
93 
94 PyAPI_FUNC(int)
95 _PyMonitoring_FireExceptionHandledEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset);
96 
97 PyAPI_FUNC(int)
98 _PyMonitoring_FireCRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset);
99 
100 PyAPI_FUNC(int)
101 _PyMonitoring_FirePyUnwindEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset);
102 
103 PyAPI_FUNC(int)
104 _PyMonitoring_FireStopIterationEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value);
105 
106 
107 #define _PYMONITORING_IF_ACTIVE(STATE, X)  \
108     if ((STATE)->active) { \
109         return (X); \
110     } \
111     else { \
112         return 0; \
113     }
114 
115 static inline int
PyMonitoring_FirePyStartEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset)116 PyMonitoring_FirePyStartEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)
117 {
118     _PYMONITORING_IF_ACTIVE(
119         state,
120         _PyMonitoring_FirePyStartEvent(state, codelike, offset));
121 }
122 
123 static inline int
PyMonitoring_FirePyResumeEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset)124 PyMonitoring_FirePyResumeEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)
125 {
126     _PYMONITORING_IF_ACTIVE(
127         state,
128         _PyMonitoring_FirePyResumeEvent(state, codelike, offset));
129 }
130 
131 static inline int
PyMonitoring_FirePyReturnEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset,PyObject * retval)132 PyMonitoring_FirePyReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
133                                PyObject *retval)
134 {
135     _PYMONITORING_IF_ACTIVE(
136         state,
137         _PyMonitoring_FirePyReturnEvent(state, codelike, offset, retval));
138 }
139 
140 static inline int
PyMonitoring_FirePyYieldEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset,PyObject * retval)141 PyMonitoring_FirePyYieldEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
142                               PyObject *retval)
143 {
144     _PYMONITORING_IF_ACTIVE(
145         state,
146         _PyMonitoring_FirePyYieldEvent(state, codelike, offset, retval));
147 }
148 
149 static inline int
PyMonitoring_FireCallEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset,PyObject * callable,PyObject * arg0)150 PyMonitoring_FireCallEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
151                            PyObject* callable, PyObject *arg0)
152 {
153     _PYMONITORING_IF_ACTIVE(
154         state,
155         _PyMonitoring_FireCallEvent(state, codelike, offset, callable, arg0));
156 }
157 
158 static inline int
PyMonitoring_FireLineEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset,int lineno)159 PyMonitoring_FireLineEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
160                            int lineno)
161 {
162     _PYMONITORING_IF_ACTIVE(
163         state,
164         _PyMonitoring_FireLineEvent(state, codelike, offset, lineno));
165 }
166 
167 static inline int
PyMonitoring_FireJumpEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset,PyObject * target_offset)168 PyMonitoring_FireJumpEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
169                            PyObject *target_offset)
170 {
171     _PYMONITORING_IF_ACTIVE(
172         state,
173         _PyMonitoring_FireJumpEvent(state, codelike, offset, target_offset));
174 }
175 
176 static inline int
PyMonitoring_FireBranchEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset,PyObject * target_offset)177 PyMonitoring_FireBranchEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
178                              PyObject *target_offset)
179 {
180     _PYMONITORING_IF_ACTIVE(
181         state,
182         _PyMonitoring_FireBranchEvent(state, codelike, offset, target_offset));
183 }
184 
185 static inline int
PyMonitoring_FireCReturnEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset,PyObject * retval)186 PyMonitoring_FireCReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset,
187                               PyObject *retval)
188 {
189     _PYMONITORING_IF_ACTIVE(
190         state,
191         _PyMonitoring_FireCReturnEvent(state, codelike, offset, retval));
192 }
193 
194 static inline int
PyMonitoring_FirePyThrowEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset)195 PyMonitoring_FirePyThrowEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)
196 {
197     _PYMONITORING_IF_ACTIVE(
198         state,
199         _PyMonitoring_FirePyThrowEvent(state, codelike, offset));
200 }
201 
202 static inline int
PyMonitoring_FireRaiseEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset)203 PyMonitoring_FireRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)
204 {
205     _PYMONITORING_IF_ACTIVE(
206         state,
207         _PyMonitoring_FireRaiseEvent(state, codelike, offset));
208 }
209 
210 static inline int
PyMonitoring_FireReraiseEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset)211 PyMonitoring_FireReraiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)
212 {
213     _PYMONITORING_IF_ACTIVE(
214         state,
215         _PyMonitoring_FireReraiseEvent(state, codelike, offset));
216 }
217 
218 static inline int
PyMonitoring_FireExceptionHandledEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset)219 PyMonitoring_FireExceptionHandledEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)
220 {
221     _PYMONITORING_IF_ACTIVE(
222         state,
223         _PyMonitoring_FireExceptionHandledEvent(state, codelike, offset));
224 }
225 
226 static inline int
PyMonitoring_FireCRaiseEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset)227 PyMonitoring_FireCRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)
228 {
229     _PYMONITORING_IF_ACTIVE(
230         state,
231         _PyMonitoring_FireCRaiseEvent(state, codelike, offset));
232 }
233 
234 static inline int
PyMonitoring_FirePyUnwindEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset)235 PyMonitoring_FirePyUnwindEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)
236 {
237     _PYMONITORING_IF_ACTIVE(
238         state,
239         _PyMonitoring_FirePyUnwindEvent(state, codelike, offset));
240 }
241 
242 static inline int
PyMonitoring_FireStopIterationEvent(PyMonitoringState * state,PyObject * codelike,int32_t offset,PyObject * value)243 PyMonitoring_FireStopIterationEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value)
244 {
245     _PYMONITORING_IF_ACTIVE(
246         state,
247         _PyMonitoring_FireStopIterationEvent(state, codelike, offset, value));
248 }
249 
250 #undef _PYMONITORING_IF_ACTIVE
251