diff options
author | Charles Burkland <charles.aburkland@gmail.com> | 2021-07-25 23:42:07 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-25 23:42:07 (GMT) |
commit | 4214f470f0cb9b6fef9a90758756fbc00ba95b5a (patch) | |
tree | 69233bb8fafe19c2e778bfe3c3353e5e8f0b7a13 /Python | |
parent | 3e235e0447e373d81f195f4292959c7be9c013dc (diff) | |
download | cpython-4214f470f0cb9b6fef9a90758756fbc00ba95b5a.zip cpython-4214f470f0cb9b6fef9a90758756fbc00ba95b5a.tar.gz cpython-4214f470f0cb9b6fef9a90758756fbc00ba95b5a.tar.bz2 |
bpo-44600: Fix line numbers for pattern matching cleanup code (GH-27346)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/compile.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/Python/compile.c b/Python/compile.c index 3a20f6b..7fb8abf 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -6576,17 +6576,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)); } |