summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_sys_settrace.py23
-rw-r--r--Python/compile.c5
2 files changed, 25 insertions, 3 deletions
diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py
index 09d0adca2e..adbb5b56dc 100644
--- a/Lib/test/test_sys_settrace.py
+++ b/Lib/test/test_sys_settrace.py
@@ -1077,6 +1077,29 @@ class TraceTestCase(unittest.TestCase):
(1, 'line'),
(1, 'return')])
+ def test_no_tracing_of_named_except_cleanup(self):
+
+ def func():
+ x = 0
+ try:
+ 1/x
+ except ZeroDivisionError as error:
+ if x:
+ raise
+ return "done"
+
+ self.run_and_compare(func,
+ [(0, 'call'),
+ (1, 'line'),
+ (2, 'line'),
+ (3, 'line'),
+ (3, 'exception'),
+ (4, 'line'),
+ (5, 'line'),
+ (7, 'line'),
+ (7, 'return')])
+
+
class SkipLineEventsTraceTestCase(TraceTestCase):
"""Repeat the trace tests, but with per-line events skipped"""
diff --git a/Python/compile.c b/Python/compile.c
index 7dc04923af..78d5fbe03f 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -3220,10 +3220,10 @@ compiler_try_except(struct compiler *c, stmt_ty s)
/* second # body */
VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
- ADDOP(c, POP_BLOCK);
- ADDOP(c, POP_EXCEPT);
/* name = None; del name; # Mark as artificial */
c->u->u_lineno = -1;
+ ADDOP(c, POP_BLOCK);
+ ADDOP(c, POP_EXCEPT);
ADDOP_LOAD_CONST(c, Py_None);
compiler_nameop(c, handler->v.ExceptHandler.name, Store);
compiler_nameop(c, handler->v.ExceptHandler.name, Del);
@@ -3254,7 +3254,6 @@ compiler_try_except(struct compiler *c, stmt_ty s)
return 0;
VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
- /* name = None; del name; # Mark as artificial */
c->u->u_lineno = -1;
ADDOP(c, POP_EXCEPT);
ADDOP_JUMP(c, JUMP_FORWARD, end);