]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-43541: Fix PyEval_EvalCodeEx() regression (GH-24918)
authorVictor Stinner <vstinner@python.org>
Thu, 18 Mar 2021 13:51:24 +0000 (14:51 +0100)
committerGitHub <noreply@github.com>
Thu, 18 Mar 2021 13:51:24 +0000 (14:51 +0100)
* Remove an assertion which required CO_NEWLOCALS and CO_OPTIMIZED
  code flags. It is ok to call this function on a code with these
  flags set.
* Fix reference counting on builtins: remove Py_DECREF().
  Fix regression introduced in the
  commit 46496f9d12582bf11f4911ad0f23315d6f277907.

Add also a comment to document that _PyEval_BuiltinsFromGlobals()
returns a borrowed reference.

Misc/NEWS.d/next/C API/2021-03-18-12-44-33.bpo-43541.ICigzd.rst [new file with mode: 0644]
Objects/frameobject.c
Objects/funcobject.c
Python/ceval.c

diff --git a/Misc/NEWS.d/next/C API/2021-03-18-12-44-33.bpo-43541.ICigzd.rst b/Misc/NEWS.d/next/C API/2021-03-18-12-44-33.bpo-43541.ICigzd.rst
new file mode 100644 (file)
index 0000000..0f5d938
--- /dev/null
@@ -0,0 +1,2 @@
+Fix a ``PyEval_EvalCodeEx()`` regression: fix reference counting on
+builtins. Patch by Victor Stinner.
index 056d42a0d9ebb45dfdc90df4d5c25fa634692f8d..a1413d79cc248771fc64c8b94e584a89898f86d1 100644 (file)
@@ -847,7 +847,7 @@ PyFrameObject*
 PyFrame_New(PyThreadState *tstate, PyCodeObject *code,
             PyObject *globals, PyObject *locals)
 {
-    PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
+    PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
     if (builtins == NULL) {
         return NULL;
     }
index 36df88a28100d06a2189903536b2a947737c55ea..45135a8c98a701190617bc7bbbc6bbd7b0d8eadc 100644 (file)
@@ -50,7 +50,7 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
     }
     Py_XINCREF(module);
 
-    builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
+    builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
     if (builtins == NULL) {
         goto error;
     }
index 7418b15176d2ae80151536dab661e43caa41d4a1..3a37017c000d4a87c058f355ce79e9b5fc17360b 100644 (file)
@@ -1127,7 +1127,7 @@ PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
     if (locals == NULL) {
         locals = globals;
     }
-    PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
+    PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
     if (builtins == NULL) {
         return NULL;
     }
@@ -5140,12 +5140,11 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
     if (defaults == NULL) {
         return NULL;
     }
-    PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
+    PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
     if (builtins == NULL) {
         Py_DECREF(defaults);
         return NULL;
     }
-    assert ((((PyCodeObject *)_co)->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == 0);
     if (locals == NULL) {
         locals = globals;
     }
@@ -5208,7 +5207,6 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
     }
 fail:
     Py_DECREF(defaults);
-    Py_DECREF(builtins);
     return res;
 }