diff options
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 20 |
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 * |