#
# Class for printing reports on profiled python code. rev 1.0  4/1/94
#
# Based on prior profile module by Sjoerd Mullender...
#   which was hacked somewhat by: Guido van Rossum
#
# see profile.doc and profile.py for more info.

# Copyright 1994, by InfoSeek Corporation, all rights reserved.
# Written by James Roskind
# 
# Permission to use, copy, modify, and distribute this Python software
# and its associated documentation for any purpose (subject to the
# restriction in the following sentence) without fee is hereby granted,
# provided that the above copyright notice appears in all copies, and
# that both that copyright notice and this permission notice appear in
# supporting documentation, and that the name of InfoSeek not be used in
# advertising or publicity pertaining to distribution of the software
# without specific, written prior permission.  This permission is
# explicitly restricted to the copying and modification of the software
# to remain in Python, compiled Python, or other languages (such as C)
# wherein the modified or derived code is exclusively imported into a
# Python module.
# 
# INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY
# SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.


import os
import time
import string
import marshal
import re

#**************************************************************************
# Class Stats documentation
#**************************************************************************
# This class is used for creating reports from data generated by the
# Profile class.  It is a "friend" of that class, and imports data either
# by direct access to members of Profile class, or by reading in a dictionary
# that was emitted (via marshal) from the Profile class.
#
# The big change from the previous Profiler (in terms of raw functionality)
# is that an "add()" method has been provided to combine Stats from
# several distinct profile runs.  Both the constructor and the add()
# method now take arbitrarilly many file names as arguments.
#
# All the print methods now take an argument that indicats how many lines
# to print.  If the arg is a floating point number between 0 and 1.0, then
# it is taken as a decimal percentage of the availabel lines to be printed
# (e.g., .1 means print 10% of all available lines).  If it is an integer,
# it is taken to mean the number of lines of data that you wish to have
# printed.
#
# The sort_stats() method now processes some additionaly options (i.e., in
# addition to the old -1, 0, 1, or 2).  It takes an arbitrary number of quoted
# strings to select the sort order.  For example sort_stats('time', 'name')
# sorts on the major key of "internal function time", and on the minor
# key of 'the name of the function'.  Look at the two tables in sort_stats()
# and get_sort_arg_defs(self) for more examples.
#
# All methods now return "self",  so you can string together commands like:
#    Stats('foo', 'goo').strip_dirs().sort_stats('calls').\
#                               print_stats(5).print_callers(5)
# 
#**************************************************************************
import fpformat

