1.1 --- a/micropython/inspect.py Fri Jan 18 00:55:11 2008 +0100
1.2 +++ b/micropython/inspect.py Sat Jan 19 00:11:55 2008 +0100
1.3 @@ -64,9 +64,10 @@
1.4
1.5 "A mix-in providing dictionary methods."
1.6
1.7 - def __init__(self):
1.8 + def __init__(self, global_namespace=None):
1.9 self.namespace = {}
1.10 self.globals = set()
1.11 + self.global_namespace = global_namespace
1.12
1.13 # Number of assignments per name.
1.14
1.15 @@ -83,11 +84,15 @@
1.16 self.namespace[name] = value
1.17
1.18 # Record the number of assignments to each name.
1.19 + # NOTE: Insist on assignments with known values.
1.20
1.21 - if not self.assignments.has_key(name):
1.22 - self.assignments[name] = 1
1.23 - else:
1.24 - self.assignments[name] += 1
1.25 + if value is not None:
1.26 + if not self.assignments.has_key(name):
1.27 + self.assignments[name] = 1
1.28 + else:
1.29 + self.assignments[name] += 1
1.30 + else:
1.31 + self.global_namespace[name] = value
1.32
1.33 def __delitem__(self, name):
1.34 del self.namespace[name]
1.35 @@ -146,7 +151,7 @@
1.36 self.location = None
1.37
1.38 def __repr__(self):
1.39 - return "Const(%r, location=%d)" % (self.value, self.location)
1.40 + return "Const(%r, location=%r)" % (self.value, self.location)
1.41
1.42 def __eq__(self, other):
1.43 return self.value == other.value
1.44 @@ -158,8 +163,8 @@
1.45
1.46 "An inspected class."
1.47
1.48 - def __init__(self, name, parent_name, node=None):
1.49 - NamespaceDict.__init__(self)
1.50 + def __init__(self, name, parent_name, global_namespace=None, node=None):
1.51 + NamespaceDict.__init__(self, global_namespace)
1.52 self.name = name
1.53 self.parent_name = parent_name
1.54 self.node = node
1.55 @@ -300,8 +305,8 @@
1.56
1.57 "An inspected function."
1.58
1.59 - def __init__(self, name, parent_name, argnames, has_star, has_dstar, node=None):
1.60 - NamespaceDict.__init__(self)
1.61 + def __init__(self, name, parent_name, argnames, has_star, has_dstar, global_namespace=None, node=None):
1.62 + NamespaceDict.__init__(self, global_namespace)
1.63 self.name = name
1.64 self.parent_name = parent_name
1.65 self.argnames = argnames
1.66 @@ -371,8 +376,8 @@
1.67
1.68 "A module, class or function which was mentioned but could not be imported."
1.69
1.70 - def __init__(self, name, parent_name):
1.71 - NamespaceDict.__init__(self)
1.72 + def __init__(self, name, parent_name, global_namespace=None):
1.73 + NamespaceDict.__init__(self, global_namespace)
1.74 self.name = name
1.75 self.parent_name = parent_name
1.76
1.77 @@ -390,7 +395,7 @@
1.78 "An inspected module's core details."
1.79
1.80 def __init__(self, name):
1.81 - NamespaceDict.__init__(self)
1.82 + NamespaceDict.__init__(self, self)
1.83 self.name = name
1.84
1.85 # Module attributes.
1.86 @@ -603,7 +608,7 @@
1.87 if self.namespaces:
1.88 print "Class %r in %r is not global: ignored." % (node.name, self)
1.89 else:
1.90 - cls = Class(node.name, self.get_parent().full_name(), node)
1.91 + cls = Class(node.name, self.get_parent().full_name(), self, node)
1.92 for base in node.bases:
1.93 base_ref = self.dispatch(base)
1.94 if base_ref is None:
1.95 @@ -629,6 +634,7 @@
1.96 def visitConst(self, node):
1.97 const = Const(node.value)
1.98 self.constant_values[node.value] = const
1.99 + return const
1.100
1.101 visitContinue = NOP
1.102
1.103 @@ -659,21 +665,23 @@
1.104 if module is None:
1.105 print "Warning:", node.modname, "not imported."
1.106
1.107 - # NOTE: This could produce local names instead of globals where import
1.108 - # NOTE: is used within functions.
1.109 -
1.110 for name, alias in node.names:
1.111 if name != "*":
1.112 if module is not None and module.namespace.has_key(name):
1.113 - self[alias or name] = attr = module[name]
1.114 + attr = module[name]
1.115 + self.store(alias or name, attr)
1.116 if isinstance(attr, Module) and not attr.loaded:
1.117 self.importer.load(attr.name)
1.118 +
1.119 + # Support the import of names from missing modules.
1.120 +
1.121 else:
1.122 - self[alias or name] = UnresolvedName(name, node.modname)
1.123 + self.store(alias or name, UnresolvedName(name, node.modname, self))
1.124 else:
1.125 if module is not None:
1.126 for n in module.namespace.keys():
1.127 - self[n] = attr = module[n]
1.128 + attr = module[n]
1.129 + self.store(n, attr)
1.130 if isinstance(attr, Module) and not attr.loaded:
1.131 self.importer.load(attr.name)
1.132
1.133 @@ -686,6 +694,7 @@
1.134 node.argnames,
1.135 (node.flags & 4 != 0),
1.136 (node.flags & 8 != 0),
1.137 + self,
1.138 node
1.139 )
1.140
1.141 @@ -722,7 +731,7 @@
1.142 if isinstance(expr, Module):
1.143 return expr.namespace.get(node.attrname)
1.144 elif isinstance(expr, UnresolvedName):
1.145 - return UnresolvedName(node.attrname, expr.full_name())
1.146 + return UnresolvedName(node.attrname, expr.full_name(), self)
1.147 return builtins.get(node.attrname)
1.148
1.149 def visitGlobal(self, node):
1.150 @@ -745,14 +754,11 @@
1.151 if self.importer is None:
1.152 raise InspectError, "Please use the micropython.Importer class for code which uses the 'import' statement."
1.153
1.154 - # NOTE: This could produce local names instead of globals where import
1.155 - # NOTE: is used within functions.
1.156 -
1.157 for name, alias in node.names:
1.158 if alias is not None:
1.159 - self[alias] = self.importer.load(name, 1) or UnresolvedName(None, name)
1.160 + self.store(alias, self.importer.load(name, 1) or UnresolvedName(None, name, self))
1.161 else:
1.162 - self[name.split(".")[0]] = self.importer.load(name) or UnresolvedName(None, name.split(".")[0])
1.163 + self.store(name.split(".")[0], self.importer.load(name) or UnresolvedName(None, name.split(".")[0], self))
1.164
1.165 return None
1.166
1.167 @@ -884,10 +890,10 @@
1.168 'bool', 'buffer', 'complex', 'dict', 'file', 'float', 'int', 'list',
1.169 'long', 'object', 'slice', 'str', 'tuple', 'type', 'unicode',
1.170 'xrange']:
1.171 - self[key] = Class(key, self.full_name())
1.172 + self[key] = Class(key, self.full_name(), self)
1.173
1.174 for key in ['id', 'len']:
1.175 - self[key] = Function(key, self.full_name(), ['arg'], 0, 0)
1.176 + self[key] = Function(key, self.full_name(), ['arg'], 0, 0, self)
1.177
1.178 builtins = Builtins()
1.179