[2.7] bpo-6700: Fix inspect.getsourcelines for module level frames/tracebacks (GH-8864)

(cherry picked from commit 91cb298f81)

Co-authored-by: Vladimir Matveev <v2matveev@outlook.com>
This commit is contained in:
Tal Einat 2018-08-26 11:44:53 +03:00 committed by GitHub
parent 032e85f3fb
commit 491740f116
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 4 deletions

View File

@ -688,8 +688,15 @@ def getsourcelines(object):
raised if the source code cannot be retrieved."""
lines, lnum = findsource(object)
if ismodule(object): return lines, 0
else: return getblock(lines[lnum:]), lnum + 1
if istraceback(object):
object = object.tb_frame
# for module or frame that corresponds to module, return all source lines
if (ismodule(object) or
(isframe(object) and object.f_code.co_name == "<module>")):
return lines, 0
else:
return getblock(lines[lnum:]), lnum + 1
def getsource(object):
"""Return the text of the source code for an object.

View File

@ -56,3 +56,9 @@ class ParrotDroppings:
class FesteringGob(MalodorousPervert, ParrotDroppings):
pass
currentframe = inspect.currentframe()
try:
raise Exception()
except:
tb = sys.exc_info()[2]

View File

@ -209,7 +209,7 @@ class GetSourceBase(unittest.TestCase):
def sourcerange(self, top, bottom):
lines = self.source.split("\n")
return "\n".join(lines[top-1:bottom]) + "\n"
return "\n".join(lines[top-1:bottom]) + ("\n" if bottom else "")
def assertSourceEqual(self, obj, top, bottom):
self.assertEqual(inspect.getsource(obj),
@ -331,6 +331,16 @@ class TestRetrievingSourceCode(GetSourceBase):
finally:
linecache.getlines = getlines
class TestGettingSourceOfToplevelFrames(GetSourceBase):
fodderFile = mod
def test_range_toplevel_frame(self):
self.maxDiff = None
self.assertSourceEqual(mod.currentframe, 1, None)
def test_range_traceback_toplevel_frame(self):
self.assertSourceEqual(mod.tb, 1, None)
class TestDecorators(GetSourceBase):
fodderFile = mod2
@ -896,7 +906,8 @@ def test_main():
TestDecorators, TestRetrievingSourceCode, TestOneliners, TestBuggyCases,
TestInterpreterStack, TestClassesAndFunctions, TestPredicates,
TestGetcallargsFunctions, TestGetcallargsFunctionsCellVars,
TestGetcallargsMethods, TestGetcallargsUnboundMethods)
TestGetcallargsMethods, TestGetcallargsUnboundMethods,
TestGettingSourceOfToplevelFrames)
if __name__ == "__main__":
test_main()

View File

@ -0,0 +1,2 @@
Fix inspect.getsourcelines for module level frames/tracebacks.
Patch by Vladimir Matveev.