class Stats:
	def __init__(self, *args):
		if not len(args):
			arg = None
		else:
			arg = args[0]
			args = args[1:]
		self.init(arg)
		apply(self.add, args).ignore()
			
	def init(self, arg):
		self.all_callees = None  # calc only if needed
		self.files = []
		self.fcn_list = None
		self.total_tt = 0
		self.total_calls = 0
		self.prim_calls = 0
		self.max_name_len = 0
		self.top_level = {}
		self.stats = {}
		self.sort_arg_dict = {}
		self.load_stats(arg)
		trouble = 1
		try:
			self.get_top_level_stats()
			trouble = 0
		finally:
			if trouble:
				print "Invalid timing data",
				if self.files: print self.files[-1],
				print


	def load_stats(self, arg):
		if not arg:  self.stats = {}
		elif type(arg) == type(""):
			f = open(arg, 'rb')
			self.stats = marshal.load(f)
			f.close()
			try:
				file_stats = os.stat(arg)
				arg = time.ctime(file_stats[8]) + "    " + arg
			except:  # in case this is not unix
				pass
			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 " \
				  + `self.__class__` \
				  + " object from '" + `arg` + "'"
		return

	def get_top_level_stats(self):
		for func in self.stats.keys():
			cc, nc, tt, ct, callers = self.stats[func]
			self.total_calls = self.total_calls + nc
			self.prim_calls  = self.prim_calls  + cc
			self.total_tt    = self.total_tt    + tt
			if callers.has_key(("jprofile", 0, "profiler")):
				self.top_level[func] = None
			if len(func_std_string(func)) > self.max_name_len:
				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: apply(self.add, arg_list[1:])
		other = arg_list[0]
		if type(self) != type(other) or \
			  self.__class__ != other.__class__:
			other = Stats(other)
		self.files = self.files + other.files
		self.total_calls = self.total_calls + other.total_calls
		self.prim_calls = self.prim_calls + other.prim_calls
		self.total_tt = self.total_tt + other.total_tt
		for func in other.top_level.keys():
			self.top_level[func] = None

		if self.max_name_len < other.max_name_len:
			self.max_name_len = other.max_name_len

		self.fcn_list = None

		for func in other.stats.keys():
			if self.stats.has_key(func):
				old_func_stat = self.stats[func]
			else:
				old_func_stat = (0, 0, 0, 0, {},)
			self.stats[func] = add_func_stats(old_func_stat, \
				  other.stats[func])
		return self
			


	# list the tuple indicies and directions for sorting,
	# along with some printable description
	sort_arg_dict_default = {\
		  "calls"     : (((1,-1),              ), "call count"),\
		  "cumulative": (((3,-1),              ), "cumulative time"),\
		  "file"      : (((4, 1),              ), "file name"),\
		  "line"      : (((5, 1),              ), "line number"),\
		  "module"    : (((4, 1),              ), "file name"),\
		  "name"      : (((6, 1),              ), "function name"),\
		  "nfl"       : (((6, 1),(4, 1),(5, 1),), "name/file/line"), \
		  "pcalls"    : (((0,-1),              ), "call count"),\
		  "stdname"   : (((7, 1),              ), "standard name"),\
		  "time"      : (((2,-1),              ), "internal time"),\
		  }

	# Expand all abbreviations that are unique
	def get_sort_arg_defs(self):
		if not self.sort_arg_dict:
			self.sort_arg_dict = dict = {}
			std_list = dict.keys()
			bad_list = {}
			for word in self.sort_arg_dict_default.keys():
				fragment = word
				while fragment:
					if not fragment:
						break
					if dict.has_key(fragment):
						bad_list[fragment] = 0
						break
					dict[fragment] = self. \
						  sort_arg_dict_default[word]
					fragment = fragment[:-1]
			for word in bad_list.keys():
				del dict[word]
		return self.sort_arg_dict
			

	def sort_stats(self, *field):
		if not field:
			self.fcn_list = 0
			return self
		if len(field) == 1 and type(field[0]) == type(1):
			# Be compatible with old profiler
			field = [ {-1: "stdname", \
				  0:"calls", \
				  1:"time", \
				  2: "cumulative" }  [ field[0] ] ]

		sort_arg_defs = self.get_sort_arg_defs()
		sort_tuple = ()
		self.sort_type = ""
		connector = ""
		for word in field:
			sort_tuple = sort_tuple + sort_arg_defs[word][0]
			self.sort_type = self.sort_type + connector + \
				  sort_arg_defs[word][1]
			connector = ", "
					
		stats_list = []
		for func in self.stats.keys():
			cc, nc, tt, ct, callers = self.stats[func]
			stats_list.append((cc, nc, tt, ct) + func_split(func) \
				           + (func_std_string(func), func,)  )

		stats_list.sort(TupleComp(sort_tuple).compare)

		self.fcn_list = fcn_list = []
		for tuple in stats_list:
			fcn_list.append(tuple[-1])
		return self


	def reverse_order(self):
		if self.fcn_list: self.fcn_list.reverse()
		return self

	def strip_dirs(self):
		oldstats = self.stats
		self.stats = newstats = {}
		max_name_len = 0
		for func in oldstats.keys():
			cc, nc, tt, ct, callers = oldstats[func]
			newfunc = func_strip_path(func)
			if len(func_std_string(newfunc)) > max_name_len:
				max_name_len = len(func_std_string(newfunc))
			newcallers = {}
			for func2 in callers.keys():
				newcallers[func_strip_path(func2)] = \
					  callers[func2]

			if newstats.has_key(newfunc):
				newstats[newfunc] = add_func_stats( \
					  newstats[newfunc],\
					  (cc, nc, tt, ct, newcallers))
			else:
				newstats[newfunc] = (cc, nc, tt, ct, newcallers)
		old_top = self.top_level
		self.top_level = new_top = {}
		for func in old_top.keys():
			new_top[func_strip_path(func)] = None

		self.max_name_len = max_name_len

		self.fcn_list = None
		self.all_callees = None
		return self



	def calc_callees(self):
		if self.all_callees: return
		self.all_callees = all_callees = {}
		for func in self.stats.keys():
			if not all_callees.has_key(func):
				all_callees[func] = {}
			cc, nc, tt, ct, callers = self.stats[func]
			for func2 in callers.keys():
				if not all_callees.has_key(func2):
					all_callees[func2] = {}
				all_callees[func2][func]  = callers[func2]
		return

        #******************************************************************
	# The following functions support actual printing of reports
        #******************************************************************

	# Optional "amount" is either a line count, or a percentage of lines.

	def eval_print_amount(self, sel, list, msg):
		new_list = list
		if type(sel) == type(""):
			new_list = []
			for func in list:
				if re.search(sel, func_std_string(func)):
					new_list.append(func)
		else:
			count = len(list)
			if type(sel) == type(1.0) and 0.0 <= sel < 1.0:
				count = int (count * sel + .5)
				new_list = list[:count]
			elif type(sel) == type(1) and 0 <= sel < count:
				count = sel
				new_list = list[:count]
		if len(list) != len(new_list):
			msg = msg + "   List reduced from " + `len(list)` \
				  + " to " + `len(new_list)` + \
				  " due to restriction <" + `sel` + ">\n"
			
		return new_list, msg



	def get_print_list(self, sel_list):
		width = self.max_name_len
		if self.fcn_list:
			list = self.fcn_list[:]
			msg = "   Ordered by: " + self.sort_type + '\n'
		else:
			list = self.stats.keys()
			msg = "   Random listing order was used\n"

		for selection in sel_list:
			list,msg = self.eval_print_amount(selection, list, msg)

		count = len(list)

		if not list:
			return 0, list
		print msg
		if count < len(self.stats):
			width = 0
			for func in list:
				if  len(func_std_string(func)) > width:
					width = len(func_std_string(func))
		return width+2, list
		
	def print_stats(self, *amount):
		for filename in self.files:
			print filename
		if self.files: print
		indent = "        "
		for func in self.top_level.keys():
			print indent, func_get_function_name(func)
		
		print  indent, self.total_calls, "function calls",
		if self.total_calls != self.prim_calls:
			print "(" + `self.prim_calls`, "primitive calls)", 
		print "in", fpformat.fix(self.total_tt, 3), "CPU seconds"
		print
		width, list = self.get_print_list(amount)
		if list:
			self.print_title()
			for func in list:
				self.print_line(func)
			print 
			print
		return self

			
	def print_callees(self, *amount):
		width, list = self.get_print_list(amount)
		if list:
			self.calc_callees()

			self.print_call_heading(width, "called...")
			for func in list:
				if self.all_callees.has_key(func):
					self.print_call_line(width, \
						  func, self.all_callees[func])
				else:
					self.print_call_line(width, func, {})
			print
			print
		return self

	def print_callers(self, *amount):
		width, list = self.get_print_list(amount)
		if list:
			self.print_call_heading(width, "was called by...")
			for func in list:
				cc, nc, tt, ct, callers = self.stats[func]
				self.print_call_line(width, func, callers)
			print
			print
		return self

	def print_call_heading(self, name_size, column_title):
		print string.ljust("Function ", name_size) + column_title


	def print_call_line(self, name_size, source, call_dict):
		print string.ljust(func_std_string(source), name_size),
		if not call_dict:
			print "--"
			return
		clist = call_dict.keys()
		clist.sort()
		name_size = name_size + 1
		indent = ""
		for func in clist:
			name = func_std_string(func)
			print indent*name_size + name + '(' \
				  + `call_dict[func]`+')', \
				  f8(self.stats[func][3])
			indent = " "



	def print_title(self):
		print string.rjust('ncalls', 9),
		print string.rjust('tottime', 8),
		print string.rjust('percall', 8),
		print string.rjust('cumtime', 8),
		print string.rjust('percall', 8),
		print 'filename:lineno(function)'


	def print_line(self, func):  # hack : should print percentages
		cc, nc, tt, ct, callers = self.stats[func]
		c = `nc`
		if nc != cc:
			c = c + '/' + `cc`
		print string.rjust(c, 9),
		print f8(tt),
		if nc == 0:
			print ' '*8,
		else:
			print f8(tt/nc),
		print f8(ct),
		if cc == 0:
			print ' '*8,
		else:
			print f8(ct/cc),
		print func_std_string(func)


	def ignore(self):
		pass # has no return value, so use at end of line :-)


