Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions Include/internal/pycore_compile.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ extern int _PyCompile_AstOptimize(
int optimize,
struct _arena *arena);

struct _Py_SourceLocation;

extern int _PyAST_Optimize(
struct _mod *,
struct _arena *arena,
Expand Down
5 changes: 5 additions & 0 deletions Include/internal/pycore_pyerrors.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ extern void _PyErr_SetNone(PyThreadState *tstate, PyObject *exception);

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 int _PyErr_RaiseSyntaxError(PyObject *msg, PyObject *filename, int lineno, int col_offset,
int end_lineno, int end_col_offset);

PyAPI_FUNC(void) _PyErr_SetString(
PyThreadState *tstate,
PyObject *exception,
Expand Down
39 changes: 8 additions & 31 deletions Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -1112,27 +1112,15 @@ _PyCompile_Error(compiler *c, location loc, const char *format, ...)
if (msg == NULL) {
return ERROR;
}
PyObject *loc_obj = PyErr_ProgramTextObject(c->c_filename, loc.lineno);
if (loc_obj == NULL) {
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);
int ret = _PyErr_RaiseSyntaxError(msg, c->c_filename, loc.lineno, loc.col_offset,
loc.end_lineno, loc.end_col_offset);
Py_DECREF(msg);
if (args == NULL) {
goto exit;
}
PyErr_SetObject(PyExc_SyntaxError, args);
exit:
Py_DECREF(loc_obj);
Py_XDECREF(args);
return ERROR;
return ret;
}

/* 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
and returns 0.
and returns -1.
Comment thread
iritkatriel marked this conversation as resolved.
Resolved
*/
int
_PyCompile_Warn(compiler *c, location loc, const char *format, ...)
Expand All @@ -1144,21 +1132,10 @@ _PyCompile_Warn(compiler *c, location loc, const char *format, ...)
if (msg == NULL) {
return ERROR;
}
if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
loc.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();
assert(PyUnicode_AsUTF8(msg) != NULL);
_PyCompile_Error(c, loc, PyUnicode_AsUTF8(msg));
}
Py_DECREF(msg);
return ERROR;
}
int ret = _PyErr_EmitSyntaxWarning(msg, c->c_filename, loc.lineno, loc.col_offset,
loc.end_lineno, loc.end_col_offset);
Py_DECREF(msg);
return SUCCESS;
return ret;
}

PyObject *
Expand Down
49 changes: 49 additions & 0 deletions Python/errors.c
Original file line number Diff line number Diff line change
Expand Up @@ -1850,6 +1850,55 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
Py_XDECREF(fileobj);
}

/* Raises a SyntaxError and returns -1.
* If something goes wrong, a different exception may be raised.
*/

Comment thread
iritkatriel marked this conversation as resolved.
Resolved
int
Comment thread
iritkatriel marked this conversation as resolved.
Resolved
_PyErr_RaiseSyntaxError(PyObject *msg, PyObject *filename, int lineno, int col_offset,
int end_lineno, int end_col_offset)
{
PyObject *loc_obj = PyErr_ProgramTextObject(filename, lineno);
Comment thread
iritkatriel marked this conversation as resolved.
Resolved
if (loc_obj == NULL) {
loc_obj = Py_None;
Comment thread
iritkatriel marked this conversation as resolved.
Resolved
}
PyObject *args = Py_BuildValue("O(OiiOii)", msg, filename,
lineno, col_offset + 1, loc_obj,
end_lineno, end_col_offset + 1);
if (args == NULL) {
goto exit;
}
PyErr_SetObject(PyExc_SyntaxError, args);
exit:
Py_DECREF(loc_obj);
Py_XDECREF(args);
return -1;
}

/* 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();
assert(PyUnicode_AsUTF8(msg) != NULL);
Comment thread
iritkatriel marked this conversation as resolved.
Resolved
_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.

Expand Down