changeset: 97022:98a2bbf2cce2 parent: 97020:3f3e398bcd3e parent: 97021:4e42a62d5648 user: Yury Selivanov date: Thu Jul 23 17:10:24 2015 +0300 files: Misc/NEWS description: Merge 3.5 (issues #21217, #24485). diff -r 3f3e398bcd3e -r 98a2bbf2cce2 Lib/inspect.py --- a/Lib/inspect.py Thu Jul 23 15:58:57 2015 +0300 +++ b/Lib/inspect.py Thu Jul 23 17:10:24 2015 +0300 @@ -902,14 +902,6 @@ pass return lines[:blockfinder.last] -def _line_number_helper(code_obj, lines, lnum): - """Return a list of source lines and starting line number for a code object. - - The arguments must be a code object with lines and lnum from findsource. - """ - _, end_line = list(dis.findlinestarts(code_obj))[-1] - return lines[lnum:end_line], lnum + 1 - def getsourcelines(object): """Return a list of source lines and starting line number for an object. @@ -921,16 +913,8 @@ object = unwrap(object) lines, lnum = findsource(object) - if ismodule(object): - return lines, 0 - elif iscode(object): - return _line_number_helper(object, lines, lnum) - elif isfunction(object): - return _line_number_helper(object.__code__, lines, lnum) - elif ismethod(object): - return _line_number_helper(object.__func__.__code__, lines, lnum) - else: - return getblock(lines[lnum:]), lnum + 1 + if ismodule(object): return lines, 0 + else: return getblock(lines[lnum:]), lnum + 1 def getsource(object): """Return the text of the source code for an object. diff -r 3f3e398bcd3e -r 98a2bbf2cce2 Lib/test/inspect_fodder2.py --- a/Lib/test/inspect_fodder2.py Thu Jul 23 15:58:57 2015 +0300 +++ b/Lib/test/inspect_fodder2.py Thu Jul 23 17:10:24 2015 +0300 @@ -130,3 +130,10 @@ @decorator def real(): return 20 + +#line 134 +class cls135: + def func136(): + def func137(): + never_reached1 + never_reached2 diff -r 3f3e398bcd3e -r 98a2bbf2cce2 Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py Thu Jul 23 15:58:57 2015 +0300 +++ b/Lib/test/test_inspect.py Thu Jul 23 17:10:24 2015 +0300 @@ -464,6 +464,7 @@ def test_getsource_unwrap(self): self.assertSourceEqual(mod2.real, 130, 132) + @unittest.expectedFailure def test_decorator_with_lambda(self): self.assertSourceEqual(mod2.func114, 113, 115) @@ -563,6 +564,10 @@ def test_getsource_on_method(self): self.assertSourceEqual(mod2.ClassWithMethod.method, 118, 119) + def test_nested_func(self): + self.assertSourceEqual(mod2.cls135.func136, 136, 139) + + class TestNoEOL(GetSourceBase): def setUp(self): self.tempdir = TESTFN + '_dir' diff -r 3f3e398bcd3e -r 98a2bbf2cce2 Misc/NEWS --- a/Misc/NEWS Thu Jul 23 15:58:57 2015 +0300 +++ b/Misc/NEWS Thu Jul 23 17:10:24 2015 +0300 @@ -576,10 +576,6 @@ - Issue #23342: Add a subprocess.run() function than returns a CalledProcess instance for a more consistent API than the existing call* functions. -- Issue #21217: inspect.getsourcelines() now tries to compute the start and end - lines from the code object, fixing an issue when a lambda function is used as - decorator argument. Patch by Thomas Ballinger and Allison Kaptur. - - Issue #24521: Fix possible integer overflows in the pickle module. - Issue #22931: Allow '[' and ']' in cookie values.