-
Notifications
You must be signed in to change notification settings - Fork 99
/
Copy pathbuilders.py
60 lines (46 loc) · 1.7 KB
/
builders.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import abc
import os
from os.path import dirname
from puncover.backtrace_helper import BacktraceHelper
import pathlib
class Builder:
def __init__(self, collector, src_root):
self.files = {}
self.collector = collector
self.backtrace_helper = BacktraceHelper(collector)
self.src_root = pathlib.Path(src_root)
def store_file_time(self, path, store_empty=False):
self.files[path] = 0 if store_empty else os.path.getmtime(path)
def build(self):
for f in self.files.keys():
self.store_file_time(f)
self.collector.reset()
self.collector.parse_elf(self.get_elf_path())
self.collector.enhance(self.src_root)
self.collector.parse_su_dir(self.get_su_dir())
self.build_call_trees()
def needs_build(self):
return any([os.path.getmtime(f) > t for f,t in self.files.items()])
def build_if_needed(self):
if self.needs_build():
self.build()
@abc.abstractmethod
def get_elf_path(self):
pass
@abc.abstractmethod
def get_su_dir(self):
pass
def build_call_trees(self):
for f in self.collector.all_functions():
self.backtrace_helper.deepest_callee_tree(f)
self.backtrace_helper.deepest_caller_tree(f)
class ElfBuilder(Builder):
def __init__(self, collector, src_root, elf_file, su_dir):
Builder.__init__(self, collector, src_root if src_root else dirname(dirname(elf_file)))
self.store_file_time(elf_file, store_empty=True)
self.elf_file = pathlib.Path(elf_file)
self.su_dir = su_dir
def get_elf_path(self):
return self.elf_file
def get_su_dir(self):
return self.su_dir