summaryrefslogtreecommitdiffstats
path: root/Objects/funcobject.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2021-02-20 14:17:18 (GMT)
committerGitHub <noreply@github.com>2021-02-20 14:17:18 (GMT)
commit46496f9d12582bf11f4911ad0f23315d6f277907 (patch)
tree8382b24a5036df07fe75c59f0a45cd401d84b17a /Objects/funcobject.c
parent4233ff3ee4add287b3617f38943d01a7a6f4d7c4 (diff)
downloadcpython-46496f9d12582bf11f4911ad0f23315d6f277907.zip
cpython-46496f9d12582bf11f4911ad0f23315d6f277907.tar.gz
cpython-46496f9d12582bf11f4911ad0f23315d6f277907.tar.bz2
bpo-42990: Functions inherit current builtins (GH-24564)
The types.FunctionType constructor now inherits the current builtins if the globals dictionary has no "__builtins__" key, rather than using {"None": None} as builtins: same behavior as eval() and exec() functions. Defining a function with "def function(...): ..." in Python is not affected, globals cannot be overriden with this syntax: it also inherits the current builtins. PyFrame_New(), PyEval_EvalCode(), PyEval_EvalCodeEx(), PyFunction_New() and PyFunction_NewWithQualName() now inherits the current builtins namespace if the globals dictionary has no "__builtins__" key. * Add _PyEval_GetBuiltins() function. * _PyEval_BuiltinsFromGlobals() now uses _PyEval_GetBuiltins() if builtins cannot be found in globals. * Add tstate parameter to _PyEval_BuiltinsFromGlobals().
Diffstat (limited to 'Objects/funcobject.c')
-rw-r--r--Objects/funcobject.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index 4b92f6c..36df88a 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -4,6 +4,7 @@
#include "Python.h"
#include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals()
#include "pycore_object.h" // _PyObject_GC_UNTRACK()
+#include "pycore_pyerrors.h" // _PyErr_Occurred()
#include "structmember.h" // PyMemberDef
PyObject *
@@ -13,6 +14,8 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
assert(PyDict_Check(globals));
Py_INCREF(globals);
+ PyThreadState *tstate = _PyThreadState_GET();
+
PyCodeObject *code_obj = (PyCodeObject *)code;
Py_INCREF(code_obj);
@@ -42,15 +45,16 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
_Py_IDENTIFIER(__name__);
PyObject *module = _PyDict_GetItemIdWithError(globals, &PyId___name__);
PyObject *builtins = NULL;
- if (module == NULL && PyErr_Occurred()) {
+ if (module == NULL && _PyErr_Occurred(tstate)) {
goto error;
}
Py_XINCREF(module);
- builtins = _PyEval_BuiltinsFromGlobals(globals);
+ builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
if (builtins == NULL) {
goto error;
}
+ Py_INCREF(builtins);
PyFunctionObject *op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type);
if (op == NULL) {