mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
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 46496f9d12
.
Add also a comment to document that _PyEval_BuiltinsFromGlobals()
returns a borrowed reference.
This commit is contained in:
parent
6af528b4ab
commit
fc980e0be1
4 changed files with 6 additions and 6 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
Fix a ``PyEval_EvalCodeEx()`` regression: fix reference counting on
|
||||||
|
builtins. Patch by Victor Stinner.
|
|
@ -847,7 +847,7 @@ PyFrameObject*
|
||||||
PyFrame_New(PyThreadState *tstate, PyCodeObject *code,
|
PyFrame_New(PyThreadState *tstate, PyCodeObject *code,
|
||||||
PyObject *globals, PyObject *locals)
|
PyObject *globals, PyObject *locals)
|
||||||
{
|
{
|
||||||
PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
|
PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
|
||||||
if (builtins == NULL) {
|
if (builtins == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
|
||||||
}
|
}
|
||||||
Py_XINCREF(module);
|
Py_XINCREF(module);
|
||||||
|
|
||||||
builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
|
builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
|
||||||
if (builtins == NULL) {
|
if (builtins == NULL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1127,7 +1127,7 @@ PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
|
||||||
if (locals == NULL) {
|
if (locals == NULL) {
|
||||||
locals = globals;
|
locals = globals;
|
||||||
}
|
}
|
||||||
PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
|
PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
|
||||||
if (builtins == NULL) {
|
if (builtins == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -5140,12 +5140,11 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
|
||||||
if (defaults == NULL) {
|
if (defaults == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
|
PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
|
||||||
if (builtins == NULL) {
|
if (builtins == NULL) {
|
||||||
Py_DECREF(defaults);
|
Py_DECREF(defaults);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
assert ((((PyCodeObject *)_co)->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == 0);
|
|
||||||
if (locals == NULL) {
|
if (locals == NULL) {
|
||||||
locals = globals;
|
locals = globals;
|
||||||
}
|
}
|
||||||
|
@ -5208,7 +5207,6 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
|
||||||
}
|
}
|
||||||
fail:
|
fail:
|
||||||
Py_DECREF(defaults);
|
Py_DECREF(defaults);
|
||||||
Py_DECREF(builtins);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue