Browse Source
bpo-44570: Fix line tracing for forwards jumps to duplicated tails (GH-27068)
pull/27076/head
Mark Shannon
5 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
37 additions and
4 deletions
-
Lib/test/test_sys_settrace.py
-
Python/ceval.c
|
|
|
@ -1041,6 +1041,41 @@ class TraceTestCase(unittest.TestCase): |
|
|
|
(-8, '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): |
|
|
|
"""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 line = _PyCode_CheckLineNumber(frame->f_lasti*2, &tstate->trace_info.bounds); |
|
|
|
if (line != -1 && frame->f_trace_lines) { |
|
|
|
/* Trace backward edges or first instruction of a new line */ |
|
|
|
if (frame->f_lasti < instr_prev || |
|
|
|
(line != lastline && frame->f_lasti*2 == tstate->trace_info.bounds.ar_start)) |
|
|
|
{ |
|
|
|
/* Trace backward edges or if line number has changed */ |
|
|
|
if (frame->f_lasti < instr_prev || line != lastline) { |
|
|
|
result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None); |
|
|
|
} |
|
|
|
} |
|
|
|
|