gh-123969: refactor _PyErr_RaiseSyntaxError and _PyErr_EmitSyntaxWarning out of compiler (#123972)

This commit is contained in:
Irit Katriel 2024-09-16 15:05:00 +01:00 committed by GitHub
parent 9aa1f60e2d
commit aba42c0b54
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 58 additions and 32 deletions

View file

@ -1850,6 +1850,52 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
Py_XDECREF(fileobj);
}
/* Raises a SyntaxError.
* If something goes wrong, a different exception may be raised.
*/
void
_PyErr_RaiseSyntaxError(PyObject *msg, PyObject *filename, int lineno, int col_offset,
int end_lineno, int end_col_offset)
{
PyObject *text = PyErr_ProgramTextObject(filename, lineno);
if (text == NULL) {
text = Py_NewRef(Py_None);
}
PyObject *args = Py_BuildValue("O(OiiOii)", msg, filename,
lineno, col_offset, text,
end_lineno, end_col_offset);
if (args == NULL) {
goto exit;
}
PyErr_SetObject(PyExc_SyntaxError, args);
exit:
Py_DECREF(text);
Py_XDECREF(args);
}
/* Emits a SyntaxWarning and returns 0 on success.
If a SyntaxWarning is raised as error, replaces it with a SyntaxError
and returns -1.
*/
int
_PyErr_EmitSyntaxWarning(PyObject *msg, PyObject *filename, int lineno, int col_offset,
int end_lineno, int end_col_offset)
{
if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, filename,
lineno, NULL, NULL) < 0)
{
if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
/* Replace the SyntaxWarning exception with a SyntaxError
to get a more accurate error report */
PyErr_Clear();
_PyErr_RaiseSyntaxError(msg, filename, lineno, col_offset,
end_lineno, end_col_offset);
}
return -1;
}
return 0;
}
/* Attempt to load the line of text that the exception refers to. If it
fails, it will return NULL but will not set an exception.