diff Python/ceval.c @ 11651:d88996e46cb2 legacy-trunk

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).
author Guido van Rossum <guido@python.org>
date Wed, 12 Jan 2000 22:45:54 +0000
parents 1855131a4dcd
children 594a76bb9ff0
line wrap: on
line diff
--- a/Python/ceval.c	Wed Jan 12 16:38:20 2000 +0000
+++ b/Python/ceval.c	Wed Jan 12 22:45:54 2000 +0000
@@ -2740,7 +2740,6 @@
 	PyObject *globals;
 	PyObject *locals;
 {
-	char *s;
 	int n;
 	PyObject *v;
 	int plain = 0;
@@ -2777,33 +2776,27 @@
 	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;
 }