diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2002-03-03 21:30:27 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2002-03-03 21:30:27 (GMT) |
commit | cfeb3b6ab8e213cb3551b101d0566d77f5b47409 (patch) | |
tree | 657521ff13e38d11dd10535827b4272af965b856 /Python/compile.c | |
parent | 290d31e2fc02a0d887da2c76fbe4e72377442a0a (diff) | |
download | cpython-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.c | 40 |
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++ = '\\'; |