summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorTian Gao <gaogaotiantian@hotmail.com>2024-05-04 11:12:10 (GMT)
committerGitHub <noreply@github.com>2024-05-04 11:12:10 (GMT)
commitb034f14a4b6e9197d3926046721b8b4b4b4f5b3d (patch)
tree2d641189f3401526d264d13e5b855c576c29dc63 /Python
parent1ab6356ebec25f216a0eddbd81225abcb93f2d55 (diff)
downloadcpython-b034f14a4b6e9197d3926046721b8b4b4b4f5b3d.zip
cpython-b034f14a4b6e9197d3926046721b8b4b4b4f5b3d.tar.gz
cpython-b034f14a4b6e9197d3926046721b8b4b4b4f5b3d.tar.bz2
gh-74929: Implement PEP 667 (GH-115153)
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c48
-rw-r--r--Python/intrinsics.c7
-rw-r--r--Python/sysmodule.c8
3 files changed, 43 insertions, 20 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)
{
diff --git a/Python/intrinsics.c b/Python/intrinsics.c
index 5b10c3c..a6b2c10 100644
--- a/Python/intrinsics.c
+++ b/Python/intrinsics.c
@@ -123,18 +123,15 @@ static PyObject *
import_star(PyThreadState* tstate, PyObject *from)
{
_PyInterpreterFrame *frame = tstate->current_frame;
- if (_PyFrame_FastToLocalsWithError(frame) < 0) {
- return NULL;
- }
- PyObject *locals = frame->f_locals;
+ PyObject *locals = _PyFrame_GetLocals(frame);
if (locals == NULL) {
_PyErr_SetString(tstate, PyExc_SystemError,
"no locals found during 'import *'");
return NULL;
}
int err = import_all_from(tstate, locals, from);
- _PyFrame_LocalsToFast(frame, 0);
+ Py_DECREF(locals);
if (err < 0) {
return NULL;
}
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 645b76fc..bd7f821 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -1022,13 +1022,6 @@ static PyObject *
call_trampoline(PyThreadState *tstate, PyObject* callback,
PyFrameObject *frame, int what, PyObject *arg)
{
- /* Discard any previous modifications the frame's fast locals */
- if (frame->f_fast_as_locals) {
- if (PyFrame_FastToLocalsWithError(frame) < 0) {
- return NULL;
- }
- }
-
/* call the Python-level function */
if (arg == NULL) {
arg = Py_None;
@@ -1036,7 +1029,6 @@ call_trampoline(PyThreadState *tstate, PyObject* callback,
PyObject *args[3] = {(PyObject *)frame, whatstrings[what], arg};
PyObject *result = _PyObject_VectorcallTstate(tstate, callback, args, 3, NULL);
- PyFrame_LocalsToFast(frame, 1);
return result;
}