diff --git a/core/prof/prof.py b/core/prof/prof.py new file mode 100644 index 0000000000..fcb13017ce --- /dev/null +++ b/core/prof/prof.py @@ -0,0 +1,70 @@ +import sys + +import uos +from uio import open + +sys.path.insert(0, uos.getenv("TREZOR_SRC")) +del uos + + +class Coverage: + def __init__(self): + self.__files = {} + + def line_tick(self, filename, lineno): + if not filename in self.__files: + self.__files[filename] = set() + self.__files[filename].add(lineno) + + def lines_execution(self): + lines_execution = {"lines": {}} + lines = lines_execution["lines"] + this_file = globals()["__file__"] + for filename in self.__files: + if not filename == this_file: + lines[filename] = list(self.__files[filename]) + + return lines_execution + + +class _Prof: + trace_count = 0 + display_flags = 0 + __coverage = Coverage() + + def trace_tick(self, frame, event, arg): + self.trace_count += 1 + + # if frame.f_code.co_filename.endswith('/loop.py'): + # print(event, frame.f_code.co_filename, frame.f_lineno) + + if event == "line": + self.__coverage.line_tick(frame.f_code.co_filename, frame.f_lineno) + + def coverage_data(self): + return self.__coverage.lines_execution() + + +def trace_handler(frame, event, arg): + __prof__.trace_tick(frame, event, arg) + return trace_handler + + +def atexit(): + print("\n------------------ script exited ------------------") + print("Total traces executed: ", __prof__.trace_count) + with open(".coverage", "w") as f: + # wtf so private much beautiful wow + f.write("!coverage.py: This is a private format, don't read it directly!") + # poormans json + f.write(str(__prof__.coverage_data()).replace("'", '"')) + + +sys.atexit(atexit) + +global __prof__ +if not "__prof__" in globals(): + __prof__ = _Prof() + +sys.settrace(trace_handler) +import main