summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_sys_settrace.py
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2020-12-16 13:07:01 (GMT)
committerGitHub <noreply@github.com>2020-12-16 13:07:01 (GMT)
commit5274b682bc93a04da8a69742528ac7f64633a96e (patch)
tree9b6cc57b7d1916555e44408d2f4295d94fa081a0 /Lib/test/test_sys_settrace.py
parentc71581c7a4192e6ba9a79eccc583aaadab300efa (diff)
downloadcpython-5274b682bc93a04da8a69742528ac7f64633a96e.zip
cpython-5274b682bc93a04da8a69742528ac7f64633a96e.tar.gz
cpython-5274b682bc93a04da8a69742528ac7f64633a96e.tar.bz2
bpo-42645: Make sure that return/break/continue are only traced once when exiting via a finally block. (GH-23780)
* Make sure that return/break/continue are only traced once when exiting via a finally block. * Add test for return in try-finally. * Update importlib
Diffstat (limited to 'Lib/test/test_sys_settrace.py')
-rw-r--r--Lib/test/test_sys_settrace.py113
1 files changed, 113 insertions, 0 deletions
diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py
index a842139..3bfc993 100644
--- a/Lib/test/test_sys_settrace.py
+++ b/Lib/test/test_sys_settrace.py
@@ -678,6 +678,119 @@ class TraceTestCase(unittest.TestCase):
(4, 'line'),
(4, 'return')])
+ def test_if_break(self):
+
+ def func():
+ seq = [1, 0]
+ while seq:
+ n = seq.pop()
+ if n:
+ break # line 5
+ else:
+ n = 99
+ return n # line 8
+
+ self.run_and_compare(func,
+ [(0, 'call'),
+ (1, 'line'),
+ (2, 'line'),
+ (3, 'line'),
+ (4, 'line'),
+ (2, 'line'),
+ (3, 'line'),
+ (4, 'line'),
+ (5, 'line'),
+ (8, 'line'),
+ (8, 'return')])
+
+ def test_break_through_finally(self):
+
+ def func():
+ a, c, d, i = 1, 1, 1, 99
+ try:
+ for i in range(3):
+ try:
+ a = 5
+ if i > 0:
+ break # line 7
+ a = 8
+ finally:
+ c = 10
+ except:
+ d = 12 # line 12
+ assert a == 5 and c == 10 and d == 1 # line 13
+
+ self.run_and_compare(func,
+ [(0, 'call'),
+ (1, 'line'),
+ (2, 'line'),
+ (3, 'line'),
+ (4, 'line'),
+ (5, 'line'),
+ (6, 'line'),
+ (8, 'line'),
+ (10, 'line'),
+ (3, 'line'),
+ (4, 'line'),
+ (5, 'line'),
+ (6, 'line'),
+ (7, 'line'),
+ (10, 'line'),
+ (13, 'line'),
+ (13, 'return')])
+
+ def test_continue_through_finally(self):
+
+ def func():
+ a, b, c, d, i = 1, 1, 1, 1, 99
+ try:
+ for i in range(2):
+ try:
+ a = 5
+ if i > 0:
+ continue # line 7
+ b = 8
+ finally:
+ c = 10
+ except:
+ d = 12 # line 12
+ assert (a, b, c, d) == (5, 8, 10, 1) # line 13
+
+ self.run_and_compare(func,
+ [(0, 'call'),
+ (1, 'line'),
+ (2, 'line'),
+ (3, 'line'),
+ (4, 'line'),
+ (5, 'line'),
+ (6, 'line'),
+ (8, 'line'),
+ (10, 'line'),
+ (3, 'line'),
+ (4, 'line'),
+ (5, 'line'),
+ (6, 'line'),
+ (7, 'line'),
+ (10, 'line'),
+ (3, 'line'),
+ (13, 'line'),
+ (13, 'return')])
+
+ def test_return_through_finally(self):
+
+ def func():
+ try:
+ return 2
+ finally:
+ 4
+
+ self.run_and_compare(func,
+ [(0, 'call'),
+ (1, 'line'),
+ (2, 'line'),
+ (4, 'line'),
+ (4, 'return')])
+
class SkipLineEventsTraceTestCase(TraceTestCase):
"""Repeat the trace tests, but with per-line events skipped"""