summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Node
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-03-19 16:01:59 (GMT)
committerSteven Knight <knight@baldmt.com>2002-03-19 16:01:59 (GMT)
commit70d4bf67b7fefce28d76d451c959ba633720214e (patch)
tree17c6cc06738b1ab2d0c91828c3138a263ce007b0 /src/engine/SCons/Node
parent1d0c4df93b2120fe494da4a2e1f40b20fe0245be (diff)
downloadSCons-70d4bf67b7fefce28d76d451c959ba633720214e.zip
SCons-70d4bf67b7fefce28d76d451c959ba633720214e.tar.gz
SCons-70d4bf67b7fefce28d76d451c959ba633720214e.tar.bz2
Enhance the Walker to call a third supplied function to actually work on a Node, and pass the parent Node to both the out-of-date-check function and the work function. Refactor Taskmaster to use the new Walker function.
Diffstat (limited to 'src/engine/SCons/Node')
-rw-r--r--src/engine/SCons/Node/__init__.py18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py
index 4c54c53..ef12c6e 100644
--- a/src/engine/SCons/Node/__init__.py
+++ b/src/engine/SCons/Node/__init__.py
@@ -253,8 +253,9 @@ class Node:
self.children(),
1)
-def get_children(node): return node.children()
+def get_children(node, parent): return node.children()
def ignore_cycle(node, stack): pass
+def do_nothing(node, parent): pass
class Walker:
"""An iterator for walking a Node tree.
@@ -270,10 +271,13 @@ class Walker:
This class does not get caught in node cycles caused, for example,
by C header file include loops.
"""
- def __init__(self, node, kids_func=get_children, cycle_func=ignore_cycle):
+ def __init__(self, node, kids_func=get_children,
+ cycle_func=ignore_cycle,
+ eval_func=do_nothing):
self.kids_func = kids_func
self.cycle_func = cycle_func
- node.wkids = copy.copy(kids_func(node))
+ self.eval_func = eval_func
+ node.wkids = copy.copy(kids_func(node, None))
self.stack = [node]
self.history = {} # used to efficiently detect and avoid cycles
self.history[node] = None
@@ -293,12 +297,18 @@ class Walker:
if self.history.has_key(node):
self.cycle_func(node, self.stack)
else:
- node.wkids = copy.copy(self.kids_func(node))
+ node.wkids = copy.copy(self.kids_func(node, self.stack[-1]))
self.stack.append(node)
self.history[node] = None
else:
node = self.stack.pop()
del self.history[node]
+ if node:
+ if self.stack:
+ parent = self.stack[-1]
+ else:
+ parent = None
+ self.eval_func(node, parent)
return node
def is_done(self):