summaryrefslogtreecommitdiffstats
path: root/Python/compile.c
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2002-03-03 21:30:27 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2002-03-03 21:30:27 (GMT)
commitcfeb3b6ab8e213cb3551b101d0566d77f5b47409 (patch)
tree657521ff13e38d11dd10535827b4272af965b856 /Python/compile.c
parent290d31e2fc02a0d887da2c76fbe4e72377442a0a (diff)
downloadcpython-cfeb3b6ab8e213cb3551b101d0566d77f5b47409.zip
cpython-cfeb3b6ab8e213cb3551b101d0566d77f5b47409.tar.gz
cpython-cfeb3b6ab8e213cb3551b101d0566d77f5b47409.tar.bz2
Patch #50002: Display line information for bad \x escapes:
- recognize "SyntaxError"s by the print_file_and_line attribute. - add the syntaxerror attributes to all exceptions in compile.c. Fixes #221791
Diffstat (limited to 'Python/compile.c')
-rw-r--r--Python/compile.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/Python/compile.c b/Python/compile.c
index dbae00d..de0a8e2 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -465,14 +465,21 @@ com_error(struct compiling *c, PyObject *exc, char *msg)
Py_INCREF(Py_None);
line = Py_None;
}
- t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
- Py_None, line);
- if (t == NULL)
- goto exit;
- w = Py_BuildValue("(OO)", v, t);
- if (w == NULL)
- goto exit;
- PyErr_SetObject(exc, w);
+ if (exc == PyExc_SyntaxError) {
+ t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
+ Py_None, line);
+ if (t == NULL)
+ goto exit;
+ w = Py_BuildValue("(OO)", v, t);
+ if (w == NULL)
+ goto exit;
+ PyErr_SetObject(exc, w);
+ } else {
+ /* Make sure additional exceptions are printed with
+ file and line, also. */
+ PyErr_SetObject(exc, v);
+ PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
+ }
exit:
Py_XDECREF(t);
Py_XDECREF(v);
@@ -1153,7 +1160,8 @@ parsestr(struct compiling *com, char *s)
s++;
len = strlen(s);
if (len > INT_MAX) {
- PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
+ com_error(com, PyExc_OverflowError,
+ "string to parse is too long");
return NULL;
}
if (s[--len] != quote) {
@@ -1171,11 +1179,15 @@ parsestr(struct compiling *com, char *s)
#ifdef Py_USING_UNICODE
if (unicode || Py_UnicodeFlag) {
if (rawmode)
- return PyUnicode_DecodeRawUnicodeEscape(
- s, len, NULL);
+ v = PyUnicode_DecodeRawUnicodeEscape(
+ s, len, NULL);
else
- return PyUnicode_DecodeUnicodeEscape(
+ v = PyUnicode_DecodeUnicodeEscape(
s, len, NULL);
+ if (v == NULL)
+ PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
+ return v;
+
}
#endif
if (rawmode || strchr(s, '\\') == NULL)
@@ -1238,9 +1250,9 @@ parsestr(struct compiling *com, char *s)
*p++ = x;
break;
}
- PyErr_SetString(PyExc_ValueError,
- "invalid \\x escape");
Py_DECREF(v);
+ com_error(com, PyExc_ValueError,
+ "invalid \\x escape");
return NULL;
default:
*p++ = '\\';