[Python-checkins] bpo-43933: Show frame.f_lineno as None, rather than -1, if there is no line number. (GH-25717)
markshannon
webhook-mailer at python.org
Thu Apr 29 14:28:58 EDT 2021
https://github.com/python/cpython/commit/088a15c49d99ecb4c3bef93f8f40dd513c6cae3b
commit: 088a15c49d99ecb4c3bef93f8f40dd513c6cae3b
branch: master
author: Mark Shannon <mark at hotpy.org>
committer: markshannon <mark at hotpy.org>
date: 2021-04-29T19:28:50+01:00
summary:
bpo-43933: Show frame.f_lineno as None, rather than -1, if there is no line number. (GH-25717)
files:
A Misc/NEWS.d/next/Core and Builtins/2021-04-29-13-11-44.bpo-43933.mvoV6O.rst
M Lib/test/test_exceptions.py
M Objects/frameobject.c
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index 590935cb6cd62..3810108e35663 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -2081,7 +2081,10 @@ def lineno_after_raise(self, f, line):
while t.tb_next:
t = t.tb_next
frame = t.tb_frame
- self.assertEqual(frame.f_lineno-frame.f_code.co_firstlineno, line)
+ if line is None:
+ self.assertEqual(frame.f_lineno, line)
+ else:
+ self.assertEqual(frame.f_lineno-frame.f_code.co_firstlineno, line)
def test_lineno_after_raise_simple(self):
def simple():
@@ -2153,6 +2156,12 @@ def after_with():
pass
self.lineno_after_raise(after_with, 2)
+ def test_missing_lineno_shows_as_none(self):
+ def f():
+ 1/0
+ self.lineno_after_raise(f, 1)
+ f.__code__ = f.__code__.replace(co_linetable=b'\x04\x80\xff\x80')
+ self.lineno_after_raise(f, None)
if __name__ == '__main__':
unittest.main()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-04-29-13-11-44.bpo-43933.mvoV6O.rst b/Misc/NEWS.d/next/Core and Builtins/2021-04-29-13-11-44.bpo-43933.mvoV6O.rst
new file mode 100644
index 0000000000000..8d11a8cb3dab3
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-04-29-13-11-44.bpo-43933.mvoV6O.rst
@@ -0,0 +1,3 @@
+If the current position in a frame has no line number then set the f_lineno
+attribute to None, instead of -1, to conform to PEP 626. This should not
+normally be possible, but might occur in some unusual circumstances.
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index b0487c2b68811..5920ed86fd923 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -53,7 +53,13 @@ PyFrame_GetLineNumber(PyFrameObject *f)
static PyObject *
frame_getlineno(PyFrameObject *f, void *closure)
{
- return PyLong_FromLong(PyFrame_GetLineNumber(f));
+ int lineno = PyFrame_GetLineNumber(f);
+ if (lineno < 0) {
+ Py_RETURN_NONE;
+ }
+ else {
+ return PyLong_FromLong(lineno);
+ }
}
static PyObject *
More information about the Python-checkins
mailing list