1.1 --- a/micropython/inspect.py Sun Oct 27 01:54:07 2013 +0200
1.2 +++ b/micropython/inspect.py Sun Oct 27 02:39:45 2013 +0200
1.3 @@ -677,7 +677,10 @@
1.4 # Attempt to identify the nature of the attribute.
1.5
1.6 if isinstance(expr, BaseAttr):
1.7 - value = expr.get_value()
1.8 + if isinstance(expr, LocalAttr):
1.9 + value = expr.attr.get_value()
1.10 + else:
1.11 + value = expr.get_value()
1.12
1.13 # Get the attribute and record its usage.
1.14 # NOTE: Need to provide concrete values for things like base classes
1.15 @@ -863,7 +866,10 @@
1.16 # Record the attribute on the presumed target.
1.17
1.18 if isinstance(expr, BaseAttr):
1.19 - value = expr.get_value()
1.20 + if isinstance(expr, LocalAttr):
1.21 + value = expr.attr.get_value()
1.22 + else:
1.23 + value = expr.get_value()
1.24
1.25 if expr.name == "self":
1.26 self.store_instance_attr(attrname)
1.27 @@ -928,10 +934,17 @@
1.28 # NOTE: this is merely creating aliases for such methods.
1.29
1.30 if isinstance(self.get_namespace(), (Class, Module)):
1.31 - if not isinstance(self.expr, BaseAttr) or not isinstance(self.expr.get_value(), Function):
1.32 + if isinstance(self.expr, BaseAttr):
1.33 + if isinstance(self.expr, LocalAttr):
1.34 + value = self.expr.attr.get_value()
1.35 + else:
1.36 + value = self.expr.get_value()
1.37 + else:
1.38 + value = None
1.39 + if not value or not isinstance(value, Function):
1.40 self.use_specific_attribute(None, node.name)
1.41 else:
1.42 - fn = self.expr.get_value()
1.43 + fn = value
1.44 ns = self.get_namespace().full_name()
1.45 self.use_specific_attribute(fn.parent.full_name(), fn.name, "%s.%s" % (ns, node.name))
1.46
1.47 @@ -1011,12 +1024,17 @@
1.48 # Each base class must be constant and known at compile-time.
1.49
1.50 if isinstance(expr, BaseAttr):
1.51 - if expr.assignments != 1:
1.52 + if isinstance(expr, LocalAttr):
1.53 + value = expr.attr.get_value()
1.54 + else:
1.55 + value = expr.get_value()
1.56 +
1.57 + if not value:
1.58 raise InspectError("Base class %r for %r is not constant: %r" % (base, cls.full_name(), expr))
1.59 - elif not isinstance(expr.get_value(), Class):
1.60 - raise InspectError("Base class %r for %r is not a class: %r" % (base, cls.full_name(), expr.get_value()))
1.61 + elif not isinstance(value, Class):
1.62 + raise InspectError("Base class %r for %r is not a class: %r" % (base, cls.full_name(), value))
1.63 else:
1.64 - cls.add_base(expr.get_value())
1.65 + cls.add_base(value)
1.66
1.67 # Where no expression value is available, the base class is
1.68 # not identifiable.
1.69 @@ -1378,8 +1396,8 @@
1.70
1.71 def visitName(self, node):
1.72 attr = self.get_namespace().get_using_node(node.name, node) or make_instance()
1.73 - node._attr = self.get_namespace().get_for_local(node.name) or make_instance()
1.74 - return attr
1.75 + node._attr = self.get_namespace().get_for_local(node.name) or attr
1.76 + return node._attr
1.77
1.78 def visitNot(self, node):
1.79 self.use_name("__bool__", node)