bpo-17735: inspect.findsource now raises OSError when co_lineno is out of range (GH-23633)
This can happen when a file was edited after it was imported.
This commit is contained in:
parent
8d4f57dbd1
commit
2e0760bb2e
|
@ -868,7 +868,12 @@ def findsource(object):
|
||||||
lnum = object.co_firstlineno - 1
|
lnum = object.co_firstlineno - 1
|
||||||
pat = re.compile(r'^(\s*def\s)|(\s*async\s+def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
|
pat = re.compile(r'^(\s*def\s)|(\s*async\s+def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
|
||||||
while lnum > 0:
|
while lnum > 0:
|
||||||
if pat.match(lines[lnum]): break
|
try:
|
||||||
|
line = lines[lnum]
|
||||||
|
except IndexError:
|
||||||
|
raise OSError('lineno is out of bounds')
|
||||||
|
if pat.match(line):
|
||||||
|
break
|
||||||
lnum = lnum - 1
|
lnum = lnum - 1
|
||||||
return lines, lnum
|
return lines, lnum
|
||||||
raise OSError('could not find code object')
|
raise OSError('could not find code object')
|
||||||
|
|
|
@ -712,6 +712,17 @@ class TestBuggyCases(GetSourceBase):
|
||||||
self.assertRaises(IOError, inspect.findsource, co)
|
self.assertRaises(IOError, inspect.findsource, co)
|
||||||
self.assertRaises(IOError, inspect.getsource, co)
|
self.assertRaises(IOError, inspect.getsource, co)
|
||||||
|
|
||||||
|
def test_findsource_with_out_of_bounds_lineno(self):
|
||||||
|
mod_len = len(inspect.getsource(mod))
|
||||||
|
src = '\n' * 2* mod_len + "def f(): pass"
|
||||||
|
co = compile(src, mod.__file__, "exec")
|
||||||
|
g, l = {}, {}
|
||||||
|
eval(co, g, l)
|
||||||
|
func = l['f']
|
||||||
|
self.assertEqual(func.__code__.co_firstlineno, 1+2*mod_len)
|
||||||
|
with self.assertRaisesRegex(IOError, "lineno is out of bounds"):
|
||||||
|
inspect.findsource(func)
|
||||||
|
|
||||||
def test_getsource_on_method(self):
|
def test_getsource_on_method(self):
|
||||||
self.assertSourceEqual(mod2.ClassWithMethod.method, 118, 119)
|
self.assertSourceEqual(mod2.ClassWithMethod.method, 118, 119)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
:func:`inspect.findsource` now raises :exc:`OSError` instead of
|
||||||
|
:exc:`IndexError` when :attr:`co_lineno` of a code object is greater than the
|
||||||
|
file length. This can happen, for example, when a file is edited after it was
|
||||||
|
imported. PR by Irit Katriel.
|
Loading…
Reference in New Issue