From 83938437cb74418ba45d00a99d02c6e095110c60 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 22 Oct 2010 06:28:01 +0000 Subject: [PATCH] #10166: rewrite self-recursion to iteration in pstats.Stats.add(). Also add a unittest and a stats test file. --- Lib/pstats.py | 48 +++++++++++++++++++++------------------- Lib/test/pstats.pck | Bin 0 -> 66607 bytes Lib/test/test_pstats.py | 19 +++++++++++++--- Misc/NEWS | 2 ++ 4 files changed, 43 insertions(+), 26 deletions(-) create mode 100644 Lib/test/pstats.pck diff --git a/Lib/pstats.py b/Lib/pstats.py index 4bb5cf17064..8744235ad00 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -104,7 +104,9 @@ class Stats: print(file=self.stream) def load_stats(self, arg): - if not arg: self.stats = {} + if arg is None: + self.stats = {} + return elif isinstance(arg, str): f = open(arg, 'rb') self.stats = marshal.load(f) @@ -114,13 +116,13 @@ class Stats: arg = time.ctime(file_stats.st_mtime) + " " + arg except: # in case this is not unix pass - self.files = [ arg ] + self.files = [arg] elif hasattr(arg, 'create_stats'): arg.create_stats() self.stats = arg.stats arg.stats = {} if not self.stats: - raise TypeError("Cannot create or construct a %r object from '%r''" + raise TypeError("Cannot create or construct a %r object from %r" % (self.__class__, arg)) return @@ -135,29 +137,29 @@ class Stats: self.max_name_len = len(func_std_string(func)) def add(self, *arg_list): - if not arg_list: return self - if len(arg_list) > 1: self.add(*arg_list[1:]) - other = arg_list[0] - if type(self) != type(other): - other = Stats(other) - self.files += other.files - self.total_calls += other.total_calls - self.prim_calls += other.prim_calls - self.total_tt += other.total_tt - for func in other.top_level: - self.top_level[func] = None + if not arg_list: + return self + for item in reversed(arg_list): + if type(self) != type(item): + item = Stats(item) + self.files += item.files + self.total_calls += item.total_calls + self.prim_calls += item.prim_calls + self.total_tt += item.total_tt + for func in item.top_level: + self.top_level[func] = None - if self.max_name_len < other.max_name_len: - self.max_name_len = other.max_name_len + if self.max_name_len < item.max_name_len: + self.max_name_len = item.max_name_len - self.fcn_list = None + self.fcn_list = None - for func, stat in other.stats.items(): - if func in self.stats: - old_func_stat = self.stats[func] - else: - old_func_stat = (0, 0, 0, 0, {},) - self.stats[func] = add_func_stats(old_func_stat, stat) + for func, stat in item.stats.items(): + if func in self.stats: + old_func_stat = self.stats[func] + else: + old_func_stat = (0, 0, 0, 0, {},) + self.stats[func] = add_func_stats(old_func_stat, stat) return self def dump_stats(self, filename): diff --git a/Lib/test/pstats.pck b/Lib/test/pstats.pck new file mode 100644 index 0000000000000000000000000000000000000000..c48ccb73a9fe3ff50aba3704a17e1e08ccc4ce08 GIT binary patch literal 66607 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 i3k