1.1 --- a/micropython/data.py Sun Oct 27 01:54:07 2013 +0200
1.2 +++ b/micropython/data.py Sun Oct 27 02:39:45 2013 +0200
1.3 @@ -188,7 +188,7 @@
1.4
1.5 users = self.attribute_users[-1]
1.6 if users.has_key(name):
1.7 - return LocalAttr(None, self, name, nodes=users[name])
1.8 + return LocalAttr(None, self, name, nodes=users[name], attr=attr)
1.9 else:
1.10 return attr
1.11
1.12 @@ -285,8 +285,12 @@
1.13
1.14 for user in users[name]:
1.15 user._values = user._values or {}
1.16 - attr = user._values[name] = Attr(None, self, name)
1.17 - self._set_using_attr(attr, attr_or_value) # enforce single assignment
1.18 + if isinstance(attr_or_value, BaseAttr):
1.19 + attr = attr_or_value
1.20 + else:
1.21 + attr = Attr(None, self, name)
1.22 + self._set_using_attr(attr, attr_or_value) # enforce single assignment
1.23 + user._values[name] = attr
1.24
1.25 # Add and/or obtain the namespace entry.
1.26
1.27 @@ -312,6 +316,8 @@
1.28 # Attempt to fix the context if not explicitly defined.
1.29
1.30 if isinstance(attr_or_value, BaseAttr):
1.31 + if isinstance(attr_or_value, LocalAttr):
1.32 + attr_or_value = attr_or_value.attr
1.33 return self.get_updated_context_values(attr_or_value.get_context_values())
1.34 else:
1.35 return self.get_updated_context_values([get_context_and_value(attr_or_value)])
1.36 @@ -561,9 +567,10 @@
1.37 later point.
1.38 """
1.39
1.40 - def __init__(self, position, parent, name, nodes):
1.41 + def __init__(self, position, parent, name, nodes, attr):
1.42 BaseAttr.__init__(self, position, parent, name)
1.43 self.nodes = nodes or set()
1.44 + self.attr = attr
1.45 self.users = None
1.46
1.47 def _get_defining_users(self):
2.1 --- a/micropython/inspect.py Sun Oct 27 01:54:07 2013 +0200
2.2 +++ b/micropython/inspect.py Sun Oct 27 02:39:45 2013 +0200
2.3 @@ -677,7 +677,10 @@
2.4 # Attempt to identify the nature of the attribute.
2.5
2.6 if isinstance(expr, BaseAttr):
2.7 - value = expr.get_value()
2.8 + if isinstance(expr, LocalAttr):
2.9 + value = expr.attr.get_value()
2.10 + else:
2.11 + value = expr.get_value()
2.12
2.13 # Get the attribute and record its usage.
2.14 # NOTE: Need to provide concrete values for things like base classes
2.15 @@ -863,7 +866,10 @@
2.16 # Record the attribute on the presumed target.
2.17
2.18 if isinstance(expr, BaseAttr):
2.19 - value = expr.get_value()
2.20 + if isinstance(expr, LocalAttr):
2.21 + value = expr.attr.get_value()
2.22 + else:
2.23 + value = expr.get_value()
2.24
2.25 if expr.name == "self":
2.26 self.store_instance_attr(attrname)
2.27 @@ -928,10 +934,17 @@
2.28 # NOTE: this is merely creating aliases for such methods.
2.29
2.30 if isinstance(self.get_namespace(), (Class, Module)):
2.31 - if not isinstance(self.expr, BaseAttr) or not isinstance(self.expr.get_value(), Function):
2.32 + if isinstance(self.expr, BaseAttr):
2.33 + if isinstance(self.expr, LocalAttr):
2.34 + value = self.expr.attr.get_value()
2.35 + else:
2.36 + value = self.expr.get_value()
2.37 + else:
2.38 + value = None
2.39 + if not value or not isinstance(value, Function):
2.40 self.use_specific_attribute(None, node.name)
2.41 else:
2.42 - fn = self.expr.get_value()
2.43 + fn = value
2.44 ns = self.get_namespace().full_name()
2.45 self.use_specific_attribute(fn.parent.full_name(), fn.name, "%s.%s" % (ns, node.name))
2.46
2.47 @@ -1011,12 +1024,17 @@
2.48 # Each base class must be constant and known at compile-time.
2.49
2.50 if isinstance(expr, BaseAttr):
2.51 - if expr.assignments != 1:
2.52 + if isinstance(expr, LocalAttr):
2.53 + value = expr.attr.get_value()
2.54 + else:
2.55 + value = expr.get_value()
2.56 +
2.57 + if not value:
2.58 raise InspectError("Base class %r for %r is not constant: %r" % (base, cls.full_name(), expr))
2.59 - elif not isinstance(expr.get_value(), Class):
2.60 - raise InspectError("Base class %r for %r is not a class: %r" % (base, cls.full_name(), expr.get_value()))
2.61 + elif not isinstance(value, Class):
2.62 + raise InspectError("Base class %r for %r is not a class: %r" % (base, cls.full_name(), value))
2.63 else:
2.64 - cls.add_base(expr.get_value())
2.65 + cls.add_base(value)
2.66
2.67 # Where no expression value is available, the base class is
2.68 # not identifiable.
2.69 @@ -1378,8 +1396,8 @@
2.70
2.71 def visitName(self, node):
2.72 attr = self.get_namespace().get_using_node(node.name, node) or make_instance()
2.73 - node._attr = self.get_namespace().get_for_local(node.name) or make_instance()
2.74 - return attr
2.75 + node._attr = self.get_namespace().get_for_local(node.name) or attr
2.76 + return node._attr
2.77
2.78 def visitNot(self, node):
2.79 self.use_name("__bool__", node)