diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2021-10-14 18:32:41 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2021-10-14 18:59:00 -0400 |
commit | d93614d1cefe5520bbda82d50603b79901d87303 (patch) | |
tree | 09bf1111b1f6467ee99e0491f37bee176d8eec28 /coverage/collector.py | |
parent | a1101953f253754514e74d3d648c4d4ef9c0ad6c (diff) | |
download | python-coveragepy-git-nedbat/faster-branches.tar.gz |
perf: reduce the overhead of recording branchesnedbat/faster-branches
Diffstat (limited to 'coverage/collector.py')
-rw-r--r-- | coverage/collector.py | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/coverage/collector.py b/coverage/collector.py index 733b6f32..a72129e2 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -157,9 +157,11 @@ class Collector: if self._trace_class is CTracer: self.file_disposition_class = CFileDisposition self.supports_plugins = True + self.packed_arcs = True else: self.file_disposition_class = FileDisposition self.supports_plugins = False + self.packed_arcs = False def __repr__(self): return f"<Collector at 0x{id(self):x}: {self.tracer_name()}>" @@ -437,7 +439,25 @@ class Collector: return False if self.branch: - self.covdata.add_arcs(self.mapped_file_dict(self.data)) + if self.packed_arcs: + # Unpack the line number pairs packed into integers. See + # tracer.c:CTracer_record_pair for the C code that creates + # these packed ints. + data = {} + for fname, packeds in self.data.items(): + tuples = [] + for packed in packeds: + l1 = packed & 0xFFFFF + l2 = (packed & (0xFFFFF << 20)) >> 20 + if packed & (1 << 40): + l1 *= -1 + if packed & (1 << 41): + l2 *= -1 + tuples.append((l1, l2)) + data[fname] = tuples + else: + data = self.data + self.covdata.add_arcs(self.mapped_file_dict(data)) else: self.covdata.add_lines(self.mapped_file_dict(self.data)) |