Commit dcf08e0d authored by Fred Drake's avatar Fred Drake

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.
parent 83cb7973
...@@ -31,6 +31,7 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. ...@@ -31,6 +31,7 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#include "compile.h" #include "compile.h"
#include "opcode.h" #include "opcode.h"
#include "structmember.h" #include "structmember.h"
#include "osdefs.h" /* SEP */
#include <ctype.h> #include <ctype.h>
#ifdef HAVE_LIMITS_H #ifdef HAVE_LIMITS_H
...@@ -304,8 +305,7 @@ static void ...@@ -304,8 +305,7 @@ static void
com_error(struct compiling *c, PyObject *exc, char *msg) com_error(struct compiling *c, PyObject *exc, char *msg)
{ {
size_t n = strlen(msg); size_t n = strlen(msg);
PyObject *v; PyObject *v, *tb, *tmp;
char buffer[30];
char *s; char *s;
c->c_errors++; c->c_errors++;
if (c->c_lineno <= 1) { if (c->c_lineno <= 1) {
...@@ -313,15 +313,34 @@ com_error(struct compiling *c, PyObject *exc, char *msg) ...@@ -313,15 +313,34 @@ com_error(struct compiling *c, PyObject *exc, char *msg)
PyErr_SetString(exc, msg); PyErr_SetString(exc, msg);
return; return;
} }
sprintf(buffer, " (line %d)", c->c_lineno); v = PyString_FromString(msg);
v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
if (v == NULL) if (v == NULL)
return; /* MemoryError, too bad */ return; /* MemoryError, too bad */
s = PyString_AS_STRING((PyStringObject *)v);
strcpy(s, msg);
strcat(s, buffer);
PyErr_SetObject(exc, v); PyErr_SetObject(exc, v);
Py_DECREF(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);
} }
...@@ -2997,7 +3016,8 @@ com_arglist(struct compiling *c, node *n) ...@@ -2997,7 +3016,8 @@ com_arglist(struct compiling *c, node *n)
c->c_errors++; c->c_errors++;
} }
if (PyDict_GetItem(c->c_locals, nameval)) { 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); com_newlocal_o(c, nameval);
Py_DECREF(nameval); Py_DECREF(nameval);
......
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