diff options
author | Mark Shannon <mark@hotpy.org> | 2022-03-15 17:06:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-15 17:06:21 (GMT) |
commit | 099f75614100e88ed90b68d20a51a8d9c22f81a7 (patch) | |
tree | b65ff46978b50db65b5420bcdc1330048d592804 /Python | |
parent | a8c728b8b742fd8ca5a225f79d99014794b8fdf3 (diff) | |
download | cpython-099f75614100e88ed90b68d20a51a8d9c22f81a7.zip cpython-099f75614100e88ed90b68d20a51a8d9c22f81a7.tar.gz cpython-099f75614100e88ed90b68d20a51a8d9c22f81a7.tar.bz2 |
bpo-45923: Decouple suspension of tracing from tracing flag. (GH-31908)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/ceval.c | 44 | ||||
-rw-r--r-- | Python/pystate.c | 17 |
2 files changed, 28 insertions, 33 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index adbf1f6..d0fc31e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5439,10 +5439,12 @@ handle_eval_breaker: } #if USE_COMPUTED_GOTOS - TARGET_DO_TRACING: { + TARGET_DO_TRACING: #else - case DO_TRACING: { + case DO_TRACING: #endif + { + if (tstate->tracing == 0) { int instr_prev = skip_backwards_over_extended_args(frame->f_code, frame->f_lasti); frame->f_lasti = INSTR_OFFSET(); TRACING_NEXTOPARG(); @@ -5482,11 +5484,11 @@ handle_eval_breaker: frame->stacktop = -1; } } - TRACING_NEXTOPARG(); - PRE_DISPATCH_GOTO(); - DISPATCH_GOTO(); } - + TRACING_NEXTOPARG(); + PRE_DISPATCH_GOTO(); + DISPATCH_GOTO(); + } #if USE_COMPUTED_GOTOS _unknown_opcode: @@ -6673,27 +6675,38 @@ initialize_trace_info(PyTraceInfo *trace_info, _PyInterpreterFrame *frame) } } +void +PyThreadState_EnterTracing(PyThreadState *tstate) +{ + tstate->tracing++; +} + +void +PyThreadState_LeaveTracing(PyThreadState *tstate) +{ + tstate->tracing--; +} + static int call_trace(Py_tracefunc func, PyObject *obj, PyThreadState *tstate, _PyInterpreterFrame *frame, int what, PyObject *arg) { int result; - if (tstate->tracing) + if (tstate->tracing) { return 0; - tstate->tracing++; - _PyThreadState_PauseTracing(tstate); + } PyFrameObject *f = _PyFrame_GetFrameObject(frame); if (f == NULL) { return -1; } + PyThreadState_EnterTracing(tstate); assert (frame->f_lasti >= 0); initialize_trace_info(&tstate->trace_info, frame); f->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti*sizeof(_Py_CODEUNIT), &tstate->trace_info.bounds); result = func(obj, f, what, arg); f->f_lineno = 0; - _PyThreadState_ResumeTracing(tstate); - tstate->tracing--; + PyThreadState_LeaveTracing(tstate); return result; } @@ -6706,7 +6719,6 @@ _PyEval_CallTracing(PyObject *func, PyObject *args) PyObject *result; tstate->tracing = 0; - _PyThreadState_ResumeTracing(tstate); result = PyObject_Call(func, args, NULL); tstate->tracing = save_tracing; tstate->cframe->use_tracing = save_use_tracing; @@ -6773,7 +6785,7 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) tstate->c_profilefunc = NULL; tstate->c_profileobj = NULL; /* Must make sure that tracing is not ignored if 'profileobj' is freed */ - _PyThreadState_ResumeTracing(tstate); + _PyThreadState_UpdateTracingState(tstate); Py_XDECREF(profileobj); Py_XINCREF(arg); @@ -6781,7 +6793,7 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) tstate->c_profilefunc = func; /* Flag that tracing or profiling is turned on */ - _PyThreadState_ResumeTracing(tstate); + _PyThreadState_UpdateTracingState(tstate); return 0; } @@ -6814,7 +6826,7 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) tstate->c_tracefunc = NULL; tstate->c_traceobj = NULL; /* Must make sure that profiling is not ignored if 'traceobj' is freed */ - _PyThreadState_ResumeTracing(tstate); + _PyThreadState_UpdateTracingState(tstate); Py_XDECREF(traceobj); Py_XINCREF(arg); @@ -6822,7 +6834,7 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) tstate->c_tracefunc = func; /* Flag that tracing or profiling is turned on */ - _PyThreadState_ResumeTracing(tstate); + _PyThreadState_UpdateTracingState(tstate); return 0; } diff --git a/Python/pystate.c b/Python/pystate.c index edf2f62..1b4e31b 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1333,23 +1333,6 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) return 0; } - -void -PyThreadState_EnterTracing(PyThreadState *tstate) -{ - tstate->tracing++; - _PyThreadState_PauseTracing(tstate); -} - -void -PyThreadState_LeaveTracing(PyThreadState *tstate) -{ - tstate->tracing--; - _PyThreadState_ResumeTracing(tstate); -} - - - /* Routines for advanced debuggers, requested by David Beazley. Don't use unless you know what you are doing! */ |