summaryrefslogtreecommitdiff
path: root/coverage/collector.py
diff options
context:
space:
mode:
Diffstat (limited to 'coverage/collector.py')
-rw-r--r--coverage/collector.py17
1 files changed, 11 insertions, 6 deletions
diff --git a/coverage/collector.py b/coverage/collector.py
index 72ab32b6..bc385fc2 100644
--- a/coverage/collector.py
+++ b/coverage/collector.py
@@ -9,6 +9,7 @@ import sys
from coverage import env
from coverage.backward import litems, range # pylint: disable=redefined-builtin
from coverage.debug import short_stack
+from coverage.disposition import FileDisposition
from coverage.files import abs_file
from coverage.misc import CoverageException, isolate_module
from coverage.pytracer import PyTracer
@@ -33,11 +34,6 @@ except ImportError:
CTracer = None
-class FileDisposition(object):
- """A simple value type for recording what to do with a file."""
- pass
-
-
def should_start_context(frame):
"""Who-Tests-What hack: Determine whether this frame begins a new who-context."""
fn_name = frame.f_code.co_name
@@ -107,6 +103,7 @@ class Collector(object):
self.origin = short_stack()
self.concur_id_func = None
+ self.abs_file_cache = {}
# We can handle a few concurrency options here, but only one at a time.
these_concurrencies = self.SUPPORTED_CONCURRENCIES.intersection(concurrency)
@@ -373,6 +370,14 @@ class Collector(object):
for tracer in self.tracers:
tracer.data = data
+ def cached_abs_file(self, filename):
+ """A locally cached version of `abs_file`."""
+ key = (type(filename), filename)
+ try:
+ return self.abs_file_cache[key]
+ except KeyError:
+ return self.abs_file_cache.setdefault(key, abs_file(filename))
+
def save_data(self, covdata):
"""Save the collected data to a `CoverageData`.
@@ -398,7 +403,7 @@ class Collector(object):
else:
raise runtime_err # pylint: disable=raising-bad-type
- return dict((abs_file(k), v) for k, v in items)
+ return dict((self.cached_abs_file(k), v) for k, v in items)
if self.branch:
covdata.add_arcs(abs_file_dict(self.data))