| 26 | """ |
| 27 | |
| 28 | class function: |
| 29 | def __init__(self, funcaddr, funcname): |
| 30 | self.funcaddr = funcaddr |
| 31 | self.funcname = funcname |
| 32 | self.basic_stack_usage = 0 |
| 33 | self.max_stack_usage = None |
| 34 | self.yield_usage = -1 |
| 35 | self.max_yield_usage = None |
| 36 | self.total_calls = 0 |
| 37 | # called_funcs = [(insnaddr, calladdr, stackusage), ...] |
| 38 | self.called_funcs = [] |
| 39 | self.subfuncs = {} |
| 40 | # Update function info with a found "yield" point. |
| 41 | def noteYield(self, stackusage): |
| 42 | if self.yield_usage < stackusage: |
| 43 | self.yield_usage = stackusage |
| 44 | # Update function info with a found "call" point. |
| 45 | def noteCall(self, insnaddr, calladdr, stackusage): |
| 46 | if (calladdr, stackusage) in self.subfuncs: |
| 47 | # Already noted a nearly identical call - ignore this one. |
| 48 | return |
| 49 | self.called_funcs.append((insnaddr, calladdr, stackusage)) |
| 50 | self.subfuncs[(calladdr, stackusage)] = 1 |
| 51 | |
| 52 | # Find out maximum stack usage for a function |
| 53 | def calcmaxstack(info, funcs): |