This fix makes, eg, 'pydoc time' work again.

Merged revisions 72605 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r72605 | r.david.murray | 2009-05-13 13:14:11 -0400 (Wed, 13 May 2009) | 3 lines

  Issue #4050: inspect.findsource/getsource now raise an IOError if the 'source'
  file is a binary.  Patch by Brodie Rao, test by Daniel Diniz.
........
This commit is contained in:
R. David Murray 2009-05-13 17:33:03 +00:00
parent 14b7efa215
commit 74b8924eaf
4 changed files with 16 additions and 1 deletions

View file

@ -518,7 +518,9 @@ def findsource(object):
or code object. The source code is returned as a list of all the lines or code object. The source code is returned as a list of all the lines
in the file and the line number indexes a line in that list. An IOError in the file and the line number indexes a line in that list. An IOError
is raised if the source code cannot be retrieved.""" is raised if the source code cannot be retrieved."""
file = getsourcefile(object) or getfile(object) file = getsourcefile(object)
if not file:
raise IOError('source code not available')
module = getmodule(object, file) module = getmodule(object, file)
if module: if module:
lines = linecache.getlines(file, module.__dict__) lines = linecache.getlines(file, module.__dict__)

View file

@ -11,6 +11,9 @@ from test.support import TESTFN, run_unittest
from test import inspect_fodder as mod from test import inspect_fodder as mod
from test import inspect_fodder2 as mod2 from test import inspect_fodder2 as mod2
# C module for test_findsource_binary
import time
# Functions tested in this suite: # Functions tested in this suite:
# ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode, # ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode,
# isbuiltin, isroutine, isgenerator, isgeneratorfunction, getmembers, # isbuiltin, isroutine, isgenerator, isgeneratorfunction, getmembers,
@ -336,6 +339,10 @@ class TestBuggyCases(GetSourceBase):
def test_method_in_dynamic_class(self): def test_method_in_dynamic_class(self):
self.assertSourceEqual(mod2.method_in_dynamic_class, 95, 97) self.assertSourceEqual(mod2.method_in_dynamic_class, 95, 97)
def test_findsource_binary(self):
self.assertRaises(IOError, inspect.getsource, time)
self.assertRaises(IOError, inspect.findsource, time)
# Helper for testing classify_class_attrs. # Helper for testing classify_class_attrs.
def attrs_wo_objs(cls): def attrs_wo_objs(cls):
return [t[:3] for t in inspect.classify_class_attrs(cls)] return [t[:3] for t in inspect.classify_class_attrs(cls)]

View file

@ -171,6 +171,7 @@ Raghuram Devarakonda
Toby Dickenson Toby Dickenson
Mark Dickinson Mark Dickinson
Jack Diederich Jack Diederich
Daniel Diniz
Humberto Diogenes Humberto Diogenes
Yves Dionne Yves Dionne
Daniel Dittmar Daniel Dittmar
@ -581,6 +582,7 @@ Eduardo P
Brian Quinlan Brian Quinlan
Anders Qvist Anders Qvist
Burton Radons Burton Radons
Brodie Rao
Antti Rasinen Antti Rasinen
Eric Raymond Eric Raymond
Edward K. Ream Edward K. Ream

View file

@ -23,6 +23,10 @@ Core and Builtins
Library Library
------- -------
- Issue #4050: inspect.findsource/getsource now raise an IOError if the 'source'
file is a binary. Patch by Brodie Rao, tests by Daniel Diniz. This fix
corrects a pydoc regression.
- Issue 5955: aifc's close method did not close the file it wrapped, - Issue 5955: aifc's close method did not close the file it wrapped,
now it does. This also means getfp method now returns the real fp. now it does. This also means getfp method now returns the real fp.