summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBatuhan Taskaya <batuhan@python.org>2021-07-24 17:50:39 (GMT)
committerGitHub <noreply@github.com>2021-07-24 17:50:39 (GMT)
commit4f5980a4f57dab68b9137304f58bd08891d43d5a (patch)
tree2bb29a0f309794d1ceb270647a3a5b66c908f479 /Lib
parentef8b8535cb3cd705392af9b927d6ff336d98427d (diff)
downloadcpython-4f5980a4f57dab68b9137304f58bd08891d43d5a.zip
cpython-4f5980a4f57dab68b9137304f58bd08891d43d5a.tar.gz
cpython-4f5980a4f57dab68b9137304f58bd08891d43d5a.tar.bz2
bpo-43950: support long lines in traceback.py (GH-27336)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_traceback.py22
-rw-r--r--Lib/traceback.py6
2 files changed, 27 insertions, 1 deletions
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index c87ce72..5fc5b59 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -510,6 +510,28 @@ class TracebackErrorLocationCaretTests(unittest.TestCase):
)
self.assertEqual(result_lines, expected_error.splitlines())
+ def test_traceback_very_long_line(self):
+ source = "a" * 256
+ bytecode = compile(source, TESTFN, "exec")
+
+ with open(TESTFN, "w") as file:
+ file.write(source)
+ self.addCleanup(unlink, TESTFN)
+
+ func = partial(exec, bytecode)
+ result_lines = self.get_exception(func)
+
+ lineno_f = bytecode.co_firstlineno
+ expected_error = (
+ 'Traceback (most recent call last):\n'
+ f' File "{__file__}", line {self.callable_line}, in get_exception\n'
+ ' callable()\n'
+ ' ^^^^^^^^^^\n'
+ f' File "{TESTFN}", line {lineno_f}, in <module>\n'
+ f' {source}\n'
+ )
+ self.assertEqual(result_lines, expected_error.splitlines())
+
def assertSpecialized(self, func, expected_specialization):
result_lines = self.get_exception(func)
specialization_line = result_lines[-1]
diff --git a/Lib/traceback.py b/Lib/traceback.py
index ae5775d..15bdb3c 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -462,7 +462,11 @@ class StackSummary(list):
row.append(' {}\n'.format(frame.line.strip()))
stripped_characters = len(frame._original_line) - len(frame.line.lstrip())
- if frame.end_lineno == frame.lineno and frame.end_colno != 0:
+ if (
+ frame.end_lineno == frame.lineno
+ and frame.colno is not None
+ and frame.end_colno is not None
+ ):
colno = _byte_offset_to_character_offset(frame._original_line, frame.colno)
end_colno = _byte_offset_to_character_offset(frame._original_line, frame.end_colno)