From a400d8a96d44904ed1bb57f5a15ca6ad10a8e091 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 12 Jan 2000 22:45:54 +0000 Subject: Fix a bug in exec_statement() noted incidentally by Tim Peters in PR#175 -- when exec is passed a code object, it didn't sync the locals from the dictionary back into their fast representation. Also took the time to remove some repetitive code there and to do the syncing even when an exception is raised (since a partial effect should still be synced). --- Python/ceval.c | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index 1770dc8..6463881 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2740,7 +2740,6 @@ exec_statement(f, prog, globals, locals) PyObject *globals; PyObject *locals; { - char *s; int n; PyObject *v; int plain = 0; @@ -2777,33 +2776,27 @@ exec_statement(f, prog, globals, locals) if (PyDict_GetItemString(globals, "__builtins__") == NULL) PyDict_SetItemString(globals, "__builtins__", f->f_builtins); if (PyCode_Check(prog)) { - v = PyEval_EvalCode((PyCodeObject *) prog, - globals, locals); - if (v == NULL) - return -1; - Py_DECREF(v); - return 0; + v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals); } - if (PyFile_Check(prog)) { + else if (PyFile_Check(prog)) { FILE *fp = PyFile_AsFile(prog); char *name = PyString_AsString(PyFile_Name(prog)); - if (PyRun_File(fp, name, Py_file_input, - globals, locals) == NULL) - return -1; - return 0; + v = PyRun_File(fp, name, Py_file_input, globals, locals); } - s = PyString_AsString(prog); - if ((int)strlen(s) != PyString_Size(prog)) { - PyErr_SetString(PyExc_ValueError, - "embedded '\\0' in exec string"); - return -1; + else { + char *s = PyString_AsString(prog); + if ((int)strlen(s) != PyString_Size(prog)) { + PyErr_SetString(PyExc_ValueError, + "embedded '\\0' in exec string"); + return -1; + } + v = PyRun_String(s, Py_file_input, globals, locals); } - v = PyRun_String(s, Py_file_input, globals, locals); + if (plain) + PyFrame_LocalsToFast(f, 0); if (v == NULL) return -1; Py_DECREF(v); - if (plain) - PyFrame_LocalsToFast(f, 0); return 0; } -- cgit v0.12