[Python-checkins] bpo-43950: make BinOp specializations more reliable (GH-27126)

pablogsal webhook-mailer at python.org
Thu Jul 15 19:38:19 EDT 2021


https://github.com/python/cpython/commit/919ad537510fdc2c750109e0bc4eceea234324b2
commit: 919ad537510fdc2c750109e0bc4eceea234324b2
branch: main
author: Batuhan Taskaya <batuhan at python.org>
committer: pablogsal <Pablogsal at gmail.com>
date: 2021-07-16T00:38:11+01:00
summary:

bpo-43950: make BinOp specializations more reliable (GH-27126)

files:
M Lib/test/test_traceback.py
M Lib/traceback.py
M Python/traceback.c

diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 8baf38c1afd5d..402f773814ec4 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -485,6 +485,44 @@ def test_traceback_specialization_with_syntax_error(self):
         )
         self.assertEqual(result_lines, expected_error.splitlines())
 
+    def assertSpecialized(self, func, expected_specialization):
+        result_lines = self.get_exception(func)
+        specialization_line = result_lines[-1]
+        self.assertEqual(specialization_line.lstrip(), expected_specialization)
+
+    def test_specialization_variations(self):
+        self.assertSpecialized(lambda: 1/0,
+                                      "~^~")
+        self.assertSpecialized(lambda: 1/0/3,
+                                      "~^~")
+        self.assertSpecialized(lambda: 1 / 0,
+                                      "~~^~~")
+        self.assertSpecialized(lambda: 1 / 0 / 3,
+                                      "~~^~~")
+        self.assertSpecialized(lambda: 1/ 0,
+                                      "~^~~")
+        self.assertSpecialized(lambda: 1/ 0/3,
+                                      "~^~~")
+        self.assertSpecialized(lambda: 1    /  0,
+                                      "~~~~~^~~~")
+        self.assertSpecialized(lambda: 1    /  0   / 5,
+                                      "~~~~~^~~~")
+        self.assertSpecialized(lambda: 1 /0,
+                                      "~~^~")
+        self.assertSpecialized(lambda: 1//0,
+                                      "~^^~")
+        self.assertSpecialized(lambda: 1//0//4,
+                                      "~^^~")
+        self.assertSpecialized(lambda: 1 // 0,
+                                      "~~^^~~")
+        self.assertSpecialized(lambda: 1 // 0 // 4,
+                                      "~~^^~~")
+        self.assertSpecialized(lambda: 1 //0,
+                                      "~~^^~")
+        self.assertSpecialized(lambda: 1// 0,
+                                      "~^^~~")
+
+
 @cpython_only
 @requires_debug_ranges()
 class CPythonTracebackErrorCaretTests(TracebackErrorLocationCaretTests):
diff --git a/Lib/traceback.py b/Lib/traceback.py
index ec5e20d431feb..40d736af56dd7 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -496,7 +496,7 @@ def format(self):
 
                     try:
                         anchors = _extract_caret_anchors_from_line_segment(
-                            frame._original_line[colno - 1:end_colno]
+                            frame._original_line[colno - 1:end_colno - 1]
                         )
                     except Exception:
                         anchors = None
diff --git a/Python/traceback.c b/Python/traceback.c
index 199d3ea7596bf..643096c81fc8f 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -543,7 +543,7 @@ extract_anchors_from_expr(const char *segment_str, expr_ty expr, Py_ssize_t *lef
         case BinOp_kind: {
             expr_ty left = expr->v.BinOp.left;
             expr_ty right = expr->v.BinOp.right;
-            for (int i = left->end_col_offset + 1; i < right->col_offset; i++) {
+            for (int i = left->end_col_offset; i < right->col_offset; i++) {
                 if (IS_WHITESPACE(segment_str[i])) {
                     continue;
                 }



More information about the Python-checkins mailing list