|
|
bf1e00d |
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
Victor Stinner |
761bbd3 |
From: Charalampos Stratakis <cstratak@redhat.com>
|
|
Victor Stinner |
761bbd3 |
Date: Fri, 19 Jun 2020 17:06:08 +0200
|
|
Victor Stinner |
761bbd3 |
Subject: [PATCH] 00292: Restore PyExc_RecursionErrorInst symbol
|
|
Victor Stinner |
761bbd3 |
|
|
Victor Stinner |
761bbd3 |
Restore the public PyExc_RecursionErrorInst symbol that was removed
|
|
Victor Stinner |
761bbd3 |
from the 3.6.4 release upstream.
|
|
Victor Stinner |
761bbd3 |
Reported upstream: https://bugs.python.org/issue30697
|
|
Victor Stinner |
761bbd3 |
---
|
|
Victor Stinner |
761bbd3 |
Include/pyerrors.h | 2 ++
|
|
Victor Stinner |
761bbd3 |
Objects/exceptions.c | 32 ++++++++++++++++++++++++++++++++
|
|
Victor Stinner |
761bbd3 |
PC/python3.def | 1 +
|
|
Victor Stinner |
761bbd3 |
3 files changed, 35 insertions(+)
|
|
Victor Stinner |
761bbd3 |
|
|
|
d623e92 |
diff --git a/Include/pyerrors.h b/Include/pyerrors.h
|
|
Victor Stinner |
761bbd3 |
index 44f20303c2..8b5c2748de 100644
|
|
|
d623e92 |
--- a/Include/pyerrors.h
|
|
|
d623e92 |
+++ b/Include/pyerrors.h
|
|
|
d623e92 |
@@ -219,6 +219,8 @@ PyAPI_DATA(PyObject *) PyExc_IOError;
|
|
|
d623e92 |
PyAPI_DATA(PyObject *) PyExc_WindowsError;
|
|
|
d623e92 |
#endif
|
|
|
d623e92 |
|
|
|
d623e92 |
+PyAPI_DATA(PyObject *) PyExc_RecursionErrorInst;
|
|
|
d623e92 |
+
|
|
|
d623e92 |
/* Predefined warning categories */
|
|
|
d623e92 |
PyAPI_DATA(PyObject *) PyExc_Warning;
|
|
|
d623e92 |
PyAPI_DATA(PyObject *) PyExc_UserWarning;
|
|
|
d623e92 |
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
|
|
Victor Stinner |
761bbd3 |
index 6f3b986d32..76bb1a4697 100644
|
|
|
d623e92 |
--- a/Objects/exceptions.c
|
|
|
d623e92 |
+++ b/Objects/exceptions.c
|
|
Victor Stinner |
761bbd3 |
@@ -2434,6 +2434,12 @@ SimpleExtendsException(PyExc_Warning, ResourceWarning,
|
|
|
d623e92 |
|
|
|
d623e92 |
|
|
|
d623e92 |
|
|
|
d623e92 |
+/* Pre-computed RecursionError instance for when recursion depth is reached.
|
|
|
d623e92 |
+ Meant to be used when normalizing the exception for exceeding the recursion
|
|
|
d623e92 |
+ depth will cause its own infinite recursion.
|
|
|
d623e92 |
+*/
|
|
|
d623e92 |
+PyObject *PyExc_RecursionErrorInst = NULL;
|
|
|
d623e92 |
+
|
|
|
d623e92 |
#define PRE_INIT(TYPE) \
|
|
|
d623e92 |
if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
|
|
|
d623e92 |
if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
|
|
Victor Stinner |
761bbd3 |
@@ -2695,11 +2701,37 @@ _PyExc_Init(PyObject *bltinmod)
|
|
|
d623e92 |
ADD_ERRNO(TimeoutError, ETIMEDOUT);
|
|
|
d623e92 |
|
|
|
d623e92 |
preallocate_memerrors();
|
|
|
d623e92 |
+
|
|
|
d623e92 |
+ if (!PyExc_RecursionErrorInst) {
|
|
|
d623e92 |
+ PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL, NULL);
|
|
|
d623e92 |
+ if (!PyExc_RecursionErrorInst)
|
|
|
d623e92 |
+ Py_FatalError("Cannot pre-allocate RecursionError instance for "
|
|
|
d623e92 |
+ "recursion errors");
|
|
|
d623e92 |
+ else {
|
|
|
d623e92 |
+ PyBaseExceptionObject *err_inst =
|
|
|
d623e92 |
+ (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
|
|
|
d623e92 |
+ PyObject *args_tuple;
|
|
|
d623e92 |
+ PyObject *exc_message;
|
|
|
d623e92 |
+ exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
|
|
|
d623e92 |
+ if (!exc_message)
|
|
|
d623e92 |
+ Py_FatalError("cannot allocate argument for RecursionError "
|
|
|
d623e92 |
+ "pre-allocation");
|
|
|
d623e92 |
+ args_tuple = PyTuple_Pack(1, exc_message);
|
|
|
d623e92 |
+ if (!args_tuple)
|
|
|
d623e92 |
+ Py_FatalError("cannot allocate tuple for RecursionError "
|
|
|
d623e92 |
+ "pre-allocation");
|
|
|
d623e92 |
+ Py_DECREF(exc_message);
|
|
|
d623e92 |
+ if (BaseException_init(err_inst, args_tuple, NULL))
|
|
|
d623e92 |
+ Py_FatalError("init of pre-allocated RecursionError failed");
|
|
|
d623e92 |
+ Py_DECREF(args_tuple);
|
|
|
d623e92 |
+ }
|
|
|
d623e92 |
+ }
|
|
|
d623e92 |
}
|
|
|
d623e92 |
|
|
|
d623e92 |
void
|
|
|
d623e92 |
_PyExc_Fini(void)
|
|
|
d623e92 |
{
|
|
|
d623e92 |
+ Py_CLEAR(PyExc_RecursionErrorInst);
|
|
|
d623e92 |
free_preallocated_memerrors();
|
|
|
d623e92 |
Py_CLEAR(errnomap);
|
|
|
d623e92 |
}
|
|
|
d623e92 |
diff --git a/PC/python3.def b/PC/python3.def
|
|
Victor Stinner |
761bbd3 |
index 4fc4a6814e..ff70718fc3 100644
|
|
|
d623e92 |
--- a/PC/python3.def
|
|
|
d623e92 |
+++ b/PC/python3.def
|
|
|
d623e92 |
@@ -224,6 +224,7 @@ EXPORTS
|
|
|
d623e92 |
PyExc_PermissionError=python36.PyExc_PermissionError DATA
|
|
|
d623e92 |
PyExc_ProcessLookupError=python36.PyExc_ProcessLookupError DATA
|
|
|
d623e92 |
PyExc_RecursionError=python36.PyExc_RecursionError DATA
|
|
|
d623e92 |
+ PyExc_RecursionErrorInst=python36.PyExc_RecursionErrorInst DATA
|
|
|
d623e92 |
PyExc_ReferenceError=python36.PyExc_ReferenceError DATA
|
|
|
d623e92 |
PyExc_ResourceWarning=python36.PyExc_ResourceWarning DATA
|
|
|
d623e92 |
PyExc_RuntimeError=python36.PyExc_RuntimeError DATA
|