]> granicus.if.org Git - python/commitdiff
Merged revisions 82041 via svnmerge from
authorR. David Murray <rdmurray@bitdance.com>
Thu, 17 Jun 2010 02:06:12 +0000 (02:06 +0000)
committerR. David Murray <rdmurray@bitdance.com>
Thu, 17 Jun 2010 02:06:12 +0000 (02:06 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r82041 | r.david.murray | 2010-06-16 22:04:29 -0400 (Wed, 16 Jun 2010) | 16 lines

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

  ........
    r82039 | r.david.murray | 2010-06-16 21:36:52 -0400 (Wed, 16 Jun 2010) | 10 lines

    #8720: fix inspect regression by teaching getsourcefile about linecache.

    The fix for issue 4050 caused a regression:  before that fix, source
    lines in the linecache would eventually be found by inspect.  After the
    fix inspect reports an error earlier, and the source isn't found.
    The fix for the fix is to have getsourcefile look in the linecache for
    the file and return the psuedo-filename if the source is there, just as
    it already returns it if there is a PEP 302 loader.
  ........
................

Lib/inspect.py
Lib/test/test_inspect.py
Misc/NEWS

index c48950236892898499e94d58debbc5d791e8a95d..55d5316b7cd6027b191a4c45fc8bf914928aec5b 100644 (file)
@@ -435,7 +435,9 @@ def getmodulename(path):
     if info: return info[0]
 
 def getsourcefile(object):
-    """Return the Python source file an object was defined in, if it exists."""
+    """Return the filename that can be used to locate an object's source.
+    Return None if no way can be identified to get the source.
+    """
     filename = getfile(object)
     if filename[-4:].lower() in ('.pyc', '.pyo'):
         filename = filename[:-4] + '.py'
@@ -448,6 +450,9 @@ def getsourcefile(object):
     # only return a non-existent filename if the module has a PEP 302 loader
     if hasattr(getmodule(object, filename), '__loader__'):
         return filename
+    # or it is in the linecache
+    if filename in linecache.cache:
+        return filename
 
 def getabsfile(object, _filename=None):
     """Return an absolute path to the source or compiled file for an object.
index 9dba30db530c9fa62d7fc10b0bf0f56f02b3ba8d..f15280755b5544827e5984ae274d4d01cf4d2dd7 100644 (file)
@@ -2,6 +2,7 @@ import sys
 import types
 import unittest
 import inspect
+import linecache
 import datetime
 import collections
 from os.path import normcase
@@ -272,6 +273,11 @@ class TestRetrievingSourceCode(GetSourceBase):
     def test_getsourcefile(self):
         self.assertEqual(normcase(inspect.getsourcefile(mod.spam)), modfile)
         self.assertEqual(normcase(inspect.getsourcefile(git.abuse)), modfile)
+        fn = "_non_existing_filename_used_for_sourcefile_test.py"
+        co = compile("None", fn, "exec")
+        self.assertEqual(normcase(inspect.getsourcefile(co)), None)
+        linecache.cache[co.co_filename] = (1, None, "None", co.co_filename)
+        self.assertEqual(normcase(inspect.getsourcefile(co)), fn)
 
     def test_getfile(self):
         self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__)
@@ -370,6 +376,15 @@ class TestBuggyCases(GetSourceBase):
         self.assertRaises(IOError, inspect.getsource, unicodedata)
         self.assertRaises(IOError, inspect.findsource, unicodedata)
 
+    def test_findsource_code_in_linecache(self):
+        lines = ["x=1"]
+        co = compile(lines[0], "_dynamically_created_file", "exec")
+        self.assertRaises(IOError, inspect.findsource, co)
+        self.assertRaises(IOError, inspect.getsource, co)
+        linecache.cache[co.co_filename] = (1, None, lines, co.co_filename)
+        self.assertEquals(inspect.findsource(co), (lines,0))
+        self.assertEquals(inspect.getsource(co), lines[0])
+
 # Helper for testing classify_class_attrs.
 def attrs_wo_objs(cls):
     return [t[:3] for t in inspect.classify_class_attrs(cls)]
index adb9a34777071d2b9015dbd0c776bd9eca3eb8e3..ae0ca7e050d46b99cc436c7797eb1acda04dfeb2 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -61,6 +61,9 @@ C-API
 Library
 -------
 
+- Issue #8720: fix regression caused by fix for #4050 by making getsourcefile
+  smart enough to find source files in the linecache.
+
 - Issue #5610: feedparser no longer eats extra characters at the end of
   a body part if the body part ends with a \r\n.