summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-12-19-22-03-43.gh-issue-111375.M9vuA6.rst2
-rw-r--r--Objects/frameobject.c2
-rw-r--r--Python/bytecodes.c2
-rw-r--r--Python/errors.c6
-rw-r--r--Python/executor_cases.c.h2
-rw-r--r--Python/generated_cases.c.h2
6 files changed, 9 insertions, 7 deletions
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-12-19-22-03-43.gh-issue-111375.M9vuA6.rst b/Misc/NEWS.d/next/Core and Builtins/2023-12-19-22-03-43.gh-issue-111375.M9vuA6.rst
new file mode 100644
index 0000000..fbb5171
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-12-19-22-03-43.gh-issue-111375.M9vuA6.rst
@@ -0,0 +1,2 @@
+Only use ``NULL`` in the exception stack to indicate an exception was
+handled. Patch by Carey Metcalfe.
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index be330a7..cafe4ef 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -811,7 +811,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore
PyObject *exc = _PyFrame_StackPop(f->f_frame);
assert(PyExceptionInstance_Check(exc) || exc == Py_None);
PyThreadState *tstate = _PyThreadState_GET();
- Py_XSETREF(tstate->exc_info->exc_value, exc);
+ Py_XSETREF(tstate->exc_info->exc_value, exc == Py_None ? NULL : exc);
}
else {
PyObject *v = _PyFrame_StackPop(f->f_frame);
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 82d7a71..29e1dab 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -1100,7 +1100,7 @@ dummy_func(
inst(POP_EXCEPT, (exc_value -- )) {
_PyErr_StackItem *exc_info = tstate->exc_info;
- Py_XSETREF(exc_info->exc_value, exc_value);
+ Py_XSETREF(exc_info->exc_value, exc_value == Py_None ? NULL : exc_value);
}
inst(RERAISE, (values[oparg], exc -- values[oparg])) {
diff --git a/Python/errors.c b/Python/errors.c
index ed5eec5..e5f176a 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -121,11 +121,11 @@ _PyErr_GetTopmostException(PyThreadState *tstate)
_PyErr_StackItem *exc_info = tstate->exc_info;
assert(exc_info);
- while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) &&
- exc_info->previous_item != NULL)
+ while (exc_info->exc_value == NULL && exc_info->previous_item != NULL)
{
exc_info = exc_info->previous_item;
}
+ assert(!Py_IsNone(exc_info->exc_value));
return exc_info;
}
@@ -592,7 +592,7 @@ PyErr_GetHandledException(void)
void
_PyErr_SetHandledException(PyThreadState *tstate, PyObject *exc)
{
- Py_XSETREF(tstate->exc_info->exc_value, Py_XNewRef(exc));
+ Py_XSETREF(tstate->exc_info->exc_value, Py_XNewRef(exc == Py_None ? NULL : exc));
}
void
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 7cc29c8..69adb20 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -806,7 +806,7 @@
PyObject *exc_value;
exc_value = stack_pointer[-1];
_PyErr_StackItem *exc_info = tstate->exc_info;
- Py_XSETREF(exc_info->exc_value, exc_value);
+ Py_XSETREF(exc_info->exc_value, exc_value == Py_None ? NULL : exc_value);
stack_pointer += -1;
break;
}
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index e935f33..f94dc61 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -4567,7 +4567,7 @@
PyObject *exc_value;
exc_value = stack_pointer[-1];
_PyErr_StackItem *exc_info = tstate->exc_info;
- Py_XSETREF(exc_info->exc_value, exc_value);
+ Py_XSETREF(exc_info->exc_value, exc_value == Py_None ? NULL : exc_value);
stack_pointer += -1;
DISPATCH();
}