changeset: 95344:d444496e714a branch: 2.7 parent: 95340:f8358f6e50e7 user: Serhiy Storchaka date: Wed Apr 01 16:53:53 2015 +0300 files: Lib/linecache.py Lib/test/test_linecache.py Misc/NEWS description: Issue #23838: linecache now clears the cache and returns an empty result on MemoryError. diff -r f8358f6e50e7 -r d444496e714a Lib/linecache.py --- a/Lib/linecache.py Wed Apr 01 12:56:39 2015 +0300 +++ b/Lib/linecache.py Wed Apr 01 16:53:53 2015 +0300 @@ -36,8 +36,12 @@ if filename in cache: return cache[filename][2] - else: + + try: return updatecache(filename, module_globals) + except MemoryError: + clearcache() + return [] def checkcache(filename=None): diff -r f8358f6e50e7 -r d444496e714a Lib/test/test_linecache.py --- a/Lib/test/test_linecache.py Wed Apr 01 12:56:39 2015 +0300 +++ b/Lib/test/test_linecache.py Wed Apr 01 16:53:53 2015 +0300 @@ -124,6 +124,22 @@ self.assertEqual(line, getline(source_name, index + 1)) source_list.append(line) + def test_memoryerror(self): + lines = linecache.getlines(FILENAME) + self.assertTrue(lines) + def raise_memoryerror(*args, **kwargs): + raise MemoryError + with support.swap_attr(linecache, 'updatecache', raise_memoryerror): + lines2 = linecache.getlines(FILENAME) + self.assertEqual(lines2, lines) + + linecache.clearcache() + with support.swap_attr(linecache, 'updatecache', raise_memoryerror): + lines3 = linecache.getlines(FILENAME) + self.assertEqual(lines3, []) + self.assertEqual(linecache.getlines(FILENAME), lines) + + def test_main(): support.run_unittest(LineCacheTests) diff -r f8358f6e50e7 -r d444496e714a Misc/NEWS --- a/Misc/NEWS Wed Apr 01 12:56:39 2015 +0300 +++ b/Misc/NEWS Wed Apr 01 16:53:53 2015 +0300 @@ -21,6 +21,9 @@ Library ------- +- Issue #23838: linecache now clears the cache and returns an empty result on + MemoryError. + - Issue #23742: ntpath.expandvars() no longer loses unbalanced single quotes. - Issue #21802: The reader in BufferedRWPair now is closed even when closing