summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2000-08-15 15:49:44 (GMT)
committerFred Drake <fdrake@acm.org>2000-08-15 15:49:44 (GMT)
commitdcf08e0dfe1a0c7886c59cb19b5d7cd50732cacc (patch)
treea6a84bebbd7295de4d633f607f615031d0676d37
parent83cb7973802441f1f6c7115bc8eb83d64534b853 (diff)
downloadcpython-dcf08e0dfe1a0c7886c59cb19b5d7cd50732cacc.zip
cpython-dcf08e0dfe1a0c7886c59cb19b5d7cd50732cacc.tar.gz
cpython-dcf08e0dfe1a0c7886c59cb19b5d7cd50732cacc.tar.bz2
When raising a SyntaxError, make a best-effort attempt to set the
filename and lineno attributes, but do not mask the SyntaxError if we fail. This is part of what is needed to close SoruceForge bug #110628 (Jitterbug PR#278). Wrap a long line to fit in under 80 columns.
-rw-r--r--Python/compile.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/Python/compile.c b/Python/compile.c
index 476f1f2..045f966 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -31,6 +31,7 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#include "compile.h"
#include "opcode.h"
#include "structmember.h"
+#include "osdefs.h" /* SEP */
#include <ctype.h>
#ifdef HAVE_LIMITS_H
@@ -304,8 +305,7 @@ static void
com_error(struct compiling *c, PyObject *exc, char *msg)
{
size_t n = strlen(msg);
- PyObject *v;
- char buffer[30];
+ PyObject *v, *tb, *tmp;
char *s;
c->c_errors++;
if (c->c_lineno <= 1) {
@@ -313,15 +313,34 @@ com_error(struct compiling *c, PyObject *exc, char *msg)
PyErr_SetString(exc, msg);
return;
}
- sprintf(buffer, " (line %d)", c->c_lineno);
- v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
+ v = PyString_FromString(msg);
if (v == NULL)
return; /* MemoryError, too bad */
- s = PyString_AS_STRING((PyStringObject *)v);
- strcpy(s, msg);
- strcat(s, buffer);
PyErr_SetObject(exc, v);
Py_DECREF(v);
+
+ /* add attributes for the line number and filename for the error */
+ PyErr_Fetch(&exc, &v, &tb);
+ PyErr_NormalizeException(&exc, &v, &tb);
+ tmp = PyInt_FromLong(c->c_lineno);
+ if (tmp == NULL)
+ PyErr_Clear();
+ else {
+ if (PyObject_SetAttrString(v, "lineno", tmp))
+ PyErr_Clear();
+ Py_DECREF(tmp);
+ }
+ if (c->c_filename != NULL) {
+ tmp = PyString_FromString(c->c_filename);
+ if (tmp == NULL)
+ PyErr_Clear();
+ else {
+ if (PyObject_SetAttrString(v, "filename", tmp))
+ PyErr_Clear();
+ Py_DECREF(tmp);
+ }
+ }
+ PyErr_Restore(exc, v, tb);
}
@@ -1178,7 +1197,7 @@ com_argument(struct compiling *c, node *n, PyObject **pkeywords)
if (NCH(n) == 1) {
if (*pkeywords != NULL) {
com_error(c, PyExc_SyntaxError,
- "non-keyword arg after keyword arg");
+ "non-keyword arg after keyword arg");
}
else {
com_node(c, CHILD(n, 0));
@@ -2997,7 +3016,8 @@ com_arglist(struct compiling *c, node *n)
c->c_errors++;
}
if (PyDict_GetItem(c->c_locals, nameval)) {
- com_error(c, PyExc_SyntaxError,"duplicate argument in function definition");
+ com_error(c, PyExc_SyntaxError,
+ "duplicate argument in function definition");
}
com_newlocal_o(c, nameval);
Py_DECREF(nameval);