#**************************************************************************
# class TupleComp Documentation
#**************************************************************************
# This class provides a generic function for comparing any two tuples.
# Each instance records a list of tuple-indicies (from most significant
# to least significant), and sort direction (ascending or decending) for
# each tuple-index.  The compare functions can then be used as the function
# argument to the system sort() function when a list of tuples need to be
# sorted in the instances order.
#**************************************************************************
class TupleComp:
	def __init__(self, comp_select_list):
		self.comp_select_list = comp_select_list

	def compare (self, left, right):
		for index, direction in self.comp_select_list:
			l = left[index]
			r = right[index]
			if l < r:
				return -direction
			if l > r:
				return direction
		return 0

		

#**************************************************************************

def func_strip_path(func_name):
	file, line, name = func_name
	return os.path.basename(file), line, name

def func_get_function_name(func):
	return func[2]

def func_std_string(func_name): # match what old profile produced
	file, line, name = func_name
	return file + ":" + `line` + "(" + name + ")"

def func_split(func_name):
	return func_name

#**************************************************************************
# The following functions combine statists for pairs functions.
# The bulk of the processing involves correctly handling "call" lists,
# such as callers and callees. 
#**************************************************************************

    # Add together all the stats for two profile entries
def add_func_stats(target, source):				
	cc, nc, tt, ct, callers = source
	t_cc, t_nc, t_tt, t_ct, t_callers = target
	return (cc+t_cc, nc+t_nc, tt+t_tt, ct+t_ct, \
		  add_callers(t_callers, callers))


    # Combine two caller lists in a single list.
def add_callers(target, source):
	new_callers = {}
	for func in target.keys():
		new_callers[func] = target[func]
	for func in source.keys():
		if new_callers.has_key(func):
			new_callers[func] = source[func] + new_callers[func]
		else:
			new_callers[func] = source[func]
	return new_callers

     # Sum the caller statistics to get total number of calls recieved
def count_calls(callers):
	nc = 0
	for func in callers.keys():
		nc = nc + callers[func]
	return nc

#**************************************************************************
# The following functions support printing of reports
#**************************************************************************

def f8(x):
	return string.rjust(fpformat.fix(x, 3), 8)


