Blame 00292-restore-PyExc_RecursionErrorInst-symbol.patch

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