diff Python/bltinmodule.c @ 32463:d4a59230e93a legacy-trunk

SF Bug #215126: Over restricted type checking on eval() function The builtin eval() function now accepts any mapping for the locals argument. Time sensitive steps guarded by PyDict_CheckExact() to keep from slowing down the normal case. My timings so no measurable impact.
author Raymond Hettinger <python@rcn.com>
date Fri, 02 Jul 2004 06:41:07 +0000
parents 81117923ae8f
children 682f74088602
line wrap: on
line diff
--- a/Python/bltinmodule.c	Fri Jul 02 02:14:34 2004 +0000
+++ b/Python/bltinmodule.c	Fri Jul 02 06:41:07 2004 +0000
@@ -455,11 +455,17 @@
 	char *str;
 	PyCompilerFlags cf;
 
-	if (!PyArg_ParseTuple(args, "O|O!O!:eval",
-			&cmd,
-			&PyDict_Type, &globals,
-			&PyDict_Type, &locals))
+	if (!PyArg_UnpackTuple(args, "eval", 1, 3, &cmd, &globals, &locals))
 		return NULL;
+	if (locals != Py_None && !PyMapping_Check(locals)) {
+		PyErr_SetString(PyExc_TypeError, "locals must be a mapping");
+			return NULL;
+	}
+	if (globals != Py_None && !PyDict_Check(globals)) {
+		PyErr_SetString(PyExc_TypeError, PyMapping_Check(globals) ? 
+			"globals must be a real dict; try eval(expr, {}, mapping)"
+			: "globals must be a dict");
+	}
 	if (globals == Py_None) {
 		globals = PyEval_GetGlobals();
 		if (locals == Py_None)
@@ -517,8 +523,9 @@
 Evaluate the source in the context of globals and locals.\n\
 The source may be a string representing a Python expression\n\
 or a code object as returned by compile().\n\
-The globals and locals are dictionaries, defaulting to the current\n\
-globals and locals.  If only globals is given, locals defaults to it.");
+The globals must be a dictionary and locals can be any mappping,\n\
+defaulting to the current globals and locals.\n\
+If only globals is given, locals defaults to it.\n");
 
 
 static PyObject *