diff options
author | Tian Gao <gaogaotiantian@hotmail.com> | 2024-05-04 11:12:10 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-04 11:12:10 (GMT) |
commit | b034f14a4b6e9197d3926046721b8b4b4b4f5b3d (patch) | |
tree | 2d641189f3401526d264d13e5b855c576c29dc63 /Python/ceval.c | |
parent | 1ab6356ebec25f216a0eddbd81225abcb93f2d55 (diff) | |
download | cpython-b034f14a4b6e9197d3926046721b8b4b4b4f5b3d.zip cpython-b034f14a4b6e9197d3926046721b8b4b4b4f5b3d.tar.gz cpython-b034f14a4b6e9197d3926046721b8b4b4b4f5b3d.tar.bz2 |
gh-74929: Implement PEP 667 (GH-115153)
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 3626ffb..0d02a98 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2475,12 +2475,7 @@ PyEval_GetLocals(void) return NULL; } - if (_PyFrame_FastToLocalsWithError(current_frame) < 0) { - return NULL; - } - - PyObject *locals = current_frame->f_locals; - assert(locals != NULL); + PyObject *locals = _PyEval_GetFrameLocals(); return locals; } @@ -2494,7 +2489,24 @@ _PyEval_GetFrameLocals(void) return NULL; } - return _PyFrame_GetLocals(current_frame, 1); + PyObject *locals = _PyFrame_GetLocals(current_frame); + if (locals == NULL) { + return NULL; + } + + if (PyFrameLocalsProxy_Check(locals)) { + PyObject* ret = PyDict_New(); + if (PyDict_Update(ret, locals)) { + Py_DECREF(ret); + return NULL; + } + Py_DECREF(locals); + return ret; + } else if (PyMapping_Check(locals)) { + return locals; + } + + return NULL; } PyObject * @@ -2508,6 +2520,28 @@ PyEval_GetGlobals(void) return current_frame->f_globals; } +PyObject* +PyEval_GetFrameLocals(void) +{ + return _PyEval_GetFrameLocals(); +} + +PyObject* PyEval_GetFrameGlobals(void) +{ + PyThreadState *tstate = _PyThreadState_GET(); + _PyInterpreterFrame *current_frame = _PyThreadState_GetFrame(tstate); + if (current_frame == NULL) { + return NULL; + } + return Py_XNewRef(current_frame->f_globals); +} + +PyObject* PyEval_GetFrameBuiltins(void) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return Py_XNewRef(_PyEval_GetBuiltins(tstate)); +} + int PyEval_MergeCompilerFlags(PyCompilerFlags *cf) { |