Skip to content

Commit 487a51a

Browse files
[3.12] gh-111609: end_offset is ignored in subclasses of SyntaxError (#127554)
* `end_offset` is ignored in subclasses of SyntaxError * 📜🤖 Added by blurb_it. * Add test --------- Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
1 parent 20c0c8c commit 487a51a

File tree

3 files changed

+45
-34
lines changed

3 files changed

+45
-34
lines changed

Lib/test/test_exceptions.py

+16
Original file line numberDiff line numberDiff line change
@@ -2195,6 +2195,22 @@ def test_range_of_offsets(self):
21952195
self.assertIn(expected, err.getvalue())
21962196
the_exception = exc
21972197

2198+
def test_subclass(self):
2199+
class MySyntaxError(SyntaxError):
2200+
pass
2201+
2202+
try:
2203+
raise MySyntaxError("bad bad", ("bad.py", 1, 2, "abcdefg", 1, 7))
2204+
except SyntaxError as exc:
2205+
with support.captured_stderr() as err:
2206+
sys.__excepthook__(*sys.exc_info())
2207+
self.assertIn("""
2208+
File "bad.py", line 1
2209+
abcdefg
2210+
^^^^^
2211+
""", err.getvalue())
2212+
2213+
21982214
def test_encodings(self):
21992215
self.addCleanup(unlink, TESTFN)
22002216
source = (
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Respect *end_offset* in :exc:`SyntaxError` subclasses.

Python/pythonrun.c

+28-34
Original file line numberDiff line numberDiff line change
@@ -538,43 +538,37 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename,
538538
*offset = hold;
539539
}
540540

541-
if (Py_TYPE(err) == (PyTypeObject*)PyExc_SyntaxError) {
542-
v = PyObject_GetAttr(err, &_Py_ID(end_lineno));
543-
if (!v) {
544-
PyErr_Clear();
545-
*end_lineno = *lineno;
546-
}
547-
else if (v == Py_None) {
548-
*end_lineno = *lineno;
549-
Py_DECREF(v);
550-
} else {
551-
hold = PyLong_AsSsize_t(v);
552-
Py_DECREF(v);
553-
if (hold < 0 && PyErr_Occurred())
554-
goto finally;
555-
*end_lineno = hold;
556-
}
557-
558-
v = PyObject_GetAttr(err, &_Py_ID(end_offset));
559-
if (!v) {
560-
PyErr_Clear();
561-
*end_offset = -1;
562-
}
563-
else if (v == Py_None) {
564-
*end_offset = -1;
565-
Py_DECREF(v);
566-
} else {
567-
hold = PyLong_AsSsize_t(v);
568-
Py_DECREF(v);
569-
if (hold < 0 && PyErr_Occurred())
570-
goto finally;
571-
*end_offset = hold;
572-
}
573-
} else {
574-
// SyntaxError subclasses
541+
v = PyObject_GetAttr(err, &_Py_ID(end_lineno));
542+
if (!v) {
543+
PyErr_Clear();
575544
*end_lineno = *lineno;
545+
}
546+
else if (v == Py_None) {
547+
*end_lineno = *lineno;
548+
Py_DECREF(v);
549+
} else {
550+
hold = PyLong_AsSsize_t(v);
551+
Py_DECREF(v);
552+
if (hold < 0 && PyErr_Occurred())
553+
goto finally;
554+
*end_lineno = hold;
555+
}
556+
557+
v = PyObject_GetAttr(err, &_Py_ID(end_offset));
558+
if (!v) {
559+
PyErr_Clear();
576560
*end_offset = -1;
577561
}
562+
else if (v == Py_None) {
563+
*end_offset = -1;
564+
Py_DECREF(v);
565+
} else {
566+
hold = PyLong_AsSsize_t(v);
567+
Py_DECREF(v);
568+
if (hold < 0 && PyErr_Occurred())
569+
goto finally;
570+
*end_offset = hold;
571+
}
578572

579573
v = PyObject_GetAttr(err, &_Py_ID(text));
580574
if (!v)

0 commit comments

Comments
 (0)