diff options
author | Mark Shannon <mark@hotpy.org> | 2021-07-14 10:08:38 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-14 10:08:38 +0100 |
commit | e5862f79c16e28f1ec51d179698739a9b2d8c1d2 (patch) | |
tree | 7bc78c01297940c15efcdf7bdbc5bf6bcc7cac77 | |
parent | f572cbf1faab33d9afbbe3e95738ed6fbe6e48e6 (diff) | |
download | cpython-git-e5862f79c16e28f1ec51d179698739a9b2d8c1d2.tar.gz |
bpo-44616: Mark all clean up instructions at end of named exception block as artificial (GH-27109)
-rw-r--r-- | Lib/test/test_sys_settrace.py | 23 | ||||
-rw-r--r-- | Python/compile.c | 5 | ||||
-rw-r--r-- | Python/importlib_zipimport.h | 4 |
3 files changed, 27 insertions, 5 deletions
diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index c42c69d0c8..ce247739b0 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 bb5c2eca96..81648c5111 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3312,11 +3312,11 @@ 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); + /* name = None; del name; # Mark as artificial */ + UNSET_LOC(c); ADDOP(c, POP_BLOCK); ADDOP(c, POP_BLOCK); ADDOP(c, POP_EXCEPT); - /* name = None; del name; # Mark as artificial */ - UNSET_LOC(c); ADDOP_LOAD_CONST(c, Py_None); compiler_nameop(c, handler->v.ExceptHandler.name, Store); compiler_nameop(c, handler->v.ExceptHandler.name, Del); @@ -3348,7 +3348,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 */ UNSET_LOC(c); ADDOP(c, POP_BLOCK); ADDOP(c, POP_EXCEPT); diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index d4ba6ee7bd..15ad71f72b 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -1403,8 +1403,8 @@ const unsigned char _Py_M__zipimport[] = { 23,35,13,20,20,29,30,34,30,42,44,53,20,54,13,17, 20,24,13,17,16,26,13,54,17,39,28,43,44,48,50,57, 59,67,69,77,79,83,28,84,21,25,21,25,0,0,17,39, - 24,35,17,39,17,39,17,39,17,39,36,39,21,33,21,39, - 21,39,21,39,21,39,21,39,0,0,0,0,0,0,0,0, + 24,35,17,39,17,39,17,39,17,39,36,39,21,33,21,33, + 21,33,21,33,21,33,21,33,0,0,0,0,0,0,0,0, 0,0,24,39,40,47,49,53,24,54,17,21,16,20,24,28, 16,28,13,25,17,25,23,32,33,34,23,35,13,20,20,24, 26,35,37,44,20,44,13,44,13,44,13,44,12,24,9,83, |