1*061da546Spatrick""" 2*061da546SpatrickObjective-C runtime wrapper for use by LLDB Python formatters 3*061da546Spatrick 4*061da546SpatrickPart of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*061da546SpatrickSee https://llvm.org/LICENSE.txt for license information. 6*061da546SpatrickSPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*061da546Spatrick""" 8*061da546Spatrickimport lldb 9*061da546Spatrickimport time 10*061da546Spatrickimport datetime 11*061da546Spatrickimport inspect 12*061da546Spatrick 13*061da546Spatrick 14*061da546Spatrickclass TimeMetrics: 15*061da546Spatrick 16*061da546Spatrick @staticmethod 17*061da546Spatrick def generate(label=None): 18*061da546Spatrick return TimeMetrics(label) 19*061da546Spatrick 20*061da546Spatrick def __init__(self, lbl=None): 21*061da546Spatrick self.label = "" if lbl is None else lbl 22*061da546Spatrick pass 23*061da546Spatrick 24*061da546Spatrick def __enter__(self): 25*061da546Spatrick caller = inspect.stack()[1] 26*061da546Spatrick self.function = str(caller) 27*061da546Spatrick self.enter_time = time.clock() 28*061da546Spatrick 29*061da546Spatrick def __exit__(self, a, b, c): 30*061da546Spatrick self.exit_time = time.clock() 31*061da546Spatrick print("It took " + str(self.exit_time - self.enter_time) + 32*061da546Spatrick " time units to run through " + self.function + self.label) 33*061da546Spatrick return False 34*061da546Spatrick 35*061da546Spatrick 36*061da546Spatrickclass Counter: 37*061da546Spatrick 38*061da546Spatrick def __init__(self): 39*061da546Spatrick self.count = 0 40*061da546Spatrick self.list = [] 41*061da546Spatrick 42*061da546Spatrick def update(self, name): 43*061da546Spatrick self.count = self.count + 1 44*061da546Spatrick # avoid getting the full dump of this ValueObject just to save its 45*061da546Spatrick # metrics 46*061da546Spatrick if isinstance(name, lldb.SBValue): 47*061da546Spatrick self.list.append(name.GetName()) 48*061da546Spatrick else: 49*061da546Spatrick self.list.append(str(name)) 50*061da546Spatrick 51*061da546Spatrick def __str__(self): 52*061da546Spatrick return str(self.count) + " times, for items [" + str(self.list) + "]" 53*061da546Spatrick 54*061da546Spatrick 55*061da546Spatrickclass MetricsPrinter_Verbose: 56*061da546Spatrick 57*061da546Spatrick def __init__(self, metrics): 58*061da546Spatrick self.metrics = metrics 59*061da546Spatrick 60*061da546Spatrick def __str__(self): 61*061da546Spatrick string = "" 62*061da546Spatrick for key, value in self.metrics.metrics.items(): 63*061da546Spatrick string = string + "metric " + str(key) + ": " + str(value) + "\n" 64*061da546Spatrick return string 65*061da546Spatrick 66*061da546Spatrick 67*061da546Spatrickclass MetricsPrinter_Compact: 68*061da546Spatrick 69*061da546Spatrick def __init__(self, metrics): 70*061da546Spatrick self.metrics = metrics 71*061da546Spatrick 72*061da546Spatrick def __str__(self): 73*061da546Spatrick string = "" 74*061da546Spatrick for key, value in self.metrics.metrics.items(): 75*061da546Spatrick string = string + "metric " + \ 76*061da546Spatrick str(key) + " was hit " + str(value.count) + " times\n" 77*061da546Spatrick return string 78*061da546Spatrick 79*061da546Spatrick 80*061da546Spatrickclass Metrics: 81*061da546Spatrick 82*061da546Spatrick def __init__(self): 83*061da546Spatrick self.metrics = {} 84*061da546Spatrick 85*061da546Spatrick def add_metric(self, name): 86*061da546Spatrick self.metrics[name] = Counter() 87*061da546Spatrick 88*061da546Spatrick def metric_hit(self, metric, trigger): 89*061da546Spatrick self.metrics[metric].update(trigger) 90*061da546Spatrick 91*061da546Spatrick def __getitem__(self, key): 92*061da546Spatrick return self.metrics[key] 93*061da546Spatrick 94*061da546Spatrick def __getattr__(self, name): 95*061da546Spatrick if name == 'compact': 96*061da546Spatrick return MetricsPrinter_Compact(self) 97*061da546Spatrick if name == 'verbose': 98*061da546Spatrick return MetricsPrinter_Verbose(self) 99*061da546Spatrick raise AttributeError("%r object has no attribute %r" % 100*061da546Spatrick (type(self).__name__, name)) 101*061da546Spatrick 102*061da546Spatrick def __str__(self): 103*061da546Spatrick return str(self.verbose) 104*061da546Spatrick 105*061da546Spatrick def metric_success(self, metric): 106*061da546Spatrick total_count = 0 107*061da546Spatrick metric_count = self[metric].count 108*061da546Spatrick for key, value in self.metrics.items(): 109*061da546Spatrick total_count = total_count + value.count 110*061da546Spatrick if total_count > 0: 111*061da546Spatrick return metric_count / float(total_count) 112*061da546Spatrick return 0 113