Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 22120:b2a2cc0c2a63 legacy-trunk
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
| author | Martin v. Löwis <martin@v.loewis.de> |
|---|---|
| date | Sun, 03 Mar 2002 21:30:27 +0000 |
| parents | c1d55a627897 |
| children | 3e892582a850 |
line wrap: on
line diff
--- a/Python/compile.c Sun Mar 03 15:12:58 2002 +0000 +++ b/Python/compile.c Sun Mar 03 21:30:27 2002 +0000 @@ -465,14 +465,21 @@ 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 @@ 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 @@ #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 @@ *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++ = '\\';
