summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2022-06-14 10:09:30 (GMT)
committerGitHub <noreply@github.com>2022-06-14 10:09:30 (GMT)
commit3cd1a5d3ec487e23e3d976e7dd235329f04cfc73 (patch)
tree53e270197be3ceec9e38277ec30a0338631a6727 /Python
parent2bf74753c14e5360e04930b478703f4e2618f4a3 (diff)
downloadcpython-3cd1a5d3ec487e23e3d976e7dd235329f04cfc73.zip
cpython-3cd1a5d3ec487e23e3d976e7dd235329f04cfc73.tar.gz
cpython-3cd1a5d3ec487e23e3d976e7dd235329f04cfc73.tar.bz2
GH-93516: Store offset of first traceable instruction in code object (GH-93769)
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c89
1 files changed, 37 insertions, 52 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 0e81863..341d1d2 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -5568,57 +5568,47 @@ handle_eval_breaker:
case DO_TRACING:
#endif
{
- if (tstate->tracing == 0) {
+ if (tstate->tracing == 0 &&
+ INSTR_OFFSET() >= frame->f_code->_co_firsttraceable
+ ) {
int instr_prev = _PyInterpreterFrame_LASTI(frame);
frame->prev_instr = next_instr;
TRACING_NEXTOPARG();
- switch(opcode) {
- case COPY_FREE_VARS:
- case MAKE_CELL:
- case RETURN_GENERATOR:
- /* Frame not fully initialized */
- break;
- case RESUME:
- if (oparg < 2) {
- CHECK_EVAL_BREAKER();
- }
- /* Call tracing */
- TRACE_FUNCTION_ENTRY();
- DTRACE_FUNCTION_ENTRY();
- break;
- case POP_TOP:
- if (_Py_OPCODE(next_instr[-1]) == RETURN_GENERATOR) {
- /* Frame not fully initialized */
- break;
- }
- /* fall through */
- default:
- /* line-by-line tracing support */
- if (PyDTrace_LINE_ENABLED()) {
- maybe_dtrace_line(frame, &tstate->trace_info, instr_prev);
- }
-
- if (cframe.use_tracing &&
- tstate->c_tracefunc != NULL && !tstate->tracing) {
- int err;
- /* see maybe_call_line_trace()
- for expository comments */
- _PyFrame_SetStackPointer(frame, stack_pointer);
-
- err = maybe_call_line_trace(tstate->c_tracefunc,
- tstate->c_traceobj,
- tstate, frame, instr_prev);
- if (err) {
- /* trace function raised an exception */
- next_instr++;
- goto error;
- }
- /* Reload possibly changed frame fields */
- next_instr = frame->prev_instr;
+ if (opcode == RESUME) {
+ if (oparg < 2) {
+ CHECK_EVAL_BREAKER();
+ }
+ /* Call tracing */
+ TRACE_FUNCTION_ENTRY();
+ DTRACE_FUNCTION_ENTRY();
+ }
+ else {
+ /* line-by-line tracing support */
+ if (PyDTrace_LINE_ENABLED()) {
+ maybe_dtrace_line(frame, &tstate->trace_info, instr_prev);
+ }
- stack_pointer = _PyFrame_GetStackPointer(frame);
- frame->stacktop = -1;
+ if (cframe.use_tracing &&
+ tstate->c_tracefunc != NULL && !tstate->tracing) {
+ int err;
+ /* see maybe_call_line_trace()
+ for expository comments */
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+
+ err = maybe_call_line_trace(tstate->c_tracefunc,
+ tstate->c_traceobj,
+ tstate, frame, instr_prev);
+ if (err) {
+ /* trace function raised an exception */
+ next_instr++;
+ goto error;
}
+ /* Reload possibly changed frame fields */
+ next_instr = frame->prev_instr;
+
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ frame->stacktop = -1;
+ }
}
}
TRACING_NEXTOPARG();
@@ -6855,13 +6845,8 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
then call the trace function if we're tracing source lines.
*/
initialize_trace_info(&tstate->trace_info, frame);
- int entry_point = 0;
- _Py_CODEUNIT *code = _PyCode_CODE(frame->f_code);
- while (_PyOpcode_Deopt[_Py_OPCODE(code[entry_point])] != RESUME) {
- entry_point++;
- }
int lastline;
- if (instr_prev <= entry_point) {
+ if (instr_prev <= frame->f_code->_co_firsttraceable) {
lastline = -1;
}
else {