diff -r 4d5b69af8b04 Lib/inspect.py --- a/Lib/inspect.py Sun May 19 19:39:46 2013 -0700 +++ b/Lib/inspect.py Sun May 19 20:51:38 2013 -0700 @@ -714,8 +714,17 @@ 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 ismodule(object): + return lines, 0 + else: + if isframe(object) or istraceback(object): + info = getframeinfo(object) + if info.function == '': + return lines, 0 + else: + return getblock(lines[lnum:]), lnum + 1 + else: + return getblock(lines[lnum:]), lnum + 1 def getsource(object): """Return the text of the source code for an object. diff -r 4d5b69af8b04 Lib/test/inspect_fodder.py --- a/Lib/test/inspect_fodder.py Sun May 19 19:39:46 2013 -0700 +++ b/Lib/test/inspect_fodder.py Sun May 19 20:51:38 2013 -0700 @@ -54,3 +54,10 @@ class FesteringGob(MalodorousPervert, ParrotDroppings): pass + +# line 58 +ofr = inspect.currentframe() +try: + 1/0 +except: + tb = sys.exc_info()[2] diff -r 4d5b69af8b04 Lib/test/inspect_fodder2.py --- a/Lib/test/inspect_fodder2.py Sun May 19 19:39:46 2013 -0700 +++ b/Lib/test/inspect_fodder2.py Sun May 19 20:51:38 2013 -0700 @@ -109,3 +109,12 @@ #line 109 def keyword_only_arg(*, arg): pass + +#line 113 +import inspect +import sys +ofr = inspect.currentframe() +try: + 1/0 +except: + tb = sys.exc_info()[2] diff -r 4d5b69af8b04 Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py Sun May 19 19:39:46 2013 -0700 +++ b/Lib/test/test_inspect.py Sun May 19 20:51:38 2013 -0700 @@ -277,6 +277,14 @@ def test_getsource(self): self.assertSourceEqual(git.abuse, 29, 39) self.assertSourceEqual(mod.StupidGit, 21, 46) + self.assertSourceEqual(mod, 1, 63) + self.assertSourceEqual(mod.StupidGit, 21, 46) + self.assertSourceEqual(git.abuse, 29, 39) + self.assertSourceEqual(mod.eggs, 12, 18) + self.assertSourceEqual(mod.tb, 1, 63) + self.assertSourceEqual(mod.fr, 12, 18) + self.assertSourceEqual(mod.ofr, 1, 63) + self.assertSourceEqual(mod.spam.__code__, 8, 9) def test_getsourcefile(self): self.assertEqual(normcase(inspect.getsourcefile(mod.spam)), modfile) @@ -321,6 +329,17 @@ finally: linecache.getlines = getlines + +class TestFrames(GetSourceBase): + fodderModule = mod2 + + def test_frame_in_outer_scope(self): + self.assertSourceEqual(mod2.ofr, 1, 120) + + def test_traceback_in_outer_scope(self): + self.assertSourceEqual(mod2.tb, 1, 120) + + class TestDecorators(GetSourceBase): fodderModule = mod2 @@ -2291,7 +2310,7 @@ TestGetcallargsFunctions, TestGetcallargsMethods, TestGetcallargsUnboundMethods, TestGetattrStatic, TestGetGeneratorState, TestNoEOL, TestSignatureObject, TestSignatureBind, TestParameterObject, - TestBoundArguments, TestGetClosureVars + TestBoundArguments, TestGetClosureVars, TestFrames ) if __name__ == "__main__":