From: Batuhan Taskaya Date: Thu, 15 Jul 2021 23:38:11 +0000 (+0300) Subject: bpo-43950: make BinOp specializations more reliable (GH-27126) X-Git-Tag: v3.11.0a1~662 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=919ad537510fdc2c750109e0bc4eceea234324b2;p=thirdparty%2FPython%2Fcpython.git bpo-43950: make BinOp specializations more reliable (GH-27126) --- diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 8baf38c1afd5..402f773814ec 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -485,6 +485,44 @@ class TracebackErrorLocationCaretTests(unittest.TestCase): ) 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 ec5e20d431fe..40d736af56dd 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -496,7 +496,7 @@ class StackSummary(list): 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 199d3ea7596b..643096c81fc8 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; }