mirror of
https://github.com/python/cpython.git
synced 2025-08-26 11:45:20 +00:00
[3.10] bpo-44600: Fix line numbers for pattern matching cleanup code (GH-27346) (GH-27356)
(cherry picked from commit 4214f470f0
)
Co-authored-by: Charles Burkland <charles.aburkland@gmail.com>
Automerge-Triggered-By: GH:brandtbucher
This commit is contained in:
parent
628baf6fef
commit
01601aa736
3 changed files with 89 additions and 4 deletions
|
@ -6398,17 +6398,25 @@ compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
|
|||
}
|
||||
VISIT_SEQ(c, stmt, m->body);
|
||||
ADDOP_JUMP(c, JUMP_FORWARD, end);
|
||||
// If the pattern fails to match, we want the line number of the
|
||||
// cleanup to be associated with the failed pattern, not the last line
|
||||
// of the body
|
||||
SET_LOC(c, m->pattern);
|
||||
RETURN_IF_FALSE(emit_and_reset_fail_pop(c, pc));
|
||||
}
|
||||
if (has_default) {
|
||||
if (cases == 1) {
|
||||
// No matches. Done with the subject:
|
||||
ADDOP(c, POP_TOP);
|
||||
}
|
||||
// A trailing "case _" is common, and lets us save a bit of redundant
|
||||
// pushing and popping in the loop above:
|
||||
m = asdl_seq_GET(s->v.Match.cases, cases - 1);
|
||||
SET_LOC(c, m->pattern);
|
||||
if (cases == 1) {
|
||||
// No matches. Done with the subject:
|
||||
ADDOP(c, POP_TOP);
|
||||
}
|
||||
else {
|
||||
// Show line coverage for default case (it doesn't create bytecode)
|
||||
ADDOP(c, NOP);
|
||||
}
|
||||
if (m->guard) {
|
||||
RETURN_IF_FALSE(compiler_jump_if(c, m->guard, end, 0));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue