1.1 --- a/micropython/data.py Thu Feb 25 01:22:21 2010 +0100
1.2 +++ b/micropython/data.py Fri Feb 26 01:26:01 2010 +0100
1.3 @@ -135,6 +135,7 @@
1.4
1.5 self.attribute_users = [{}] # stack of assignments
1.6 self.user_shelves = []
1.7 + self.loop_users = [{}] # stack of loop nodes
1.8
1.9 # Define attribute usage to identify active program sections.
1.10
1.11 @@ -330,13 +331,17 @@
1.12 with the given 'attrname'.
1.13 """
1.14
1.15 + for users in (self.attribute_users[-1], self.loop_users[-1]):
1.16 +
1.17 + # Add the usage to all current users.
1.18 +
1.19 + if users.has_key(name):
1.20 + for user in users[name]:
1.21 + user._attrnames[name].add(attrname)
1.22 +
1.23 users = self.attribute_users[-1]
1.24
1.25 - # Add the usage to all current users.
1.26 -
1.27 if users.has_key(name):
1.28 - for user in users[name]:
1.29 - user._attrnames[name].add(attrname)
1.30 return users[name]
1.31 else:
1.32 return []
1.33 @@ -363,15 +368,30 @@
1.34
1.35 # Record the attribute combinations for the name.
1.36
1.37 + self._init_attribute_user_for_name(node, name)
1.38 +
1.39 + # Propagate any loop usage forward to any redefinition of a name.
1.40 +
1.41 + loop_users = self.loop_users[-1]
1.42 +
1.43 + if loop_users.has_key(name):
1.44 + for loop_user in loop_users[name]:
1.45 + node._attrnames[name].update(loop_user._attrnames[name])
1.46 + del loop_users[name]
1.47 +
1.48 + # Remember this user.
1.49 +
1.50 + self.all_attribute_users.add(node)
1.51 +
1.52 + def _init_attribute_user_for_name(self, node, name):
1.53 +
1.54 + "Make sure that 'node' is initialised for 'name'."
1.55 +
1.56 if not hasattr(node, "_attrnames"):
1.57 node._attrnames = {}
1.58
1.59 node._attrnames[name] = set()
1.60
1.61 - # Remember this user.
1.62 -
1.63 - self.all_attribute_users.add(node)
1.64 -
1.65 def _new_branchpoint(self):
1.66
1.67 """
1.68 @@ -381,11 +401,14 @@
1.69
1.70 self.user_shelves.append([])
1.71
1.72 - def _new_branch(self):
1.73 + def _new_branch(self, loop_node=None):
1.74
1.75 """
1.76 Establish a new control-flow branch, transferring attribute usage to
1.77 the new branch so that it may be augmented for each name locally.
1.78 +
1.79 + If the optional 'loop_node' is given, add it as an active user to be
1.80 + informed of attribute usage.
1.81 """
1.82
1.83 # Retain a record of active users.
1.84 @@ -394,6 +417,21 @@
1.85 d.update(self.attribute_users[-1])
1.86 self.attribute_users.append(d)
1.87
1.88 + new_users = self.attribute_users[-1]
1.89 +
1.90 + d = {}
1.91 + d.update(self.loop_users[-1])
1.92 +
1.93 + if loop_node is not None:
1.94 + for name, nodes in new_users.items():
1.95 + if not d.has_key(name):
1.96 + d[name] = set([loop_node])
1.97 + else:
1.98 + d[name] = d[name].union([loop_node])
1.99 + self._init_attribute_user_for_name(loop_node, name)
1.100 +
1.101 + self.loop_users.append(d)
1.102 +
1.103 def _abandon_branch(self):
1.104 pass
1.105