From eb6aa271473e73ee15e2abd4f3d8fed6bff57b03 Mon Sep 17 00:00:00 2001 From: Nice Zombies Date: Tue, 3 Dec 2024 13:06:22 +0100 Subject: [PATCH 1/3] `end_offset` is ignored in subclasses of SyntaxError --- Python/pythonrun.c | 62 +++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 5f3d249df45814..cf84573a8e6147 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -538,43 +538,37 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, *offset = hold; } - if (Py_TYPE(err) == (PyTypeObject*)PyExc_SyntaxError) { - v = PyObject_GetAttr(err, &_Py_ID(end_lineno)); - if (!v) { - PyErr_Clear(); - *end_lineno = *lineno; - } - else if (v == Py_None) { - *end_lineno = *lineno; - Py_DECREF(v); - } else { - hold = PyLong_AsSsize_t(v); - Py_DECREF(v); - if (hold < 0 && PyErr_Occurred()) - goto finally; - *end_lineno = hold; - } - - v = PyObject_GetAttr(err, &_Py_ID(end_offset)); - if (!v) { - PyErr_Clear(); - *end_offset = -1; - } - else if (v == Py_None) { - *end_offset = -1; - Py_DECREF(v); - } else { - hold = PyLong_AsSsize_t(v); - Py_DECREF(v); - if (hold < 0 && PyErr_Occurred()) - goto finally; - *end_offset = hold; - } - } else { - // SyntaxError subclasses + v = PyObject_GetAttr(err, &_Py_ID(end_lineno)); + if (!v) { + PyErr_Clear(); *end_lineno = *lineno; + } + else if (v == Py_None) { + *end_lineno = *lineno; + Py_DECREF(v); + } else { + hold = PyLong_AsSsize_t(v); + Py_DECREF(v); + if (hold < 0 && PyErr_Occurred()) + goto finally; + *end_lineno = hold; + } + + v = PyObject_GetAttr(err, &_Py_ID(end_offset)); + if (!v) { + PyErr_Clear(); *end_offset = -1; } + else if (v == Py_None) { + *end_offset = -1; + Py_DECREF(v); + } else { + hold = PyLong_AsSsize_t(v); + Py_DECREF(v); + if (hold < 0 && PyErr_Occurred()) + goto finally; + *end_offset = hold; + } v = PyObject_GetAttr(err, &_Py_ID(text)); if (!v) From 6f5ef281e9e8861f6521cfeba89e4cb557593d3a Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 12:17:38 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2024-12-03-12-17-36.gh-issue-111609.UHpQY9.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2024-12-03-12-17-36.gh-issue-111609.UHpQY9.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-12-03-12-17-36.gh-issue-111609.UHpQY9.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-12-03-12-17-36.gh-issue-111609.UHpQY9.rst new file mode 100644 index 00000000000000..1f63a6f510cff3 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2024-12-03-12-17-36.gh-issue-111609.UHpQY9.rst @@ -0,0 +1 @@ +Respect *end_offset* in :exc:`SyntaxError` subclasses. From 204cd8d5e617a3977a0bab410800d82c3ded435a Mon Sep 17 00:00:00 2001 From: Nice Zombies Date: Tue, 3 Dec 2024 13:40:55 +0100 Subject: [PATCH 3/3] Add test --- Lib/test/test_exceptions.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 72c86eecae2539..f4f2011a51aed7 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -2195,6 +2195,22 @@ def test_range_of_offsets(self): self.assertIn(expected, err.getvalue()) the_exception = exc + def test_subclass(self): + class MySyntaxError(SyntaxError): + pass + + try: + raise MySyntaxError("bad bad", ("bad.py", 1, 2, "abcdefg", 1, 7)) + except SyntaxError as exc: + with support.captured_stderr() as err: + sys.__excepthook__(*sys.exc_info()) + self.assertIn(""" + File "bad.py", line 1 + abcdefg + ^^^^^ +""", err.getvalue()) + + def test_encodings(self): self.addCleanup(unlink, TESTFN) source = (