]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-111609: `end_offset` is ignored in subclasses of SyntaxError (#127554)
authorNice Zombies <nineteendo19d0@gmail.com>
Wed, 11 Dec 2024 09:09:34 +0000 (10:09 +0100)
committerGitHub <noreply@github.com>
Wed, 11 Dec 2024 09:09:34 +0000 (09:09 +0000)
* `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>
Lib/test/test_exceptions.py
Misc/NEWS.d/next/Core_and_Builtins/2024-12-03-12-17-36.gh-issue-111609.UHpQY9.rst [new file with mode: 0644]
Python/pythonrun.c

index 72c86eecae25393ae1533c8770307b502c976f91..f4f2011a51aed7f62ca4b36a1f41bdeaaffcdf6e 100644 (file)
@@ -2195,6 +2195,22 @@ class SyntaxErrorTests(unittest.TestCase):
                     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 = (
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 (file)
index 0000000..1f63a6f
--- /dev/null
@@ -0,0 +1 @@
+Respect *end_offset* in :exc:`SyntaxError` subclasses.
index 5f3d249df4581495f83a3a970c56845655615afb..cf84573a8e6147e96724e6ae0dfa1c45eb1d66ef 100644 (file)
@@ -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)