summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
Diffstat (limited to 'Objects')
-rw-r--r--Objects/frameobject.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 5c6a8bc..13dfbf6 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -840,6 +840,7 @@ _PyFrame_New_NoTrack(PyCodeObject *code)
f->f_trace = NULL;
f->f_trace_lines = 1;
f->f_trace_opcodes = 0;
+ f->f_fast_as_locals = 0;
f->f_lineno = 0;
return f;
}
@@ -1004,7 +1005,11 @@ PyFrame_FastToLocalsWithError(PyFrameObject *f)
PyErr_BadInternalCall();
return -1;
}
- return _PyFrame_FastToLocalsWithError(f->f_frame);
+ int err = _PyFrame_FastToLocalsWithError(f->f_frame);
+ if (err == 0) {
+ f->f_fast_as_locals = 1;
+ }
+ return err;
}
void
@@ -1028,8 +1033,9 @@ _PyFrame_LocalsToFast(_PyInterpreterFrame *frame, int clear)
PyObject *error_type, *error_value, *error_traceback;
PyCodeObject *co;
locals = frame->f_locals;
- if (locals == NULL)
+ if (locals == NULL) {
return;
+ }
fast = _PyFrame_GetLocalsArray(frame);
co = frame->f_code;
@@ -1088,13 +1094,12 @@ _PyFrame_LocalsToFast(_PyInterpreterFrame *frame, int clear)
void
PyFrame_LocalsToFast(PyFrameObject *f, int clear)
{
- if (f == NULL || _PyFrame_GetState(f) == FRAME_CLEARED) {
- return;
+ if (f && f->f_fast_as_locals && _PyFrame_GetState(f) != FRAME_CLEARED) {
+ _PyFrame_LocalsToFast(f->f_frame, clear);
+ f->f_fast_as_locals = 0;
}
- _PyFrame_LocalsToFast(f->f_frame, clear);
}
-
PyCodeObject *
PyFrame_GetCode(PyFrameObject *frame)
{
@@ -1119,6 +1124,12 @@ PyFrame_GetBack(PyFrameObject *frame)
}
PyObject*
+PyFrame_GetLocals(PyFrameObject *frame)
+{
+ return frame_getlocals(frame, NULL);
+}
+
+PyObject*
_PyEval_BuiltinsFromGlobals(PyThreadState *tstate, PyObject *globals)
{
PyObject *builtins = PyDict_GetItemWithError(globals, &_Py_ID(__builtins__));