mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
[3.12] gh-105658: fix excess trace events for except block ending with a conditional block (#109384) (#109411)
gh-105658: fix excess trace events for except block ending with a conditional block (#109384)
(cherry picked from commit 4a54074a0f
)
This commit is contained in:
parent
5c7e8c3b72
commit
3eae45f94d
3 changed files with 34 additions and 15 deletions
|
@ -921,6 +921,35 @@ class TraceTestCase(unittest.TestCase):
|
|||
(6, 'line'),
|
||||
(6, 'return')])
|
||||
|
||||
def test_finally_with_conditional(self):
|
||||
|
||||
# See gh-105658
|
||||
condition = True
|
||||
def func():
|
||||
try:
|
||||
try:
|
||||
raise Exception
|
||||
finally:
|
||||
if condition:
|
||||
result = 1
|
||||
result = 2
|
||||
except:
|
||||
result = 3
|
||||
return result
|
||||
|
||||
self.run_and_compare(func,
|
||||
[(0, 'call'),
|
||||
(1, 'line'),
|
||||
(2, 'line'),
|
||||
(3, 'line'),
|
||||
(3, 'exception'),
|
||||
(5, 'line'),
|
||||
(6, 'line'),
|
||||
(8, 'line'),
|
||||
(9, 'line'),
|
||||
(10, 'line'),
|
||||
(10, 'return')])
|
||||
|
||||
def test_break_to_continue1(self):
|
||||
|
||||
def func():
|
||||
|
@ -2092,7 +2121,7 @@ class JumpTestCase(unittest.TestCase):
|
|||
output.append(11)
|
||||
output.append(12)
|
||||
|
||||
@jump_test(5, 11, [2, 4], (ValueError, 'exception'))
|
||||
@jump_test(5, 11, [2, 4], (ValueError, 'comes after the current code block'))
|
||||
def test_no_jump_over_return_try_finally_in_finally_block(output):
|
||||
try:
|
||||
output.append(2)
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix bug where the line trace of an except block ending with a conditional
|
||||
includes an excess event with the line of the conditional expression.
|
|
@ -3184,18 +3184,6 @@ compiler_continue(struct compiler *c, location loc)
|
|||
}
|
||||
|
||||
|
||||
static location
|
||||
location_of_last_executing_statement(asdl_stmt_seq *stmts)
|
||||
{
|
||||
for (Py_ssize_t i = asdl_seq_LEN(stmts) - 1; i >= 0; i++) {
|
||||
location loc = LOC((stmt_ty)asdl_seq_GET(stmts, i));
|
||||
if (loc.lineno > 0) {
|
||||
return loc;
|
||||
}
|
||||
}
|
||||
return NO_LOCATION;
|
||||
}
|
||||
|
||||
/* Code generated for "try: <body> finally: <finalbody>" is as follows:
|
||||
|
||||
SETUP_FINALLY L
|
||||
|
@ -3264,9 +3252,9 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
|
|||
RETURN_IF_ERROR(
|
||||
compiler_push_fblock(c, loc, FINALLY_END, end, NO_LABEL, NULL));
|
||||
VISIT_SEQ(c, stmt, s->v.Try.finalbody);
|
||||
loc = location_of_last_executing_statement(s->v.Try.finalbody);
|
||||
compiler_pop_fblock(c, FINALLY_END, end);
|
||||
|
||||
loc = NO_LOCATION;
|
||||
ADDOP_I(c, loc, RERAISE, 0);
|
||||
|
||||
USE_LABEL(c, cleanup);
|
||||
|
@ -3315,9 +3303,9 @@ compiler_try_star_finally(struct compiler *c, stmt_ty s)
|
|||
compiler_push_fblock(c, loc, FINALLY_END, end, NO_LABEL, NULL));
|
||||
|
||||
VISIT_SEQ(c, stmt, s->v.TryStar.finalbody);
|
||||
loc = location_of_last_executing_statement(s->v.Try.finalbody);
|
||||
|
||||
compiler_pop_fblock(c, FINALLY_END, end);
|
||||
loc = NO_LOCATION;
|
||||
ADDOP_I(c, loc, RERAISE, 0);
|
||||
|
||||
USE_LABEL(c, cleanup);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue