aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python
diff options
context:
space:
mode:
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 3626ffbd02f..0d02a9887be 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 5b10c3ce7d5..a6b2c108b67 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 645b76fccf6..bd7f821931d 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;
}