[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:
parent
032e85f3fb
commit
491740f116
|
@ -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.
|
||||
|
|
|
@ -56,3 +56,9 @@ class ParrotDroppings:
|
|||
|
||||
class FesteringGob(MalodorousPervert, ParrotDroppings):
|
||||
pass
|
||||
|
||||
currentframe = inspect.currentframe()
|
||||
try:
|
||||
raise Exception()
|
||||
except:
|
||||
tb = sys.exc_info()[2]
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix inspect.getsourcelines for module level frames/tracebacks.
|
||||
Patch by Vladimir Matveev.
|
Loading…
Reference in New Issue