gh-121804: always show error location for SyntaxError's in basic repl (#123202)

This commit is contained in:
Sergey B Kirpichev 2024-09-03 15:37:29 +03:00 committed by GitHub
parent ef9d54703f
commit 6822cb23c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 46 additions and 0 deletions

View file

@ -280,11 +280,42 @@ PyRun_InteractiveOneObjectEx(FILE *fp, PyObject *filename,
PyObject *main_dict = PyModule_GetDict(main_module); // borrowed ref
PyObject *res = run_mod(mod, filename, main_dict, main_dict, flags, arena, interactive_src, 1);
Py_INCREF(interactive_src);
_PyArena_Free(arena);
Py_DECREF(main_module);
if (res == NULL) {
PyThreadState *tstate = _PyThreadState_GET();
PyObject *exc = _PyErr_GetRaisedException(tstate);
if (PyType_IsSubtype(Py_TYPE(exc),
(PyTypeObject *) PyExc_SyntaxError))
{
/* fix "text" attribute */
assert(interactive_src != NULL);
PyObject *xs = PyUnicode_Splitlines(interactive_src, 1);
if (xs == NULL) {
goto error;
}
PyObject *exc_lineno = PyObject_GetAttr(exc, &_Py_ID(lineno));
if (exc_lineno == NULL) {
Py_DECREF(xs);
goto error;
}
int n = PyLong_AsInt(exc_lineno);
Py_DECREF(exc_lineno);
if (n <= 0 || n > PyList_GET_SIZE(xs)) {
Py_DECREF(xs);
goto error;
}
PyObject *line = PyList_GET_ITEM(xs, n - 1);
PyObject_SetAttr(exc, &_Py_ID(text), line);
Py_DECREF(xs);
}
error:
Py_DECREF(interactive_src);
_PyErr_SetRaisedException(tstate, exc);
return -1;
}
Py_DECREF(interactive_src);
Py_DECREF(res);
flush_io();