summaryrefslogtreecommitdiffstats
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
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).
-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;
}