summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_sys_settrace.py45
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst2
-rw-r--r--Python/ceval.c4
3 files changed, 50 insertions, 1 deletions
diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py
index 0af015aa56..a0d1122fad 100644
--- a/Lib/test/test_sys_settrace.py
+++ b/Lib/test/test_sys_settrace.py
@@ -481,6 +481,51 @@ class TraceTestCase(unittest.TestCase):
[(0, 'call'),
(1, 'line')])
+ def test_18_except_with_name(self):
+ def func():
+ try:
+ try:
+ raise Exception
+ except Exception as e:
+ raise
+ x = "Something"
+ y = "Something"
+ except Exception:
+ pass
+
+ self.run_and_compare(func,
+ [(0, 'call'),
+ (1, 'line'),
+ (2, 'line'),
+ (3, 'line'),
+ (3, 'exception'),
+ (4, 'line'),
+ (5, 'line'),
+ (8, 'line'),
+ (9, 'line'),
+ (9, 'return')])
+
+ def test_19_except_with_finally(self):
+ def func():
+ try:
+ try:
+ raise Exception
+ finally:
+ y = "Something"
+ except Exception:
+ b = 23
+
+ self.run_and_compare(func,
+ [(0, 'call'),
+ (1, 'line'),
+ (2, 'line'),
+ (3, 'line'),
+ (3, 'exception'),
+ (5, 'line'),
+ (6, 'line'),
+ (7, 'line'),
+ (7, 'return')])
+
class SkipLineEventsTraceTestCase(TraceTestCase):
"""Repeat the trace tests, but with per-line events skipped"""
diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst
new file mode 100644
index 0000000000..d742af9d32
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst
@@ -0,0 +1,2 @@
+Fix incorrent line execution reporting in trace functions when tracing
+exception handlers with name binding. Patch by Pablo Galindo.
diff --git a/Python/ceval.c b/Python/ceval.c
index 96ed329b0d..bd9454b281 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3610,7 +3610,9 @@ exception_unwind:
PUSH(val);
PUSH(exc);
JUMPTO(handler);
- if (_Py_TracingPossible(ceval)) {
+ if (_Py_TracingPossible(ceval) &&
+ ((f->f_lasti < instr_lb || f->f_lasti >= instr_ub) ||
+ !(f->f_lasti == instr_lb || f->f_lasti < instr_prev))) {
/* Make sure that we trace line after exception */
instr_prev = INT_MAX;
}