diff options
| author | Fred Drake <fdrake@acm.org> | 2000-08-15 15:49:44 +0000 | 
|---|---|---|
| committer | Fred Drake <fdrake@acm.org> | 2000-08-15 15:49:44 +0000 | 
| commit | dcf08e0dfe1a0c7886c59cb19b5d7cd50732cacc (patch) | |
| tree | a6a84bebbd7295de4d633f607f615031d0676d37 /Python/compile.c | |
| parent | 83cb7973802441f1f6c7115bc8eb83d64534b853 (diff) | |
| download | cpython-git-dcf08e0dfe1a0c7886c59cb19b5d7cd50732cacc.tar.gz | |
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.
Diffstat (limited to 'Python/compile.c')
| -rw-r--r-- | Python/compile.c | 38 | 
1 files changed, 29 insertions, 9 deletions
diff --git a/Python/compile.c b/Python/compile.c index 476f1f20bf..045f966e7f 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);  | 
