Commit 2cabc562 authored by Georg Brandl's avatar Georg Brandl

#3706: fix error message for wrong exec() argument type. R=Guido.

parent 9edd2bd3
...@@ -495,7 +495,7 @@ Return negative if x<y, zero if x==y, positive if x>y."); ...@@ -495,7 +495,7 @@ Return negative if x<y, zero if x==y, positive if x>y.");
static char * static char *
source_as_string(PyObject *cmd) source_as_string(PyObject *cmd, char *funcname, char *what)
{ {
char *str; char *str;
Py_ssize_t size; Py_ssize_t size;
...@@ -506,8 +506,9 @@ source_as_string(PyObject *cmd) ...@@ -506,8 +506,9 @@ source_as_string(PyObject *cmd)
return NULL; return NULL;
} }
else if (!PyObject_CheckReadBuffer(cmd)) { else if (!PyObject_CheckReadBuffer(cmd)) {
PyErr_SetString(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"eval()/exec() arg 1 must be a string, bytes or code object"); "%s() arg 1 must be a %s object",
funcname, what);
return NULL; return NULL;
} }
if (PyObject_AsReadBuffer(cmd, (const void **)&str, &size) < 0) { if (PyObject_AsReadBuffer(cmd, (const void **)&str, &size) < 0) {
...@@ -591,7 +592,7 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds) ...@@ -591,7 +592,7 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
return result; return result;
} }
str = source_as_string(cmd); str = source_as_string(cmd, "compile", "string, bytes, AST or code");
if (str == NULL) if (str == NULL)
return NULL; return NULL;
...@@ -703,7 +704,7 @@ builtin_eval(PyObject *self, PyObject *args) ...@@ -703,7 +704,7 @@ builtin_eval(PyObject *self, PyObject *args)
return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals); return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
} }
str = source_as_string(cmd); str = source_as_string(cmd, "eval", "string, bytes or code");
if (str == NULL) if (str == NULL)
return NULL; return NULL;
...@@ -751,13 +752,7 @@ builtin_exec(PyObject *self, PyObject *args) ...@@ -751,13 +752,7 @@ builtin_exec(PyObject *self, PyObject *args)
} }
else if (locals == Py_None) else if (locals == Py_None)
locals = globals; locals = globals;
if (!PyUnicode_Check(prog) &&
!PyCode_Check(prog)) {
PyErr_Format(PyExc_TypeError,
"exec() arg 1 must be a string, file, or code "
"object, not %.100s", prog->ob_type->tp_name);
return NULL;
}
if (!PyDict_Check(globals)) { if (!PyDict_Check(globals)) {
PyErr_Format(PyExc_TypeError, "exec() arg 2 must be a dict, not %.100s", PyErr_Format(PyExc_TypeError, "exec() arg 2 must be a dict, not %.100s",
globals->ob_type->tp_name); globals->ob_type->tp_name);
...@@ -785,7 +780,8 @@ builtin_exec(PyObject *self, PyObject *args) ...@@ -785,7 +780,8 @@ builtin_exec(PyObject *self, PyObject *args)
v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals); v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
} }
else { else {
char *str = source_as_string(prog); char *str = source_as_string(prog, "exec",
"string, bytes or code");
PyCompilerFlags cf; PyCompilerFlags cf;
if (str == NULL) if (str == NULL)
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment