mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
bpo-44570: Fix line tracing for forwards jumps to duplicated tails (GH-27068)
This commit is contained in:
parent
91a8f8c16c
commit
da6414f0ac
2 changed files with 37 additions and 4 deletions
|
@ -1041,6 +1041,41 @@ class TraceTestCase(unittest.TestCase):
|
||||||
(-8, 'return'),
|
(-8, 'return'),
|
||||||
(1, 'return')])
|
(1, 'return')])
|
||||||
|
|
||||||
|
def test_flow_converges_on_same_line(self):
|
||||||
|
|
||||||
|
def foo(x):
|
||||||
|
if x:
|
||||||
|
try:
|
||||||
|
1/(x - 1)
|
||||||
|
except ZeroDivisionError:
|
||||||
|
pass
|
||||||
|
return x
|
||||||
|
|
||||||
|
def func():
|
||||||
|
for i in range(2):
|
||||||
|
foo(i)
|
||||||
|
|
||||||
|
self.run_and_compare(func,
|
||||||
|
[(0, 'call'),
|
||||||
|
(1, 'line'),
|
||||||
|
(2, 'line'),
|
||||||
|
(-8, 'call'),
|
||||||
|
(-7, 'line'),
|
||||||
|
(-2, 'line'),
|
||||||
|
(-2, 'return'),
|
||||||
|
(1, 'line'),
|
||||||
|
(2, 'line'),
|
||||||
|
(-8, 'call'),
|
||||||
|
(-7, 'line'),
|
||||||
|
(-6, 'line'),
|
||||||
|
(-5, 'line'),
|
||||||
|
(-5, 'exception'),
|
||||||
|
(-4, 'line'),
|
||||||
|
(-3, 'line'),
|
||||||
|
(-2, 'line'),
|
||||||
|
(-2, 'return'),
|
||||||
|
(1, 'line'),
|
||||||
|
(1, 'return')])
|
||||||
|
|
||||||
class SkipLineEventsTraceTestCase(TraceTestCase):
|
class SkipLineEventsTraceTestCase(TraceTestCase):
|
||||||
"""Repeat the trace tests, but with per-line events skipped"""
|
"""Repeat the trace tests, but with per-line events skipped"""
|
||||||
|
|
|
@ -5476,10 +5476,8 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
|
||||||
int lastline = _PyCode_CheckLineNumber(instr_prev*2, &tstate->trace_info.bounds);
|
int lastline = _PyCode_CheckLineNumber(instr_prev*2, &tstate->trace_info.bounds);
|
||||||
int line = _PyCode_CheckLineNumber(frame->f_lasti*2, &tstate->trace_info.bounds);
|
int line = _PyCode_CheckLineNumber(frame->f_lasti*2, &tstate->trace_info.bounds);
|
||||||
if (line != -1 && frame->f_trace_lines) {
|
if (line != -1 && frame->f_trace_lines) {
|
||||||
/* Trace backward edges or first instruction of a new line */
|
/* Trace backward edges or if line number has changed */
|
||||||
if (frame->f_lasti < instr_prev ||
|
if (frame->f_lasti < instr_prev || line != lastline) {
|
||||||
(line != lastline && frame->f_lasti*2 == tstate->trace_info.bounds.ar_start))
|
|
||||||
{
|
|
||||||
result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
|
result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue