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