# HG changeset patch # User Paul Boddie # Date 1226177246 -3600 # Node ID 01b3a070af34fe323757c651adb856e7753020fe # Parent a40a277b13323696078aade96a0898e19dcc0fbf Moved constant accounting to the Importer class. diff -r a40a277b1332 -r 01b3a070af34 micropython/__init__.py --- a/micropython/__init__.py Sat Nov 08 21:15:11 2008 +0100 +++ b/micropython/__init__.py Sat Nov 08 21:47:26 2008 +0100 @@ -35,6 +35,7 @@ from micropython.common import * import micropython.ast +import micropython.data import micropython.opt import micropython.inspect import micropython.table @@ -53,6 +54,14 @@ supported_optimisations = micropython.opt.Optimiser.supported_optimisations + predefined_constants = { + "None" : None, + "True" : True, + "False" : False, + "Ellipsis" : Ellipsis, + "NotImplemented" : NotImplemented + } + def __init__(self, path=None, optimisations=None, verbose=0): """ @@ -83,12 +92,41 @@ self.constant_values = {} self.constant_list = None # cache for constants + self.init_predefined_constants() # Main program information. self.code = None self.code_location = None + def init_predefined_constants(self): + + "Ensure the predefined constants." + + for name, value in self.predefined_constants.items(): + self.make_constant(value) + + def get_predefined_constant(self, name): + + "Return the predefined constant for the given 'name'." + + return self.make_constant(self.predefined_constants[name]) + + def get_constant(self, value): + + "Return a constant for the given 'value'." + + return self.constant_values[value] + + def make_constant(self, value): + + "Make and return a constant for the given 'value'." + + if not self.constant_values.has_key(value): + const = micropython.data.Const(value) + self.constant_values[value] = const + return self.constant_values[value] + def constants(self): "Return a list of constants." diff -r a40a277b1332 -r 01b3a070af34 micropython/ast.py --- a/micropython/ast.py Sat Nov 08 21:15:11 2008 +0100 +++ b/micropython/ast.py Sat Nov 08 21:47:26 2008 +0100 @@ -211,9 +211,6 @@ else: return "builtins" - def get_predefined_constant(self, name): - return self.module.constant_values[self.module.predefined_constants[name]] - def load_builtin(self, name, node): "Generate an instruction loading 'name' for the given 'node'." @@ -1193,7 +1190,7 @@ # Test for NotImplemented. # Don't actually raise an exception. - self.new_op(TestIdentityAddress(self.get_predefined_constant("NotImplemented"))) + self.new_op(TestIdentityAddress(self.importer.get_predefined_constant("NotImplemented"))) self.new_op(JumpIfTrue(next_method_block)) self.new_op(Jump(end_block)) @@ -1496,7 +1493,7 @@ self._endCallFunc(temp, target) def visitConst(self, node): - const = self.module.constant_values[node.value] + const = self.importer.get_constant(node.value) self.new_op(LoadConst(const)) def visitDict(self, node): raise TranslationNotImplementedError(self.module.full_name(), node, "Dict") @@ -1528,8 +1525,8 @@ def visitListCompIf(self, node): raise TranslationNotImplementedError(self.module.full_name(), node, "ListCompIf") def visitName(self, node): - if self.module.predefined_constants.has_key(node.name): - const = self.module.constant_values[self.module.predefined_constants[node.name]] + if self.importer.predefined_constants.has_key(node.name): + const = self.importer.get_predefined_constant(node.name) self.new_op(LoadConst(const)) else: self._visitName(node, self.name_load_instructions) diff -r a40a277b1332 -r 01b3a070af34 micropython/inspect.py --- a/micropython/inspect.py Sat Nov 08 21:15:11 2008 +0100 +++ b/micropython/inspect.py Sat Nov 08 21:47:26 2008 +0100 @@ -85,14 +85,6 @@ capable of being used as an AST visitor. """ - predefined_constants = { - "None" : None, - "True" : True, - "False" : False, - "Ellipsis" : Ellipsis, - "NotImplemented" : NotImplemented - } - def __init__(self, name, importer): """ @@ -111,15 +103,6 @@ self.builtins = self.importer.modules.get("__builtins__") self.loaded = 0 - # Constant records. - - self.constant_values = importer.constant_values - - # Ensure the predefined constants. - - for name, value in self.predefined_constants.items(): - self._make_constant(value) - # Current expression state. self.expr = None @@ -299,12 +282,6 @@ self.dispatch(n) return Instance() - def _make_constant(self, value): - if not self.constant_values.has_key(value): - const = Const(value) - self.constant_values[value] = const - return self.constant_values[value] - def _visitFunction(self, node, name): """ @@ -401,7 +378,7 @@ def visitAssList(self, node): for i, n in enumerate(node.nodes): self.dispatch(n) - self._make_constant(i) # for __getitem__(i) at run-time + self.importer.make_constant(i) # for __getitem__(i) at run-time return None def visitAssName(self, node): @@ -479,7 +456,7 @@ visitCompare = OP def visitConst(self, node): - return self._make_constant(node.value) + return self.importer.make_constant(node.value) visitContinue = NOP @@ -602,7 +579,7 @@ def visitKeyword(self, node): self.dispatch(node.expr) - self._make_constant(node.name) + self.importer.make_constant(node.name) self.keyword_names.add(node.name) return None @@ -632,8 +609,8 @@ def visitName(self, node): name = node.name - if self.predefined_constants.has_key(name): - attr = self._make_constant(self.predefined_constants[name]) + if self.importer.predefined_constants.has_key(name): + attr = self.importer.get_predefined_constant(name) elif self.namespaces and self.namespaces[-1].has_key(name): attr = self.namespaces[-1][name] elif self.has_key(name):