diff options
Diffstat (limited to 'dev-util/gprof2dot')
-rw-r--r-- | dev-util/gprof2dot/files/gprof2dot-0_p20100216-python3.patch | 489 |
1 files changed, 0 insertions, 489 deletions
diff --git a/dev-util/gprof2dot/files/gprof2dot-0_p20100216-python3.patch b/dev-util/gprof2dot/files/gprof2dot-0_p20100216-python3.patch deleted file mode 100644 index 875ccbc1ebd9..000000000000 --- a/dev-util/gprof2dot/files/gprof2dot-0_p20100216-python3.patch +++ /dev/null @@ -1,489 +0,0 @@ -From 6087a16e81d5c41647e05291dd25bb6eac9493eb Mon Sep 17 00:00:00 2001 -From: Sebastian Pipping <sebastian@pipping.org> -Date: Fri, 5 Nov 2010 18:10:29 +0100 -Subject: [PATCH] Support both Python 2.x and 3.x - ---- - gprof2dot.py | 138 ++++++++++++++++++++++++++++++++++------------------------ - 1 files changed, 81 insertions(+), 57 deletions(-) - -diff --git a/gprof2dot.py b/gprof2dot.py -index bf0aba8..888081f 100755 ---- a/gprof2dot.py -+++ b/gprof2dot.py -@@ -32,6 +32,27 @@ import optparse - import xml.parsers.expat - - -+# Python 2.x/3.x compatibility -+if sys.version_info[0] == 3: -+ PYTHON_3 = True -+ def compat_iteritems(x): return x.items() # No iteritems() in Python 3 -+ def compat_itervalues(x): return x.values() # No itervalues() in Python 3 -+ def compat_keys(x): return list(x.keys()) # keys() is a generator in Python 3 -+ compat_basestring = str # No class basestring in Python 3 -+ -+ CALL_TIMES_FORMAT = "%u\xd7" # All strings are unicode in Python 3, no u"" marking -+else: -+ PYTHON_3 = False -+ def compat_iteritems(x): return x.iteritems() -+ def compat_itervalues(x): return x.itervalues() -+ def compat_keys(x): return x.keys() -+ compat_basestring = basestring -+ -+ # u"" strings not supported in Python 3 -+ # By using eval() we don't get a syntax error -+ CALL_TIMES_FORMAT = eval('u"%u\xd7"') -+ -+ - try: - # Debugging helper module - import debug -@@ -40,7 +61,7 @@ except ImportError: - - - def times(x): -- return u"%u\xd7" % (x,) -+ return CALL_TIMES_FORMAT % (x,) - - def percentage(p): - return "%.02f%%" % (p*100.0,) -@@ -236,8 +257,8 @@ class Profile(Object): - def validate(self): - """Validate the edges.""" - -- for function in self.functions.itervalues(): -- for callee_id in function.calls.keys(): -+ for function in compat_itervalues(self.functions): -+ for callee_id in compat_keys(function.calls): - assert function.calls[callee_id].callee_id == callee_id - if callee_id not in self.functions: - sys.stderr.write('warning: call to undefined function %s from function %s\n' % (str(callee_id), function.name)) -@@ -248,11 +269,11 @@ class Profile(Object): - - # Apply the Tarjan's algorithm successively until all functions are visited - visited = set() -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - if function not in visited: - self._tarjan(function, 0, [], {}, {}, visited) - cycles = [] -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - if function.cycle is not None and function.cycle not in cycles: - cycles.append(function.cycle) - self.cycles = cycles -@@ -275,7 +296,7 @@ class Profile(Object): - order += 1 - pos = len(stack) - stack.append(function) -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - callee = self.functions[call.callee_id] - # TODO: use a set to optimize lookup - if callee not in orders: -@@ -299,10 +320,10 @@ class Profile(Object): - for cycle in self.cycles: - cycle_totals[cycle] = 0.0 - function_totals = {} -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - function_totals[function] = 0.0 -- for function in self.functions.itervalues(): -- for call in function.calls.itervalues(): -+ for function in compat_itervalues(self.functions): -+ for call in compat_itervalues(function.calls): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - function_totals[callee] += call[event] -@@ -310,8 +331,8 @@ class Profile(Object): - cycle_totals[callee.cycle] += call[event] - - # Compute the ratios -- for function in self.functions.itervalues(): -- for call in function.calls.itervalues(): -+ for function in compat_itervalues(self.functions): -+ for call in compat_itervalues(function.calls): - assert call.ratio is None - if call.callee_id != function.id: - callee = self.functions[call.callee_id] -@@ -332,10 +353,10 @@ class Profile(Object): - - # Sanity checking - assert outevent not in self -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - assert outevent not in function - assert inevent in function -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - assert outevent not in call - if call.callee_id != function.id: - assert call.ratio is not None -@@ -343,13 +364,13 @@ class Profile(Object): - # Aggregate the input for each cycle - for cycle in self.cycles: - total = inevent.null() -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - total = inevent.aggregate(total, function[inevent]) - self[inevent] = total - - # Integrate along the edges - total = inevent.null() -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - total = inevent.aggregate(total, function[inevent]) - self._integrate_function(function, outevent, inevent) - self[outevent] = total -@@ -360,7 +381,7 @@ class Profile(Object): - else: - if outevent not in function: - total = function[inevent] -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - if call.callee_id != function.id: - total += self._integrate_call(call, outevent, inevent) - function[outevent] = total -@@ -381,7 +402,7 @@ class Profile(Object): - total = inevent.null() - for member in cycle.functions: - subtotal = member[inevent] -- for call in member.calls.itervalues(): -+ for call in compat_itervalues(member.calls): - callee = self.functions[call.callee_id] - if callee.cycle is not cycle: - subtotal += self._integrate_call(call, outevent, inevent) -@@ -390,9 +411,9 @@ class Profile(Object): - - # Compute the time propagated to callers of this cycle - callees = {} -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - if function.cycle is not cycle: -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - callee = self.functions[call.callee_id] - if callee.cycle is cycle: - try: -@@ -403,7 +424,7 @@ class Profile(Object): - for member in cycle.functions: - member[outevent] = outevent.null() - -- for callee, call_ratio in callees.iteritems(): -+ for callee, call_ratio in compat_iteritems(callees): - ranks = {} - call_ratios = {} - partials = {} -@@ -418,7 +439,7 @@ class Profile(Object): - def _rank_cycle_function(self, cycle, function, rank, ranks): - if function not in ranks or ranks[function] > rank: - ranks[function] = rank -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is cycle: -@@ -427,7 +448,7 @@ class Profile(Object): - def _call_ratios_cycle(self, cycle, function, ranks, call_ratios, visited): - if function not in visited: - visited.add(function) -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is cycle: -@@ -438,7 +459,7 @@ class Profile(Object): - def _integrate_cycle_function(self, cycle, function, partial_ratio, partials, ranks, call_ratios, outevent, inevent): - if function not in partials: - partial = partial_ratio*function[inevent] -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is not cycle: -@@ -465,7 +486,7 @@ class Profile(Object): - """Aggregate an event for the whole profile.""" - - total = event.null() -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - try: - total = event.aggregate(total, function[event]) - except UndefinedEvent: -@@ -475,11 +496,11 @@ class Profile(Object): - def ratio(self, outevent, inevent): - assert outevent not in self - assert inevent in self -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - assert outevent not in function - assert inevent in function - function[outevent] = ratio(function[inevent], self[inevent]) -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - assert outevent not in call - if inevent in call: - call[outevent] = ratio(call[inevent], self[inevent]) -@@ -489,13 +510,13 @@ class Profile(Object): - """Prune the profile""" - - # compute the prune ratios -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - try: - function.weight = function[TOTAL_TIME_RATIO] - except UndefinedEvent: - pass - -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - callee = self.functions[call.callee_id] - - if TOTAL_TIME_RATIO in call: -@@ -509,24 +530,24 @@ class Profile(Object): - pass - - # prune the nodes -- for function_id in self.functions.keys(): -+ for function_id in compat_keys(self.functions): - function = self.functions[function_id] - if function.weight is not None: - if function.weight < node_thres: - del self.functions[function_id] - - # prune the egdes -- for function in self.functions.itervalues(): -- for callee_id in function.calls.keys(): -+ for function in compat_itervalues(self.functions): -+ for callee_id in compat_keys(function.calls): - call = function.calls[callee_id] - if callee_id not in self.functions or call.weight is not None and call.weight < edge_thres: - del function.calls[callee_id] - - def dump(self): -- for function in self.functions.itervalues(): -+ for function in compat_itervalues(self.functions): - sys.stderr.write('Function %s:\n' % (function.name,)) - self._dump_events(function.events) -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - callee = self.functions[call.callee_id] - sys.stderr.write(' Call %s:\n' % (callee.name,)) - self._dump_events(call.events) -@@ -537,7 +558,7 @@ class Profile(Object): - sys.stderr.write(' Function %s\n' % (function.name,)) - - def _dump_events(self, events): -- for event, value in events.iteritems(): -+ for event, value in compat_iteritems(events): - sys.stderr.write(' %s: %s\n' % (event.name, event.format(value))) - - -@@ -695,7 +716,7 @@ class XmlTokenizer: - self.final = len(data) < size - try: - self.parser.Parse(data, self.final) -- except xml.parsers.expat.ExpatError, e: -+ except xml.parsers.expat.ExpatError as e: - #if e.code == xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS: - if e.code == 3: - pass -@@ -801,7 +822,7 @@ class GprofParser(Parser): - """Extract a structure from a match object, while translating the types in the process.""" - attrs = {} - groupdict = mo.groupdict() -- for name, value in groupdict.iteritems(): -+ for name, value in compat_iteritems(groupdict): - if value is None: - value = None - elif self._int_re.match(value): -@@ -977,7 +998,7 @@ class GprofParser(Parser): - for index in self.cycles.iterkeys(): - cycles[index] = Cycle() - -- for entry in self.functions.itervalues(): -+ for entry in compat_itervalues(self.functions): - # populate the function - function = Function(entry.index, entry.name) - function[TIME] = entry.self -@@ -1019,7 +1040,7 @@ class GprofParser(Parser): - - profile[TIME] = profile[TIME] + function[TIME] - -- for cycle in cycles.itervalues(): -+ for cycle in compat_itervalues(cycles): - profile.add_cycle(cycle) - - # Compute derived events -@@ -1350,7 +1371,7 @@ class OprofileParser(LineParser): - self.update_subentries_dict(callees_total, callees) - - def update_subentries_dict(self, totals, partials): -- for partial in partials.itervalues(): -+ for partial in compat_itervalues(partials): - try: - total = totals[partial.id] - except KeyError: -@@ -1372,7 +1393,7 @@ class OprofileParser(LineParser): - - # populate the profile - profile[SAMPLES] = 0 -- for _callers, _function, _callees in self.entries.itervalues(): -+ for _callers, _function, _callees in compat_itervalues(self.entries): - function = Function(_function.id, _function.name) - function[SAMPLES] = _function.samples - profile.add_function(function) -@@ -1384,10 +1405,10 @@ class OprofileParser(LineParser): - function.module = os.path.basename(_function.image) - - total_callee_samples = 0 -- for _callee in _callees.itervalues(): -+ for _callee in compat_itervalues(_callees): - total_callee_samples += _callee.samples - -- for _callee in _callees.itervalues(): -+ for _callee in compat_itervalues(_callees): - if not _callee.self: - call = Call(_callee.id) - call[SAMPLES2] = _callee.samples -@@ -1548,7 +1569,7 @@ class SysprofParser(XmlParser): - profile = Profile() - - profile[SAMPLES] = 0 -- for id, object in objects.iteritems(): -+ for id, object in compat_iteritems(objects): - # Ignore fake objects (process names, modules, "Everything", "kernel", etc.) - if object['self'] == 0: - continue -@@ -1558,7 +1579,7 @@ class SysprofParser(XmlParser): - profile.add_function(function) - profile[SAMPLES] += function[SAMPLES] - -- for id, node in nodes.iteritems(): -+ for id, node in compat_iteritems(nodes): - # Ignore fake calls - if node['self'] == 0: - continue -@@ -1672,7 +1693,7 @@ class SharkParser(LineParser): - - profile = Profile() - profile[SAMPLES] = 0 -- for _function, _callees in self.entries.itervalues(): -+ for _function, _callees in compat_itervalues(self.entries): - function = Function(_function.id, _function.name) - function[SAMPLES] = _function.samples - profile.add_function(function) -@@ -1681,7 +1702,7 @@ class SharkParser(LineParser): - if _function.image: - function.module = os.path.basename(_function.image) - -- for _callee in _callees.itervalues(): -+ for _callee in compat_itervalues(_callees): - call = Call(_callee.id) - call[SAMPLES] = _callee.samples - function.add_call(call) -@@ -1965,7 +1986,8 @@ class PstatsParser: - self.profile = Profile() - self.function_ids = {} - -- def get_function_name(self, (filename, line, name)): -+ def get_function_name(self, info): -+ filename, line, name = info - module = os.path.splitext(filename)[0] - module = os.path.basename(module) - return "%s:%d:%s" % (module, line, name) -@@ -1986,14 +2008,14 @@ class PstatsParser: - def parse(self): - self.profile[TIME] = 0.0 - self.profile[TOTAL_TIME] = self.stats.total_tt -- for fn, (cc, nc, tt, ct, callers) in self.stats.stats.iteritems(): -+ for fn, (cc, nc, tt, ct, callers) in compat_iteritems(self.stats.stats): - callee = self.get_function(fn) - callee.called = nc - callee[TOTAL_TIME] = ct - callee[TIME] = tt - self.profile[TIME] += tt - self.profile[TOTAL_TIME] = max(self.profile[TOTAL_TIME], ct) -- for fn, value in callers.iteritems(): -+ for fn, value in compat_iteritems(callers): - caller = self.get_function(fn) - call = Call(callee.id) - if isinstance(value, tuple): -@@ -2190,7 +2212,7 @@ class DotWriter: - self.attr('node', fontname=fontname, shape="box", style="filled", fontcolor="white", width=0, height=0) - self.attr('edge', fontname=fontname) - -- for function in profile.functions.itervalues(): -+ for function in compat_itervalues(profile.functions): - labels = [] - if function.process is not None: - labels.append(function.process) -@@ -2202,7 +2224,7 @@ class DotWriter: - label = event.format(function[event]) - labels.append(label) - if function.called is not None: -- labels.append(u"%u\xd7" % (function.called,)) -+ labels.append(CALL_TIMES_FORMAT % (function.called,)) - - if function.weight is not None: - weight = function.weight -@@ -2217,7 +2239,7 @@ class DotWriter: - fontsize = "%.2f" % theme.node_fontsize(weight), - ) - -- for call in function.calls.itervalues(): -+ for call in compat_itervalues(function.calls): - callee = profile.functions[call.callee_id] - - labels = [] -@@ -2278,7 +2300,7 @@ class DotWriter: - return - self.write(' [') - first = True -- for name, value in attrs.iteritems(): -+ for name, value in compat_iteritems(attrs): - if first: - first = False - else: -@@ -2291,7 +2313,7 @@ class DotWriter: - def id(self, id): - if isinstance(id, (int, float)): - s = str(id) -- elif isinstance(id, basestring): -+ elif isinstance(id, compat_basestring): - if id.isalnum() and not id.startswith('0x'): - s = id - else: -@@ -2300,7 +2322,8 @@ class DotWriter: - raise TypeError - self.write(s) - -- def color(self, (r, g, b)): -+ def color(self, rgb): -+ r, g, b = rgb - - def float2int(f): - if f <= 0.0: -@@ -2312,7 +2335,8 @@ class DotWriter: - return "#" + "".join(["%02x" % float2int(c) for c in (r, g, b)]) - - def escape(self, s): -- s = s.encode('utf-8') -+ if not PYTHON_3: -+ s = s.encode('utf-8') - s = s.replace('\\', r'\\') - s = s.replace('\n', r'\n') - s = s.replace('\t', r'\t') -@@ -2505,7 +2529,7 @@ class Main: - profile = self.profile - profile.prune(self.options.node_thres/100.0, self.options.edge_thres/100.0) - -- for function in profile.functions.itervalues(): -+ for function in compat_itervalues(profile.functions): - function.name = self.compress_function_name(function.name) - - dot.graph(profile, self.theme) --- -1.7.3.2 - |