1.1 --- a/micropython/data.py Fri Nov 06 01:17:07 2009 +0100
1.2 +++ b/micropython/data.py Sat Nov 07 02:36:33 2009 +0100
1.3 @@ -124,6 +124,7 @@
1.4
1.5 self.attributes_used = [{}] # stack of usage
1.6 self.attribute_shelves = [] # stack of unmerged definitions
1.7 + self.attribute_users = [{}] # stack of assignments
1.8
1.9 # Attribute/name definition and access.
1.10
1.11 @@ -280,17 +281,20 @@
1.12 def _use_attribute(self, attr, attrname):
1.13 name = attr.name
1.14 defs = self.attributes_used[-1]
1.15 - if not defs.has_key(name):
1.16 - defs[name] = set()
1.17 + users = self.attribute_users[-1]
1.18 defs[name].add(attrname)
1.19 return defs[name]
1.20
1.21 - def _reset_attributes(self, name):
1.22 + def _define_attribute_user(self, node):
1.23 + name = node.name
1.24 defs = self.attributes_used[-1]
1.25 - defs[name] = set()
1.26 + users = self.attribute_users[-1]
1.27 + users[name] = node
1.28 + users[name]._attrnames = defs[name] = set()
1.29
1.30 def _reset_all_attributes(self):
1.31 self.attributes_used[-1] = {}
1.32 + self.attribute_users[-1] = {}
1.33
1.34 def _new_branchpoint(self):
1.35 self.attribute_shelves.append([])
1.36 @@ -300,9 +304,11 @@
1.37 for name, attrnames in self.attributes_used[-1].items():
1.38 d[name] = set(attrnames)
1.39 self.attributes_used.append(d)
1.40 + self.attribute_users.append({})
1.41
1.42 def _shelve_branch(self):
1.43 self.attribute_shelves[-1].append(self.attributes_used.pop())
1.44 + self.attribute_users.pop()
1.45
1.46 def _merge_branches(self):
1.47 active = self.attributes_used[-1]
1.48 @@ -317,7 +323,7 @@
1.49
1.50 for name, attrnames in defs.items():
1.51 if active.has_key(name):
1.52 - active[name] = active[name].intersection(attrnames)
1.53 + active[name].intersection_update(attrnames)
1.54 else:
1.55 active[name] = attrnames
1.56
2.1 --- a/micropython/inspect.py Fri Nov 06 01:17:07 2009 +0100
2.2 +++ b/micropython/inspect.py Sat Nov 07 02:36:33 2009 +0100
2.3 @@ -318,8 +318,8 @@
2.4 def merge_branches(self):
2.5 self.get_namespace()._merge_branches()
2.6
2.7 - def reset_attributes(self, name):
2.8 - self.get_namespace()._reset_attributes(name)
2.9 + def define_attribute_user(self, node):
2.10 + self.get_namespace()._define_attribute_user(node)
2.11
2.12 def reset_all_attributes(self):
2.13 self.get_namespace()._reset_all_attributes()
2.14 @@ -481,7 +481,7 @@
2.15 raise InspectError(self.full_name(), node, "Deletion of attribute %r is not supported." % node.name)
2.16
2.17 self.store(node.name, self.expr)
2.18 - self.reset_attributes(node.name)
2.19 + self.define_attribute_user(node)
2.20 self.use_name(node.name)
2.21 return None
2.22