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

This commit is contained in:
Vladimir Matveev 2018-08-24 07:18:00 -07:00 committed by Tal Einat
parent 075b3c3259
commit 91cb298f81
4 changed files with 26 additions and 3 deletions

View File

@ -954,7 +954,12 @@ def getsourcelines(object):
object = unwrap(object)
lines, lnum = findsource(object)
if ismodule(object):
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

View File

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

View File

@ -344,7 +344,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),
@ -527,6 +527,16 @@ class TestRetrievingSourceCode(GetSourceBase):
def test_getsource_on_code_object(self):
self.assertSourceEqual(mod.eggs.__code__, 12, 18)
class TestGettingSourceOfToplevelFrames(GetSourceBase):
fodderModule = 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):
fodderModule = mod2
@ -3870,7 +3880,7 @@ def test_main():
TestBoundArguments, TestSignaturePrivateHelpers,
TestSignatureDefinitions, TestIsDataDescriptor,
TestGetClosureVars, TestUnwrap, TestMain, TestReload,
TestGetCoroutineState
TestGetCoroutineState, TestGettingSourceOfToplevelFrames
)
if __name__ == "__main__":

View File

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