Issue #18408: Add a new PyFrame_FastToLocalsWithError() function to handle

exceptions when merging fast locals into f_locals of a frame.
PyEval_GetLocals() now raises an exception and return NULL on failure.
This commit is contained in:
Victor Stinner 2013-10-29 01:19:37 +01:00
parent 28c63f7ffb
commit 41bb43a71e
7 changed files with 87 additions and 46 deletions

View file

@ -2472,7 +2472,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
TARGET(IMPORT_STAR) {
PyObject *from = POP(), *locals;
int err;
PyFrame_FastToLocals(f);
if (PyFrame_FastToLocalsWithError(f) < 0)
goto error;
locals = f->f_locals;
if (locals == NULL) {
PyErr_SetString(PyExc_SystemError,
@ -4005,9 +4007,15 @@ PyObject *
PyEval_GetLocals(void)
{
PyFrameObject *current_frame = PyEval_GetFrame();
if (current_frame == NULL)
if (current_frame == NULL) {
PyErr_SetString(PyExc_SystemError, "frame does not exist");
return NULL;
PyFrame_FastToLocals(current_frame);
}
if (PyFrame_FastToLocalsWithError(current_frame) < 0)
return NULL;
assert(current_frame->f_locals != NULL);
return current_frame->f_locals;
}
@ -4017,8 +4025,9 @@ PyEval_GetGlobals(void)
PyFrameObject *current_frame = PyEval_GetFrame();
if (current_frame == NULL)
return NULL;
else
return current_frame->f_globals;
assert(current_frame->f_globals != NULL);
return current_frame->f_globals;
}
PyFrameObject *