diff options
author | Guido van Rossum <guido@python.org> | 2000-01-12 22:45:54 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2000-01-12 22:45:54 (GMT) |
commit | a400d8a96d44904ed1bb57f5a15ca6ad10a8e091 (patch) | |
tree | bc2b89714273a95ae91166c239842a09d7bcb3ef /Python/ceval.c | |
parent | b2b42ddcb1a09c58fdbd638c6fcdae5af13d7965 (diff) | |
download | cpython-a400d8a96d44904ed1bb57f5a15ca6ad10a8e091.zip cpython-a400d8a96d44904ed1bb57f5a15ca6ad10a8e091.tar.gz cpython-a400d8a96d44904ed1bb57f5a15ca6ad10a8e091.tar.bz2 |
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).
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 33 |
1 files 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; } |