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

@ -33,8 +33,6 @@ extern int _PyCompile_AstOptimize(
int optimize, int optimize,
struct _arena *arena); struct _arena *arena);
struct _Py_SourceLocation;
extern int _PyAST_Optimize( extern int _PyAST_Optimize(
struct _mod *, struct _mod *,
struct _arena *arena, struct _arena *arena,

View File

@ -120,6 +120,11 @@ extern void _PyErr_SetNone(PyThreadState *tstate, PyObject *exception);
extern PyObject* _PyErr_NoMemory(PyThreadState *tstate); extern PyObject* _PyErr_NoMemory(PyThreadState *tstate);
extern int _PyErr_EmitSyntaxWarning(PyObject *msg, PyObject *filename, int lineno, int col_offset,
int end_lineno, int end_col_offset);
extern void _PyErr_RaiseSyntaxError(PyObject *msg, PyObject *filename, int lineno, int col_offset,
int end_lineno, int end_col_offset);
PyAPI_FUNC(void) _PyErr_SetString( PyAPI_FUNC(void) _PyErr_SetString(
PyThreadState *tstate, PyThreadState *tstate,
PyObject *exception, PyObject *exception,

View File

@ -1112,27 +1112,15 @@ _PyCompile_Error(compiler *c, location loc, const char *format, ...)
if (msg == NULL) { if (msg == NULL) {
return ERROR; return ERROR;
} }
PyObject *loc_obj = PyErr_ProgramTextObject(c->c_filename, loc.lineno); _PyErr_RaiseSyntaxError(msg, c->c_filename, loc.lineno, loc.col_offset + 1,
if (loc_obj == NULL) { loc.end_lineno, loc.end_col_offset + 1);
loc_obj = Py_None;
}
PyObject *args = Py_BuildValue("O(OiiOii)", msg, c->c_filename,
loc.lineno, loc.col_offset + 1, loc_obj,
loc.end_lineno, loc.end_col_offset + 1);
Py_DECREF(msg); Py_DECREF(msg);
if (args == NULL) {
goto exit;
}
PyErr_SetObject(PyExc_SyntaxError, args);
exit:
Py_DECREF(loc_obj);
Py_XDECREF(args);
return ERROR; return ERROR;
} }
/* Emits a SyntaxWarning and returns 1 on success. /* Emits a SyntaxWarning and returns 0 on success.
If a SyntaxWarning raised as error, replaces it with a SyntaxError If a SyntaxWarning raised as error, replaces it with a SyntaxError
and returns 0. and returns -1.
*/ */
int int
_PyCompile_Warn(compiler *c, location loc, const char *format, ...) _PyCompile_Warn(compiler *c, location loc, const char *format, ...)
@ -1144,21 +1132,10 @@ _PyCompile_Warn(compiler *c, location loc, const char *format, ...)
if (msg == NULL) { if (msg == NULL) {
return ERROR; return ERROR;
} }
if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename, int ret = _PyErr_EmitSyntaxWarning(msg, c->c_filename, loc.lineno, loc.col_offset + 1,
loc.lineno, NULL, NULL) < 0) loc.end_lineno, loc.end_col_offset + 1);
{
if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
/* Replace the SyntaxWarning exception with a SyntaxError
to get a more accurate error report */
PyErr_Clear();
assert(PyUnicode_AsUTF8(msg) != NULL);
_PyCompile_Error(c, loc, PyUnicode_AsUTF8(msg));
}
Py_DECREF(msg);
return ERROR;
}
Py_DECREF(msg); Py_DECREF(msg);
return SUCCESS; return ret;
} }
PyObject * PyObject *

View File

@ -1850,6 +1850,52 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
Py_XDECREF(fileobj); 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 /* 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. fails, it will return NULL but will not set an exception.