From b22f9d6e8cd9ef15e4898a1d3f2e52ade26a0594 Mon Sep 17 00:00:00 2001
From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
Date: Wed, 6 Jul 2022 08:21:59 +0100
Subject: [PATCH] [3.11] gh-94438: in frameobject's mark_stacks switch, the
 PUSH_EXC_INFO and POP_EXCEPT cases are no longer reachable (GH-94582)
 (GH-94595)

(cherry picked from commit 50b9a7762f06335277d9962edc8d39498601a4e4)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
---
 Objects/frameobject.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index cb822a11197..78113366c0d 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -256,10 +256,6 @@ mark_stacks(PyCodeObject *code_obj, int len)
                     stacks[i+1] = next_stack;
                     break;
                 }
-                case POP_EXCEPT:
-                    next_stack = pop_value(pop_value(pop_value(next_stack)));
-                    stacks[i+1] = next_stack;
-                    break;
                 case SEND:
                     j = get_arg(code, i) + i + 1;
                     assert(j < len);
@@ -304,10 +300,16 @@ mark_stacks(PyCodeObject *code_obj, int len)
                     stacks[i+1] = next_stack;
                     break;
                 case PUSH_EXC_INFO:
-                    next_stack = push_value(next_stack, Except);
-                    next_stack = push_value(next_stack, Except);
-                    next_stack = push_value(next_stack, Except);
-                    stacks[i+1] = next_stack;
+                case POP_EXCEPT:
+                    /* These instructions only appear in exception handlers, which
+                     * skip this switch ever since the move to zero-cost exceptions
+                     * (their stack remains UNINITIALIZED because nothing sets it).
+                     *
+                     * Note that explain_incompatible_stack interprets an
+                     * UNINITIALIZED stack as belonging to an exception handler.
+                     */
+                    Py_UNREACHABLE();
+                    break;
                 case RETURN_VALUE:
                 case RAISE_VARARGS:
                 case RERAISE:
-- 
GitLab