summaryrefslogtreecommitdiff
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2000-01-12 22:45:54 +0000
committerGuido van Rossum <guido@python.org>2000-01-12 22:45:54 +0000
commita400d8a96d44904ed1bb57f5a15ca6ad10a8e091 (patch)
treebc2b89714273a95ae91166c239842a09d7bcb3ef /Python/ceval.c
parentb2b42ddcb1a09c58fdbd638c6fcdae5af13d7965 (diff)
downloadcpython-git-a400d8a96d44904ed1bb57f5a15ca6ad10a8e091.tar.gz
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 1770dc8551..646388106f 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;
}