From fc980e0be19776ee05dfc5380eb5d6a8092935cb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 18 Mar 2021 14:51:24 +0100 Subject: [PATCH] bpo-43541: Fix PyEval_EvalCodeEx() regression (GH-24918) * 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. --- .../next/C API/2021-03-18-12-44-33.bpo-43541.ICigzd.rst | 2 ++ Objects/frameobject.c | 2 +- Objects/funcobject.c | 2 +- Python/ceval.c | 6 ++---- 4 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2021-03-18-12-44-33.bpo-43541.ICigzd.rst 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 index 00000000000..0f5d9384942 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-03-18-12-44-33.bpo-43541.ICigzd.rst @@ -0,0 +1,2 @@ +Fix a ``PyEval_EvalCodeEx()`` regression: fix reference counting on +builtins. Patch by Victor Stinner. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 056d42a0d9e..a1413d79cc2 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -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; } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 36df88a2810..45135a8c98a 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -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; } diff --git a/Python/ceval.c b/Python/ceval.c index 7418b15176d..3a37017c000 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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; }