summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Node
diff options
context:
space:
mode:
authorWilliam Deegan <bill@baddogconsulting.com>2016-08-12 14:08:01 (GMT)
committerWilliam Deegan <bill@baddogconsulting.com>2016-08-12 14:08:01 (GMT)
commit18ed9b715d052ad972940e90e9d83da53216c289 (patch)
tree64e2b5d618624e0357ceb73fa0397bfd20e18655 /src/engine/SCons/Node
parent1d93e3871ee6858e3bc362aa4e9822c29aadb1a3 (diff)
parent3d4767acc37e29665fd43ac79981495b17253421 (diff)
downloadSCons-18ed9b715d052ad972940e90e9d83da53216c289.zip
SCons-18ed9b715d052ad972940e90e9d83da53216c289.tar.gz
SCons-18ed9b715d052ad972940e90e9d83da53216c289.tar.bz2
Merged in klimkin/scons/optimize-scan-path-subst-v2 (pull request #345)
Optimize implicit dependency scan
Diffstat (limited to 'src/engine/SCons/Node')
-rw-r--r--src/engine/SCons/Node/__init__.py22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py
index 51762a3..00ddf2f 100644
--- a/src/engine/SCons/Node/__init__.py
+++ b/src/engine/SCons/Node/__init__.py
@@ -930,9 +930,9 @@ class Node(object, with_metaclass(NoSlotsPyPy)):
scanner's recursive flag says that we should.
"""
nodes = [self]
- seen = {}
- seen[self] = 1
+ seen = set(nodes)
dependencies = []
+ path_memo = {}
root_node_scanner = self._get_scanner(env, initial_scanner, None, kw)
@@ -940,30 +940,32 @@ class Node(object, with_metaclass(NoSlotsPyPy)):
node = nodes.pop(0)
scanner = node._get_scanner(env, initial_scanner, root_node_scanner, kw)
-
if not scanner:
continue
- path = path_func(scanner)
+ try:
+ path = path_memo[scanner]
+ except KeyError:
+ path = path_func(scanner)
+ path_memo[scanner] = path
included_deps = [x for x in node.get_found_includes(env, scanner, path) if x not in seen]
if included_deps:
dependencies.extend(included_deps)
- for dep in included_deps:
- seen[dep] = 1
+ seen.update(included_deps)
nodes.extend(scanner.recurse_nodes(included_deps))
return dependencies
def _get_scanner(self, env, initial_scanner, root_node_scanner, kw):
- if not initial_scanner:
+ if initial_scanner:
+ # handle explicit scanner case
+ scanner = initial_scanner.select(self)
+ else:
# handle implicit scanner case
scanner = self.get_env_scanner(env, kw)
if scanner:
scanner = scanner.select(self)
- else:
- # handle explicit scanner case
- scanner = initial_scanner.select(self)
if not scanner:
# no scanner could be found for the given node's scanner key;