From ec9070f1387e9713236f3b8c47447df44447df23 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 14 Oct 2021 20:03:20 -0400 Subject: perf: reduce the overhead of recording branches --- coverage/collector.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'coverage/collector.py') 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"" @@ -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)) -- cgit v1.2.1