summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2000-01-12 22:45:54 (GMT)
committerGuido van Rossum <guido@python.org>2000-01-12 22:45:54 (GMT)
commita400d8a96d44904ed1bb57f5a15ca6ad10a8e091 (patch)
treebc2b89714273a95ae91166c239842a09d7bcb3ef /Python/ceval.c
parentb2b42ddcb1a09c58fdbd638c6fcdae5af13d7965 (diff)
downloadcpython-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.c33
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;
}