mirror of
https://github.com/python/cpython.git
synced 2025-11-02 19:12:55 +00:00
GH-103082: Implementation of PEP 669: Low Impact Monitoring for CPython (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
This commit is contained in:
parent
dce2d38cb0
commit
411b169281
44 changed files with 6029 additions and 1625 deletions
|
|
@ -441,32 +441,6 @@ adaptive_counter_backoff(uint16_t counter) {
|
|||
|
||||
/* Line array cache for tracing */
|
||||
|
||||
extern int _PyCode_CreateLineArray(PyCodeObject *co);
|
||||
|
||||
static inline int
|
||||
_PyCode_InitLineArray(PyCodeObject *co)
|
||||
{
|
||||
if (co->_co_linearray) {
|
||||
return 0;
|
||||
}
|
||||
return _PyCode_CreateLineArray(co);
|
||||
}
|
||||
|
||||
static inline int
|
||||
_PyCode_LineNumberFromArray(PyCodeObject *co, int index)
|
||||
{
|
||||
assert(co->_co_linearray != NULL);
|
||||
assert(index >= 0);
|
||||
assert(index < Py_SIZE(co));
|
||||
if (co->_co_linearray_entry_size == 2) {
|
||||
return ((int16_t *)co->_co_linearray)[index];
|
||||
}
|
||||
else {
|
||||
assert(co->_co_linearray_entry_size == 4);
|
||||
return ((int32_t *)co->_co_linearray)[index];
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct _PyShimCodeDef {
|
||||
const uint8_t *code;
|
||||
int codelen;
|
||||
|
|
@ -500,6 +474,10 @@ extern uint32_t _Py_next_func_version;
|
|||
|
||||
#define COMPARISON_NOT_EQUALS (COMPARISON_UNORDERED | COMPARISON_LESS_THAN | COMPARISON_GREATER_THAN)
|
||||
|
||||
extern int _Py_Instrument(PyCodeObject *co, PyInterpreterState *interp);
|
||||
|
||||
extern int _Py_GetBaseOpcode(PyCodeObject *code, int offset);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ struct _frame {
|
|||
struct _PyInterpreterFrame *f_frame; /* points to the frame data */
|
||||
PyObject *f_trace; /* Trace function */
|
||||
int f_lineno; /* Current line number. Only valid if non-zero */
|
||||
int f_last_traced_line; /* The last line traced for this frame */
|
||||
char f_trace_lines; /* Emit per-line trace events? */
|
||||
char f_trace_opcodes; /* Emit per-opcode trace events? */
|
||||
char f_fast_as_locals; /* Have the fast locals of this frame been converted to a dict? */
|
||||
|
|
@ -137,10 +138,16 @@ _PyFrame_GetLocalsArray(_PyInterpreterFrame *frame)
|
|||
return frame->localsplus;
|
||||
}
|
||||
|
||||
/* Fetches the stack pointer, and sets stacktop to -1.
|
||||
Having stacktop <= 0 ensures that invalid
|
||||
values are not visible to the cycle GC.
|
||||
We choose -1 rather than 0 to assist debugging. */
|
||||
static inline PyObject**
|
||||
_PyFrame_GetStackPointer(_PyInterpreterFrame *frame)
|
||||
{
|
||||
return frame->localsplus+frame->stacktop;
|
||||
PyObject **sp = frame->localsplus + frame->stacktop;
|
||||
frame->stacktop = -1;
|
||||
return sp;
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
|
|||
107
Include/internal/pycore_instruments.h
Normal file
107
Include/internal/pycore_instruments.h
Normal file
|
|
@ -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 */
|
||||
|
|
@ -24,6 +24,7 @@ extern "C" {
|
|||
#include "pycore_genobject.h" // struct _Py_async_gen_state
|
||||
#include "pycore_gc.h" // struct _gc_runtime_state
|
||||
#include "pycore_import.h" // struct _import_state
|
||||
#include "pycore_instruments.h" // PY_MONITORING_EVENTS
|
||||
#include "pycore_list.h" // struct _Py_list_state
|
||||
#include "pycore_global_objects.h" // struct _Py_interp_static_objects
|
||||
#include "pycore_object_state.h" // struct _py_object_state
|
||||
|
|
@ -37,7 +38,6 @@ struct _Py_long_state {
|
|||
int max_str_digits;
|
||||
};
|
||||
|
||||
|
||||
/* interpreter state */
|
||||
|
||||
/* PyInterpreterState holds the global state for one of the runtime's
|
||||
|
|
@ -49,6 +49,9 @@ struct _is {
|
|||
|
||||
PyInterpreterState *next;
|
||||
|
||||
uint64_t monitoring_version;
|
||||
uint64_t last_restart_version;
|
||||
|
||||
struct pythreads {
|
||||
uint64_t next_unique_id;
|
||||
/* The linked list of threads, newest first. */
|
||||
|
|
@ -148,6 +151,15 @@ struct _is {
|
|||
struct callable_cache callable_cache;
|
||||
PyCodeObject *interpreter_trampoline;
|
||||
|
||||
_Py_Monitors monitors;
|
||||
bool f_opcode_trace_set;
|
||||
bool sys_profile_initialized;
|
||||
bool sys_trace_initialized;
|
||||
Py_ssize_t sys_profiling_threads; /* Count of threads with c_profilefunc set */
|
||||
Py_ssize_t sys_tracing_threads; /* Count of threads with c_tracefunc set */
|
||||
PyObject *monitoring_callables[PY_MONITORING_TOOL_IDS][PY_MONITORING_EVENTS];
|
||||
PyObject *monitoring_tool_names[PY_MONITORING_TOOL_IDS];
|
||||
|
||||
struct _Py_interp_cached_objects cached_objects;
|
||||
struct _Py_interp_static_objects static_objects;
|
||||
|
||||
|
|
|
|||
135
Include/internal/pycore_opcode.h
generated
135
Include/internal/pycore_opcode.h
generated
|
|
@ -112,6 +112,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
|
|||
[DICT_UPDATE] = DICT_UPDATE,
|
||||
[END_ASYNC_FOR] = END_ASYNC_FOR,
|
||||
[END_FOR] = END_FOR,
|
||||
[END_SEND] = END_SEND,
|
||||
[EXTENDED_ARG] = EXTENDED_ARG,
|
||||
[FORMAT_VALUE] = FORMAT_VALUE,
|
||||
[FOR_ITER] = FOR_ITER,
|
||||
|
|
@ -127,6 +128,23 @@ const uint8_t _PyOpcode_Deopt[256] = {
|
|||
[GET_YIELD_FROM_ITER] = GET_YIELD_FROM_ITER,
|
||||
[IMPORT_FROM] = IMPORT_FROM,
|
||||
[IMPORT_NAME] = IMPORT_NAME,
|
||||
[INSTRUMENTED_CALL] = INSTRUMENTED_CALL,
|
||||
[INSTRUMENTED_CALL_FUNCTION_EX] = INSTRUMENTED_CALL_FUNCTION_EX,
|
||||
[INSTRUMENTED_END_FOR] = INSTRUMENTED_END_FOR,
|
||||
[INSTRUMENTED_END_SEND] = INSTRUMENTED_END_SEND,
|
||||
[INSTRUMENTED_FOR_ITER] = INSTRUMENTED_FOR_ITER,
|
||||
[INSTRUMENTED_INSTRUCTION] = INSTRUMENTED_INSTRUCTION,
|
||||
[INSTRUMENTED_JUMP_BACKWARD] = INSTRUMENTED_JUMP_BACKWARD,
|
||||
[INSTRUMENTED_JUMP_FORWARD] = INSTRUMENTED_JUMP_FORWARD,
|
||||
[INSTRUMENTED_LINE] = INSTRUMENTED_LINE,
|
||||
[INSTRUMENTED_POP_JUMP_IF_FALSE] = INSTRUMENTED_POP_JUMP_IF_FALSE,
|
||||
[INSTRUMENTED_POP_JUMP_IF_NONE] = INSTRUMENTED_POP_JUMP_IF_NONE,
|
||||
[INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = INSTRUMENTED_POP_JUMP_IF_NOT_NONE,
|
||||
[INSTRUMENTED_POP_JUMP_IF_TRUE] = INSTRUMENTED_POP_JUMP_IF_TRUE,
|
||||
[INSTRUMENTED_RESUME] = INSTRUMENTED_RESUME,
|
||||
[INSTRUMENTED_RETURN_CONST] = INSTRUMENTED_RETURN_CONST,
|
||||
[INSTRUMENTED_RETURN_VALUE] = INSTRUMENTED_RETURN_VALUE,
|
||||
[INSTRUMENTED_YIELD_VALUE] = INSTRUMENTED_YIELD_VALUE,
|
||||
[INTERPRETER_EXIT] = INTERPRETER_EXIT,
|
||||
[IS_OP] = IS_OP,
|
||||
[JUMP_BACKWARD] = JUMP_BACKWARD,
|
||||
|
|
@ -179,6 +197,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
|
|||
[PUSH_NULL] = PUSH_NULL,
|
||||
[RAISE_VARARGS] = RAISE_VARARGS,
|
||||
[RERAISE] = RERAISE,
|
||||
[RESERVED] = RESERVED,
|
||||
[RESUME] = RESUME,
|
||||
[RETURN_CONST] = RETURN_CONST,
|
||||
[RETURN_GENERATOR] = RETURN_GENERATOR,
|
||||
|
|
@ -223,17 +242,19 @@ static const char *const _PyOpcode_OpName[263] = {
|
|||
[PUSH_NULL] = "PUSH_NULL",
|
||||
[INTERPRETER_EXIT] = "INTERPRETER_EXIT",
|
||||
[END_FOR] = "END_FOR",
|
||||
[END_SEND] = "END_SEND",
|
||||
[BINARY_OP_ADD_FLOAT] = "BINARY_OP_ADD_FLOAT",
|
||||
[BINARY_OP_ADD_INT] = "BINARY_OP_ADD_INT",
|
||||
[BINARY_OP_ADD_UNICODE] = "BINARY_OP_ADD_UNICODE",
|
||||
[BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE",
|
||||
[NOP] = "NOP",
|
||||
[BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT",
|
||||
[BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE",
|
||||
[UNARY_NEGATIVE] = "UNARY_NEGATIVE",
|
||||
[UNARY_NOT] = "UNARY_NOT",
|
||||
[BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT",
|
||||
[BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT",
|
||||
[BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT",
|
||||
[UNARY_INVERT] = "UNARY_INVERT",
|
||||
[BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT",
|
||||
[RESERVED] = "RESERVED",
|
||||
[BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT",
|
||||
[BINARY_SUBSCR_DICT] = "BINARY_SUBSCR_DICT",
|
||||
[BINARY_SUBSCR_GETITEM] = "BINARY_SUBSCR_GETITEM",
|
||||
|
|
@ -241,21 +262,21 @@ static const char *const _PyOpcode_OpName[263] = {
|
|||
[BINARY_SUBSCR_TUPLE_INT] = "BINARY_SUBSCR_TUPLE_INT",
|
||||
[CALL_PY_EXACT_ARGS] = "CALL_PY_EXACT_ARGS",
|
||||
[CALL_PY_WITH_DEFAULTS] = "CALL_PY_WITH_DEFAULTS",
|
||||
[CALL_BOUND_METHOD_EXACT_ARGS] = "CALL_BOUND_METHOD_EXACT_ARGS",
|
||||
[CALL_BUILTIN_CLASS] = "CALL_BUILTIN_CLASS",
|
||||
[BINARY_SUBSCR] = "BINARY_SUBSCR",
|
||||
[BINARY_SLICE] = "BINARY_SLICE",
|
||||
[STORE_SLICE] = "STORE_SLICE",
|
||||
[CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS",
|
||||
[CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS",
|
||||
[CALL_BOUND_METHOD_EXACT_ARGS] = "CALL_BOUND_METHOD_EXACT_ARGS",
|
||||
[CALL_BUILTIN_CLASS] = "CALL_BUILTIN_CLASS",
|
||||
[GET_LEN] = "GET_LEN",
|
||||
[MATCH_MAPPING] = "MATCH_MAPPING",
|
||||
[MATCH_SEQUENCE] = "MATCH_SEQUENCE",
|
||||
[MATCH_KEYS] = "MATCH_KEYS",
|
||||
[CALL_NO_KW_BUILTIN_FAST] = "CALL_NO_KW_BUILTIN_FAST",
|
||||
[CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS",
|
||||
[PUSH_EXC_INFO] = "PUSH_EXC_INFO",
|
||||
[CHECK_EXC_MATCH] = "CHECK_EXC_MATCH",
|
||||
[CHECK_EG_MATCH] = "CHECK_EG_MATCH",
|
||||
[CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS",
|
||||
[CALL_NO_KW_BUILTIN_FAST] = "CALL_NO_KW_BUILTIN_FAST",
|
||||
[CALL_NO_KW_BUILTIN_O] = "CALL_NO_KW_BUILTIN_O",
|
||||
[CALL_NO_KW_ISINSTANCE] = "CALL_NO_KW_ISINSTANCE",
|
||||
[CALL_NO_KW_LEN] = "CALL_NO_KW_LEN",
|
||||
|
|
@ -265,8 +286,6 @@ static const char *const _PyOpcode_OpName[263] = {
|
|||
[CALL_NO_KW_METHOD_DESCRIPTOR_O] = "CALL_NO_KW_METHOD_DESCRIPTOR_O",
|
||||
[CALL_NO_KW_STR_1] = "CALL_NO_KW_STR_1",
|
||||
[CALL_NO_KW_TUPLE_1] = "CALL_NO_KW_TUPLE_1",
|
||||
[CALL_NO_KW_TYPE_1] = "CALL_NO_KW_TYPE_1",
|
||||
[COMPARE_OP_FLOAT] = "COMPARE_OP_FLOAT",
|
||||
[WITH_EXCEPT_START] = "WITH_EXCEPT_START",
|
||||
[GET_AITER] = "GET_AITER",
|
||||
[GET_ANEXT] = "GET_ANEXT",
|
||||
|
|
@ -274,39 +293,39 @@ static const char *const _PyOpcode_OpName[263] = {
|
|||
[BEFORE_WITH] = "BEFORE_WITH",
|
||||
[END_ASYNC_FOR] = "END_ASYNC_FOR",
|
||||
[CLEANUP_THROW] = "CLEANUP_THROW",
|
||||
[CALL_NO_KW_TYPE_1] = "CALL_NO_KW_TYPE_1",
|
||||
[COMPARE_OP_FLOAT] = "COMPARE_OP_FLOAT",
|
||||
[COMPARE_OP_INT] = "COMPARE_OP_INT",
|
||||
[COMPARE_OP_STR] = "COMPARE_OP_STR",
|
||||
[FOR_ITER_LIST] = "FOR_ITER_LIST",
|
||||
[FOR_ITER_TUPLE] = "FOR_ITER_TUPLE",
|
||||
[STORE_SUBSCR] = "STORE_SUBSCR",
|
||||
[DELETE_SUBSCR] = "DELETE_SUBSCR",
|
||||
[FOR_ITER_LIST] = "FOR_ITER_LIST",
|
||||
[FOR_ITER_TUPLE] = "FOR_ITER_TUPLE",
|
||||
[FOR_ITER_RANGE] = "FOR_ITER_RANGE",
|
||||
[FOR_ITER_GEN] = "FOR_ITER_GEN",
|
||||
[LOAD_ATTR_CLASS] = "LOAD_ATTR_CLASS",
|
||||
[LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN",
|
||||
[LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE",
|
||||
[LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE",
|
||||
[GET_ITER] = "GET_ITER",
|
||||
[GET_YIELD_FROM_ITER] = "GET_YIELD_FROM_ITER",
|
||||
[LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY",
|
||||
[LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE",
|
||||
[LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS",
|
||||
[LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT",
|
||||
[LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT",
|
||||
[LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE",
|
||||
[LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY",
|
||||
[LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR",
|
||||
[RETURN_GENERATOR] = "RETURN_GENERATOR",
|
||||
[LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT",
|
||||
[LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT",
|
||||
[LOAD_ATTR_METHOD_LAZY_DICT] = "LOAD_ATTR_METHOD_LAZY_DICT",
|
||||
[LOAD_ATTR_METHOD_NO_DICT] = "LOAD_ATTR_METHOD_NO_DICT",
|
||||
[LOAD_ATTR_METHOD_WITH_VALUES] = "LOAD_ATTR_METHOD_WITH_VALUES",
|
||||
[LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST",
|
||||
[LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST",
|
||||
[LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST",
|
||||
[LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN",
|
||||
[RETURN_VALUE] = "RETURN_VALUE",
|
||||
[LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE",
|
||||
[LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST",
|
||||
[SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS",
|
||||
[LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN",
|
||||
[LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE",
|
||||
[STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE",
|
||||
[STORE_ATTR_SLOT] = "STORE_ATTR_SLOT",
|
||||
[STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT",
|
||||
[POP_EXCEPT] = "POP_EXCEPT",
|
||||
[STORE_NAME] = "STORE_NAME",
|
||||
[DELETE_NAME] = "DELETE_NAME",
|
||||
|
|
@ -329,9 +348,9 @@ static const char *const _PyOpcode_OpName[263] = {
|
|||
[IMPORT_NAME] = "IMPORT_NAME",
|
||||
[IMPORT_FROM] = "IMPORT_FROM",
|
||||
[JUMP_FORWARD] = "JUMP_FORWARD",
|
||||
[STORE_ATTR_SLOT] = "STORE_ATTR_SLOT",
|
||||
[STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT",
|
||||
[STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST",
|
||||
[STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST",
|
||||
[STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT",
|
||||
[POP_JUMP_IF_FALSE] = "POP_JUMP_IF_FALSE",
|
||||
[POP_JUMP_IF_TRUE] = "POP_JUMP_IF_TRUE",
|
||||
[LOAD_GLOBAL] = "LOAD_GLOBAL",
|
||||
|
|
@ -359,9 +378,9 @@ static const char *const _PyOpcode_OpName[263] = {
|
|||
[STORE_DEREF] = "STORE_DEREF",
|
||||
[DELETE_DEREF] = "DELETE_DEREF",
|
||||
[JUMP_BACKWARD] = "JUMP_BACKWARD",
|
||||
[STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT",
|
||||
[STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST",
|
||||
[CALL_FUNCTION_EX] = "CALL_FUNCTION_EX",
|
||||
[UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST",
|
||||
[STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT",
|
||||
[EXTENDED_ARG] = "EXTENDED_ARG",
|
||||
[LIST_APPEND] = "LIST_APPEND",
|
||||
[SET_ADD] = "SET_ADD",
|
||||
|
|
@ -371,14 +390,14 @@ static const char *const _PyOpcode_OpName[263] = {
|
|||
[YIELD_VALUE] = "YIELD_VALUE",
|
||||
[RESUME] = "RESUME",
|
||||
[MATCH_CLASS] = "MATCH_CLASS",
|
||||
[UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE",
|
||||
[UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE",
|
||||
[STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT",
|
||||
[UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST",
|
||||
[FORMAT_VALUE] = "FORMAT_VALUE",
|
||||
[BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP",
|
||||
[BUILD_STRING] = "BUILD_STRING",
|
||||
[UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE",
|
||||
[UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE",
|
||||
[SEND_GEN] = "SEND_GEN",
|
||||
[159] = "<159>",
|
||||
[160] = "<160>",
|
||||
[161] = "<161>",
|
||||
[LIST_EXTEND] = "LIST_EXTEND",
|
||||
[SET_UPDATE] = "SET_UPDATE",
|
||||
|
|
@ -456,24 +475,24 @@ static const char *const _PyOpcode_OpName[263] = {
|
|||
[235] = "<235>",
|
||||
[236] = "<236>",
|
||||
[237] = "<237>",
|
||||
[238] = "<238>",
|
||||
[239] = "<239>",
|
||||
[240] = "<240>",
|
||||
[241] = "<241>",
|
||||
[242] = "<242>",
|
||||
[243] = "<243>",
|
||||
[244] = "<244>",
|
||||
[245] = "<245>",
|
||||
[246] = "<246>",
|
||||
[247] = "<247>",
|
||||
[248] = "<248>",
|
||||
[249] = "<249>",
|
||||
[250] = "<250>",
|
||||
[251] = "<251>",
|
||||
[252] = "<252>",
|
||||
[253] = "<253>",
|
||||
[254] = "<254>",
|
||||
[DO_TRACING] = "DO_TRACING",
|
||||
[INSTRUMENTED_POP_JUMP_IF_NONE] = "INSTRUMENTED_POP_JUMP_IF_NONE",
|
||||
[INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = "INSTRUMENTED_POP_JUMP_IF_NOT_NONE",
|
||||
[INSTRUMENTED_RESUME] = "INSTRUMENTED_RESUME",
|
||||
[INSTRUMENTED_CALL] = "INSTRUMENTED_CALL",
|
||||
[INSTRUMENTED_RETURN_VALUE] = "INSTRUMENTED_RETURN_VALUE",
|
||||
[INSTRUMENTED_YIELD_VALUE] = "INSTRUMENTED_YIELD_VALUE",
|
||||
[INSTRUMENTED_CALL_FUNCTION_EX] = "INSTRUMENTED_CALL_FUNCTION_EX",
|
||||
[INSTRUMENTED_JUMP_FORWARD] = "INSTRUMENTED_JUMP_FORWARD",
|
||||
[INSTRUMENTED_JUMP_BACKWARD] = "INSTRUMENTED_JUMP_BACKWARD",
|
||||
[INSTRUMENTED_RETURN_CONST] = "INSTRUMENTED_RETURN_CONST",
|
||||
[INSTRUMENTED_FOR_ITER] = "INSTRUMENTED_FOR_ITER",
|
||||
[INSTRUMENTED_POP_JUMP_IF_FALSE] = "INSTRUMENTED_POP_JUMP_IF_FALSE",
|
||||
[INSTRUMENTED_POP_JUMP_IF_TRUE] = "INSTRUMENTED_POP_JUMP_IF_TRUE",
|
||||
[INSTRUMENTED_END_FOR] = "INSTRUMENTED_END_FOR",
|
||||
[INSTRUMENTED_END_SEND] = "INSTRUMENTED_END_SEND",
|
||||
[INSTRUMENTED_INSTRUCTION] = "INSTRUMENTED_INSTRUCTION",
|
||||
[INSTRUMENTED_LINE] = "INSTRUMENTED_LINE",
|
||||
[255] = "<255>",
|
||||
[SETUP_FINALLY] = "SETUP_FINALLY",
|
||||
[SETUP_CLEANUP] = "SETUP_CLEANUP",
|
||||
[SETUP_WITH] = "SETUP_WITH",
|
||||
|
|
@ -485,8 +504,6 @@ static const char *const _PyOpcode_OpName[263] = {
|
|||
#endif
|
||||
|
||||
#define EXTRA_CASES \
|
||||
case 159: \
|
||||
case 160: \
|
||||
case 161: \
|
||||
case 166: \
|
||||
case 167: \
|
||||
|
|
@ -556,23 +573,7 @@ static const char *const _PyOpcode_OpName[263] = {
|
|||
case 235: \
|
||||
case 236: \
|
||||
case 237: \
|
||||
case 238: \
|
||||
case 239: \
|
||||
case 240: \
|
||||
case 241: \
|
||||
case 242: \
|
||||
case 243: \
|
||||
case 244: \
|
||||
case 245: \
|
||||
case 246: \
|
||||
case 247: \
|
||||
case 248: \
|
||||
case 249: \
|
||||
case 250: \
|
||||
case 251: \
|
||||
case 252: \
|
||||
case 253: \
|
||||
case 254: \
|
||||
case 255: \
|
||||
;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
|
|
@ -133,16 +133,6 @@ extern void _PyThreadState_BindDetached(PyThreadState *);
|
|||
extern void _PyThreadState_UnbindDetached(PyThreadState *);
|
||||
|
||||
|
||||
static inline void
|
||||
_PyThreadState_UpdateTracingState(PyThreadState *tstate)
|
||||
{
|
||||
bool use_tracing =
|
||||
(tstate->tracing == 0) &&
|
||||
(tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
|
||||
tstate->cframe->use_tracing = (use_tracing ? 255 : 0);
|
||||
}
|
||||
|
||||
|
||||
/* Other */
|
||||
|
||||
PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue