From 919ad537510fdc2c750109e0bc4eceea234324b2 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Fri, 16 Jul 2021 02:38:11 +0300 Subject: bpo-43950: make BinOp specializations more reliable (GH-27126) --- Lib/test/test_traceback.py | 38 ++++++++++++++++++++++++++++++++++++++ Lib/traceback.py | 2 +- Python/traceback.c | 2 +- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 8baf38c..402f773 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 ec5e20d..40d736a 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 199d3ea..643096c 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; } -- cgit v0.12