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

This commit is contained in:
Batuhan Taskaya 2021-07-16 02:38:11 +03:00 committed by GitHub
parent 074e7659f2
commit 919ad53751
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 2 deletions

View file

@ -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):

View file

@ -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

View file

@ -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;
}