summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 252833a..6236c66 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3110,15 +3110,14 @@ _PyEval_GetANext(PyObject *aiter)
return awaitable;
}
-PyObject *
-_PyEval_LoadGlobal(PyObject *globals, PyObject *builtins, PyObject *name)
+void
+_PyEval_LoadGlobalStackRef(PyObject *globals, PyObject *builtins, PyObject *name, _PyStackRef *writeto)
{
- PyObject *res;
if (PyDict_CheckExact(globals) && PyDict_CheckExact(builtins)) {
- res = _PyDict_LoadGlobal((PyDictObject *)globals,
+ _PyDict_LoadGlobalStackRef((PyDictObject *)globals,
(PyDictObject *)builtins,
- name);
- if (res == NULL && !PyErr_Occurred()) {
+ name, writeto);
+ if (PyStackRef_IsNull(*writeto) && !PyErr_Occurred()) {
/* _PyDict_LoadGlobal() returns NULL without raising
* an exception if the key doesn't exist */
_PyEval_FormatExcCheckArg(PyThreadState_GET(), PyExc_NameError,
@@ -3128,13 +3127,16 @@ _PyEval_LoadGlobal(PyObject *globals, PyObject *builtins, PyObject *name)
else {
/* Slow-path if globals or builtins is not a dict */
/* namespace 1: globals */
+ PyObject *res;
if (PyMapping_GetOptionalItem(globals, name, &res) < 0) {
- return NULL;
+ *writeto = PyStackRef_NULL;
+ return;
}
if (res == NULL) {
/* namespace 2: builtins */
if (PyMapping_GetOptionalItem(builtins, name, &res) < 0) {
- return NULL;
+ *writeto = PyStackRef_NULL;
+ return;
}
if (res == NULL) {
_PyEval_FormatExcCheckArg(
@@ -3142,8 +3144,8 @@ _PyEval_LoadGlobal(PyObject *globals, PyObject *builtins, PyObject *name)
NAME_ERROR_MSG, name);
}
}
+ *writeto = PyStackRef_FromPyObjectSteal(res);
}
- return res;
}
PyObject *