Merged revisions 81428-81429,81432-81433,81437 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r81428 | benjamin.peterson | 2010-05-21 16:16:12 -0500 (Fri, 21 May 2010) | 1 line

  use addCleanup
........
  r81429 | benjamin.peterson | 2010-05-21 16:17:22 -0500 (Fri, 21 May 2010) | 1 line

  fix name
........
  r81432 | benjamin.peterson | 2010-05-21 16:31:24 -0500 (Fri, 21 May 2010) | 1 line

  ensure the last line has a trailing newline #8782
........
  r81433 | benjamin.peterson | 2010-05-21 16:32:49 -0500 (Fri, 21 May 2010) | 1 line

  remove debugging rubish
........
  r81437 | benjamin.peterson | 2010-05-21 16:35:44 -0500 (Fri, 21 May 2010) | 1 line

  simplify and modernize updatecache()
........
diff --git a/Lib/linecache.py b/Lib/linecache.py
index 27883fde..ef2adf5 100644
--- a/Lib/linecache.py
+++ b/Lib/linecache.py
@@ -73,13 +73,13 @@
 
     if filename in cache:
         del cache[filename]
-    if not filename or filename[0] + filename[-1] == '<>':
+    if not filename or (filename.startswith('<') and filename.endswith('>')):
         return []
 
     fullname = filename
     try:
         stat = os.stat(fullname)
-    except os.error as msg:
+    except OSError:
         basename = filename
 
         # Try for a __loader__, if available
@@ -114,20 +114,23 @@
                 fullname = os.path.join(dirname, basename)
             except (TypeError, AttributeError):
                 # Not sufficiently string-like to do anything useful with.
+                continue
+            try:
+                stat = os.stat(fullname)
+                break
+            except os.error:
                 pass
-            else:
-                try:
-                    stat = os.stat(fullname)
-                    break
-                except os.error:
-                    pass
         else:
-            # No luck
             return []
-    with open(fullname, 'rb') as fp:
-        coding, line = tokenize.detect_encoding(fp.readline)
-    with open(fullname, 'r', encoding=coding) as fp:
-        lines = fp.readlines()
+    try:
+        with open(fullname, 'rb') as fp:
+            coding, line = tokenize.detect_encoding(fp.readline)
+        with open(fullname, 'r', encoding=coding) as fp:
+            lines = fp.readlines()
+    except IOError:
+        pass
+    if lines and not lines[-1].endswith('\n'):
+        lines[-1] += '\n'
     size, mtime = stat.st_size, stat.st_mtime
     cache[filename] = size, mtime, lines, fullname
     return lines