Home | History | Annotate | Download | only in cocoa
      1 """
      2 Objective-C runtime wrapper for use by LLDB Python formatters
      3 
      4 part of The LLVM Compiler Infrastructure
      5 This file is distributed under the University of Illinois Open Source
      6 License. See LICENSE.TXT for details.
      7 """
      8 import lldb
      9 import time, datetime
     10 import inspect
     11 
     12 class TimeMetrics:
     13 	@staticmethod
     14 	def generate(label=None):
     15 		return TimeMetrics(label)
     16 	
     17 	def __init__(self,lbl=None):
     18 		self.label = "" if lbl is None else lbl
     19 		pass
     20 	
     21 	def __enter__(self):
     22 		caller = inspect.stack()[1]
     23 		self.function = str(caller)
     24 		self.enter_time = time.clock()
     25 	
     26 	def __exit__(self, a,b,c):
     27 		self.exit_time = time.clock()
     28 		print "It took " + str(self.exit_time - self.enter_time) + " time units to run through " + self.function + self.label
     29 		return False
     30 
     31 class Counter:
     32 	def __init__(self):
     33 		self.count = 0
     34 		self.list = []
     35 	def update(self,name):
     36 		self.count = self.count + 1
     37 		# avoid getting the full dump of this ValueObject just to save its metrics
     38 		if isinstance(name,lldb.SBValue):
     39 			self.list.append(name.GetName())
     40 		else:
     41 			self.list.append(str(name))
     42 	def __str__(self):
     43 		return str(self.count) + " times, for items [" + str(self.list) + "]"
     44 
     45 class MetricsPrinter_Verbose:
     46 	def __init__(self,metrics):
     47 		self.metrics = metrics
     48 	def __str__(self):
     49 		string = ""
     50 		for key,value in self.metrics.metrics.items():
     51 			string = string + "metric " + str(key) + ": " + str(value) + "\n"
     52 		return string
     53 
     54 class MetricsPrinter_Compact:
     55 	def __init__(self,metrics):
     56 		self.metrics = metrics
     57 	def __str__(self):
     58 		string = ""
     59 		for key,value in self.metrics.metrics.items():
     60 			string = string + "metric " + str(key) + " was hit " + str(value.count) + " times\n"
     61 		return string
     62 
     63 class Metrics:
     64 	def __init__(self):
     65 		self.metrics = {}
     66 
     67 	def add_metric(self,name):
     68 		self.metrics[name] = Counter()
     69 
     70 	def metric_hit(self,metric,trigger):
     71 		self.metrics[metric].update(trigger)
     72 
     73 	def __getitem__(self,key):
     74 		return self.metrics[key]
     75 
     76 	def __getattr__(self,name):
     77 		if name == 'compact':
     78 			return MetricsPrinter_Compact(self)
     79 		if name == 'verbose':
     80 			return MetricsPrinter_Verbose(self)
     81 		raise AttributeError("%r object has no attribute %r" %
     82 			                         (type(self).__name__, name))
     83 
     84 	def __str__(self):
     85 		return str(self.verbose)
     86 
     87 	def metric_success(self,metric):
     88 		total_count = 0
     89 		metric_count = self[metric].count
     90 		for key,value in self.metrics.items():
     91 			total_count = total_count + value.count
     92 		if total_count > 0:
     93 			return metric_count / float(total_count)
     94 		return 0
     95