# HG changeset patch # User Paul Boddie # Date 1257557793 -3600 # Node ID 625d2aef3edd561339be2746d6bbce4f00160468 # Parent 37f1668cee4d676aa9cd47b90e42597389049126 Connected attribute usage sets to assignment nodes. diff -r 37f1668cee4d -r 625d2aef3edd micropython/data.py --- a/micropython/data.py Fri Nov 06 01:17:07 2009 +0100 +++ b/micropython/data.py Sat Nov 07 02:36:33 2009 +0100 @@ -124,6 +124,7 @@ self.attributes_used = [{}] # stack of usage self.attribute_shelves = [] # stack of unmerged definitions + self.attribute_users = [{}] # stack of assignments # Attribute/name definition and access. @@ -280,17 +281,20 @@ def _use_attribute(self, attr, attrname): name = attr.name defs = self.attributes_used[-1] - if not defs.has_key(name): - defs[name] = set() + users = self.attribute_users[-1] defs[name].add(attrname) return defs[name] - def _reset_attributes(self, name): + def _define_attribute_user(self, node): + name = node.name defs = self.attributes_used[-1] - defs[name] = set() + users = self.attribute_users[-1] + users[name] = node + users[name]._attrnames = defs[name] = set() def _reset_all_attributes(self): self.attributes_used[-1] = {} + self.attribute_users[-1] = {} def _new_branchpoint(self): self.attribute_shelves.append([]) @@ -300,9 +304,11 @@ for name, attrnames in self.attributes_used[-1].items(): d[name] = set(attrnames) self.attributes_used.append(d) + self.attribute_users.append({}) def _shelve_branch(self): self.attribute_shelves[-1].append(self.attributes_used.pop()) + self.attribute_users.pop() def _merge_branches(self): active = self.attributes_used[-1] @@ -317,7 +323,7 @@ for name, attrnames in defs.items(): if active.has_key(name): - active[name] = active[name].intersection(attrnames) + active[name].intersection_update(attrnames) else: active[name] = attrnames diff -r 37f1668cee4d -r 625d2aef3edd micropython/inspect.py --- a/micropython/inspect.py Fri Nov 06 01:17:07 2009 +0100 +++ b/micropython/inspect.py Sat Nov 07 02:36:33 2009 +0100 @@ -318,8 +318,8 @@ def merge_branches(self): self.get_namespace()._merge_branches() - def reset_attributes(self, name): - self.get_namespace()._reset_attributes(name) + def define_attribute_user(self, node): + self.get_namespace()._define_attribute_user(node) def reset_all_attributes(self): self.get_namespace()._reset_all_attributes() @@ -481,7 +481,7 @@ raise InspectError(self.full_name(), node, "Deletion of attribute %r is not supported." % node.name) self.store(node.name, self.expr) - self.reset_attributes(node.name) + self.define_attribute_user(node) self.use_name(node.name) return None