|
1 | 1 | #include "Python.h" |
2 | 2 | #include "errcode.h" |
| 3 | +#include "pycore_runtime.h" // _Py_ID() |
3 | 4 | #include "pycore_token.h" |
| 5 | +#include "pycore_tuple.h" // _PyTuple_FromPair |
4 | 6 |
|
5 | 7 | #include "../pegen.h" |
6 | 8 | #include "../lexer/state.h" |
@@ -150,6 +152,53 @@ _PyTokenizer_warn_invalid_escape_sequence(struct tok_state *tok, int first_inval |
150 | 152 | return 0; |
151 | 153 | } |
152 | 154 |
|
| 155 | +void |
| 156 | +_PyTokenizer_init_error(PyObject *filename) |
| 157 | +{ |
| 158 | + if (!(PyErr_ExceptionMatches(PyExc_LookupError) |
| 159 | + || PyErr_ExceptionMatches(PyExc_SyntaxError) |
| 160 | + || PyErr_ExceptionMatches(PyExc_ValueError) |
| 161 | + || PyErr_ExceptionMatches(PyExc_UnicodeDecodeError))) { |
| 162 | + return; |
| 163 | + } |
| 164 | + PyObject *errstr = NULL; |
| 165 | + PyObject *tuple = NULL; |
| 166 | + PyObject *type; |
| 167 | + PyObject *value; |
| 168 | + PyObject *tback; |
| 169 | + PyErr_Fetch(&type, &value, &tback); |
| 170 | + if (PyErr_GivenExceptionMatches(value, PyExc_SyntaxError)) { |
| 171 | + if (PyObject_SetAttr(value, &_Py_ID(filename), filename)) { |
| 172 | + goto error; |
| 173 | + } |
| 174 | + PyErr_Restore(type, value, tback); |
| 175 | + return; |
| 176 | + } |
| 177 | + errstr = PyObject_Str(value); |
| 178 | + if (!errstr) { |
| 179 | + goto error; |
| 180 | + } |
| 181 | + |
| 182 | + PyObject *tmp = Py_BuildValue("(OiiO)", filename, 0, -1, Py_None); |
| 183 | + if (!tmp) { |
| 184 | + goto error; |
| 185 | + } |
| 186 | + |
| 187 | + tuple = _PyTuple_FromPair(errstr, tmp); |
| 188 | + Py_DECREF(tmp); |
| 189 | + if (!tuple) { |
| 190 | + goto error; |
| 191 | + } |
| 192 | + PyErr_SetObject(PyExc_SyntaxError, tuple); |
| 193 | + |
| 194 | +error: |
| 195 | + Py_XDECREF(type); |
| 196 | + Py_XDECREF(value); |
| 197 | + Py_XDECREF(tback); |
| 198 | + Py_XDECREF(errstr); |
| 199 | + Py_XDECREF(tuple); |
| 200 | +} |
| 201 | + |
153 | 202 | int |
154 | 203 | _PyTokenizer_parser_warn(struct tok_state *tok, PyObject *category, const char *format, ...) |
155 | 204 | { |
@@ -420,7 +469,10 @@ _PyTokenizer_check_coding_spec(const char* line, Py_ssize_t size, struct tok_sta |
420 | 469 | assert(tok->decoding_readline == NULL); |
421 | 470 | if (strcmp(cs, "utf-8") != 0 && !set_readline(tok, cs)) { |
422 | 471 | _PyTokenizer_error_ret(tok); |
423 | | - _PyPegen_raise_tokenizer_init_error(tok->filename); |
| 472 | + if (!PyErr_Occurred()) { |
| 473 | + PyErr_Format(PyExc_SyntaxError, "encoding problem: %s", cs); |
| 474 | + } |
| 475 | + _PyTokenizer_init_error(tok->filename); |
424 | 476 | PyMem_Free(cs); |
425 | 477 | return 0; |
426 | 478 | } |
|
0 commit comments