summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2000-08-15 15:46:16 (GMT)
committerFred Drake <fdrake@acm.org>2000-08-15 15:46:16 (GMT)
commit1aba5770939c497c707eecd167856f98c9bb74c0 (patch)
treec07dd5e61ba899eb006934e12c7b1797fbc58736
parentf40ff1b8b23671818702aeff2c17a409588dff0b (diff)
downloadcpython-1aba5770939c497c707eecd167856f98c9bb74c0.zip
cpython-1aba5770939c497c707eecd167856f98c9bb74c0.tar.gz
cpython-1aba5770939c497c707eecd167856f98c9bb74c0.tar.bz2
SyntaxError__str__(): Do more formatting of the exception here, rather
than depending on the site that raises the exception. If the filename and lineno attributes are set on the exception object, use them to augment the message displayed. This is part of what is needed to close SoruceForge bug #110628 (Jitterbug PR#278).
-rw-r--r--Python/exceptions.c61
1 files changed, 55 insertions, 6 deletions
diff --git a/Python/exceptions.c b/Python/exceptions.c
index 1d7fac4..4d27979 100644
--- a/Python/exceptions.c
+++ b/Python/exceptions.c
@@ -244,7 +244,7 @@ Exception__str__(PyObject *self, PyObject *args)
{
PyObject *out;
- if (!PyArg_ParseTuple(args, "O", &self))
+ if (!PyArg_ParseTuple(args, "O:__str__", &self))
return NULL;
args = PyObject_GetAttrString(self, "args");
@@ -282,7 +282,7 @@ Exception__getitem__(PyObject *self, PyObject *args)
PyObject *out;
PyObject *index;
- if (!PyArg_ParseTuple(args, "OO", &self, &index))
+ if (!PyArg_ParseTuple(args, "OO:__getitem__", &self, &index))
return NULL;
args = PyObject_GetAttrString(self, "args");
@@ -524,7 +524,7 @@ EnvironmentError__str__(PyObject *self, PyObject *args)
PyObject *strerror;
PyObject *rtnval = NULL;
- if (!PyArg_ParseTuple(args, "O", &self))
+ if (!PyArg_ParseTuple(args, "O:__str__", &self))
return NULL;
filename = PyObject_GetAttrString(self, "filename");
@@ -734,16 +734,65 @@ SyntaxError__str__(PyObject *self, PyObject *args)
{
PyObject *msg;
PyObject *str;
+ PyObject *filename, *lineno, *result;
- if (!PyArg_ParseTuple(args, "O", &self))
+ if (!PyArg_ParseTuple(args, "O:__str__", &self))
return NULL;
if (!(msg = PyObject_GetAttrString(self, "msg")))
return NULL;
-
+
str = PyObject_Str(msg);
Py_DECREF(msg);
- return str;
+ result = str;
+
+ /* XXX -- do all the additional formatting with filename and
+ lineno here */
+
+ if (PyString_Check(str)) {
+ int have_filename = 0;
+ int have_lineno = 0;
+ char *buffer = NULL;
+
+ if (filename = PyObject_GetAttrString(self, "filename"))
+ have_filename = PyString_Check(filename);
+ else
+ PyErr_Clear();
+ if (lineno = PyObject_GetAttrString(self, "lineno"))
+ have_lineno = PyInt_Check(lineno);
+ else
+ PyErr_Clear();
+
+ if (have_filename || have_lineno) {
+ int bufsize = (PyString_GET_SIZE(str) + 64 +
+ PyString_GET_SIZE(filename));
+
+ buffer = PyMem_Malloc(bufsize);
+ if (buffer != NULL) {
+ if (have_filename && have_lineno)
+ sprintf(buffer, "%s (%s, line %d)",
+ PyString_AS_STRING(str),
+ PyString_AS_STRING(filename),
+ PyInt_AsLong(lineno));
+ else if (have_filename)
+ sprintf(buffer, "%s (%s)",
+ PyString_AS_STRING(str),
+ PyString_AS_STRING(filename));
+ else if (have_lineno)
+ sprintf(buffer, "%s (line %d)",
+ PyString_AS_STRING(str),
+ PyInt_AsLong(lineno));
+ result = PyString_FromString(buffer);
+ if (result == NULL)
+ result = str;
+ else
+ Py_DECREF(str);
+ }
+ }
+ Py_XDECREF(filename);
+ Py_XDECREF(lineno);
+ }
+ return result;
}