]> granicus.if.org Git - python/commitdiff
Fix a bug in exec_statement() noted incidentally by Tim Peters in
authorGuido van Rossum <guido@python.org>
Wed, 12 Jan 2000 22:45:54 +0000 (22:45 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 12 Jan 2000 22:45:54 +0000 (22:45 +0000)
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

index 1770dc8551cee47180e2080052861297a145def8..646388106f70eca8322afda591cd60a485a6940b 100644 (file)
@@ -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;
 }