summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorCharles Burkland <charles.aburkland@gmail.com>2021-07-25 23:42:07 (GMT)
committerGitHub <noreply@github.com>2021-07-25 23:42:07 (GMT)
commit4214f470f0cb9b6fef9a90758756fbc00ba95b5a (patch)
tree69233bb8fafe19c2e778bfe3c3353e5e8f0b7a13 /Python
parent3e235e0447e373d81f195f4292959c7be9c013dc (diff)
downloadcpython-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.c16
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));
}