-
-
Notifications
You must be signed in to change notification settings - Fork 30.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
GH-103082: Implementation of PEP 669: Low Impact Monitoring for CPyth…
…on (GH-103083) * The majority of the monitoring code is in instrumentation.c * The new instrumentation bytecodes are in bytecodes.c * legacy_tracing.c adapts the new API to the old sys.setrace and sys.setprofile APIs
- Loading branch information
1 parent
dce2d38
commit 411b169
Showing
44 changed files
with
6,021 additions
and
1,617 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
|
||
#ifndef Py_INTERNAL_INSTRUMENT_H | ||
#define Py_INTERNAL_INSTRUMENT_H | ||
|
||
|
||
#include "pycore_bitutils.h" // _Py_popcount32 | ||
#include "pycore_frame.h" | ||
|
||
#include "cpython/code.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#define PY_MONITORING_TOOL_IDS 8 | ||
|
||
/* 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_INSTRUMENTED_EVENTS 10 | ||
|
||
/* 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 | ||
|
||
|
||
/* Ancilliary events */ | ||
|
||
#define PY_MONITORING_EVENT_C_RETURN 14 | ||
#define PY_MONITORING_EVENT_C_RAISE 15 | ||
|
||
|
||
typedef uint32_t _PyMonitoringEventSet; | ||
|
||
/* Tool IDs */ | ||
|
||
/* These are defined in PEP 669 for convenience to avoid clashes */ | ||
#define PY_MONITORING_DEBUGGER_ID 0 | ||
#define PY_MONITORING_COVERAGE_ID 1 | ||
#define PY_MONITORING_PROFILER_ID 2 | ||
#define PY_MONITORING_OPTIMIZER_ID 5 | ||
|
||
/* Internal IDs used to suuport sys.setprofile() and sys.settrace() */ | ||
#define PY_MONITORING_SYS_PROFILE_ID 6 | ||
#define PY_MONITORING_SYS_TRACE_ID 7 | ||
|
||
|
||
PyObject *_PyMonitoring_RegisterCallback(int tool_id, int event_id, PyObject *obj); | ||
|
||
int _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events); | ||
|
||
extern int | ||
_Py_call_instrumentation(PyThreadState *tstate, int event, | ||
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr); | ||
|
||
extern int | ||
_Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame, | ||
_Py_CODEUNIT *instr); | ||
|
||
extern int | ||
_Py_call_instrumentation_instruction( | ||
PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr); | ||
|
||
int | ||
_Py_call_instrumentation_jump( | ||
PyThreadState *tstate, int event, | ||
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, _Py_CODEUNIT *target); | ||
|
||
extern int | ||
_Py_call_instrumentation_arg(PyThreadState *tstate, int event, | ||
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg); | ||
|
||
extern int | ||
_Py_call_instrumentation_2args(PyThreadState *tstate, int event, | ||
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1); | ||
|
||
extern void | ||
_Py_call_instrumentation_exc0(PyThreadState *tstate, int event, | ||
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr); | ||
|
||
extern void | ||
_Py_call_instrumentation_exc2(PyThreadState *tstate, int event, | ||
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1); | ||
|
||
extern int | ||
_Py_Instrumentation_GetLine(PyCodeObject *code, int index); | ||
|
||
extern PyObject _PyInstrumentation_MISSING; | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
#endif /* !Py_INTERNAL_INSTRUMENT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.