From: Georg Brandl Date: Sat, 31 Jul 2010 21:22:36 +0000 (+0000) Subject: #1019882: if start() and stop() were not in the same stack frame, stats.load() would... X-Git-Tag: v2.7.1rc1~530 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a491727ded210994812ae1191253c0305dfc6885;p=python #1019882: if start() and stop() were not in the same stack frame, stats.load() would crash with IndexError. --- diff --git a/Lib/hotshot/log.py b/Lib/hotshot/log.py index 47c932ac2d..17e8b50515 100644 --- a/Lib/hotshot/log.py +++ b/Lib/hotshot/log.py @@ -106,7 +106,10 @@ class LogReader: return what, t, tdelta if what == WHAT_EXIT: - return what, self._pop(), tdelta + try: + return what, self._pop(), tdelta + except IndexError: + raise StopIteration if what == WHAT_LINENO: filename, firstlineno, funcname = self._stack[-1] diff --git a/Lib/test/test_hotshot.py b/Lib/test/test_hotshot.py index c6dae363cd..7da9746d78 100644 --- a/Lib/test/test_hotshot.py +++ b/Lib/test/test_hotshot.py @@ -10,6 +10,7 @@ from test import test_support # Silence Py3k warning hotshot = test_support.import_module('hotshot', deprecated=True) from hotshot.log import ENTER, EXIT, LINE +from hotshot import stats def shortfilename(fn): @@ -136,6 +137,19 @@ class HotShotTestCase(unittest.TestCase): emptyfile.close() gc.collect() + def test_load_stats(self): + def start(prof): + prof.start() + # Make sure stats can be loaded when start and stop of profiler + # are not executed in the same stack frame. + profiler = self.new_profiler() + start(profiler) + profiler.stop() + profiler.close() + stats.load(self.logfn) + os.unlink(self.logfn) + + def test_main(): test_support.run_unittest(HotShotTestCase) diff --git a/Misc/NEWS b/Misc/NEWS index fed077297b..ea60e3b818 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -64,6 +64,8 @@ Library Extension Modules ----------------- +- Issue #1019882: Fix IndexError when loading certain hotshot stats. + - Issue #9422: Fix memory leak when re-initializing a struct.Struct object. - Issue #7900: The getgroups(2) system call on MacOSX behaves rather oddly