1.1 --- a/micropython/__init__.py Sat Nov 08 21:15:11 2008 +0100
1.2 +++ b/micropython/__init__.py Sat Nov 08 21:47:26 2008 +0100
1.3 @@ -35,6 +35,7 @@
1.4
1.5 from micropython.common import *
1.6 import micropython.ast
1.7 +import micropython.data
1.8 import micropython.opt
1.9 import micropython.inspect
1.10 import micropython.table
1.11 @@ -53,6 +54,14 @@
1.12
1.13 supported_optimisations = micropython.opt.Optimiser.supported_optimisations
1.14
1.15 + predefined_constants = {
1.16 + "None" : None,
1.17 + "True" : True,
1.18 + "False" : False,
1.19 + "Ellipsis" : Ellipsis,
1.20 + "NotImplemented" : NotImplemented
1.21 + }
1.22 +
1.23 def __init__(self, path=None, optimisations=None, verbose=0):
1.24
1.25 """
1.26 @@ -83,12 +92,41 @@
1.27
1.28 self.constant_values = {}
1.29 self.constant_list = None # cache for constants
1.30 + self.init_predefined_constants()
1.31
1.32 # Main program information.
1.33
1.34 self.code = None
1.35 self.code_location = None
1.36
1.37 + def init_predefined_constants(self):
1.38 +
1.39 + "Ensure the predefined constants."
1.40 +
1.41 + for name, value in self.predefined_constants.items():
1.42 + self.make_constant(value)
1.43 +
1.44 + def get_predefined_constant(self, name):
1.45 +
1.46 + "Return the predefined constant for the given 'name'."
1.47 +
1.48 + return self.make_constant(self.predefined_constants[name])
1.49 +
1.50 + def get_constant(self, value):
1.51 +
1.52 + "Return a constant for the given 'value'."
1.53 +
1.54 + return self.constant_values[value]
1.55 +
1.56 + def make_constant(self, value):
1.57 +
1.58 + "Make and return a constant for the given 'value'."
1.59 +
1.60 + if not self.constant_values.has_key(value):
1.61 + const = micropython.data.Const(value)
1.62 + self.constant_values[value] = const
1.63 + return self.constant_values[value]
1.64 +
1.65 def constants(self):
1.66
1.67 "Return a list of constants."
2.1 --- a/micropython/ast.py Sat Nov 08 21:15:11 2008 +0100
2.2 +++ b/micropython/ast.py Sat Nov 08 21:47:26 2008 +0100
2.3 @@ -211,9 +211,6 @@
2.4 else:
2.5 return "builtins"
2.6
2.7 - def get_predefined_constant(self, name):
2.8 - return self.module.constant_values[self.module.predefined_constants[name]]
2.9 -
2.10 def load_builtin(self, name, node):
2.11
2.12 "Generate an instruction loading 'name' for the given 'node'."
2.13 @@ -1193,7 +1190,7 @@
2.14 # Test for NotImplemented.
2.15 # Don't actually raise an exception.
2.16
2.17 - self.new_op(TestIdentityAddress(self.get_predefined_constant("NotImplemented")))
2.18 + self.new_op(TestIdentityAddress(self.importer.get_predefined_constant("NotImplemented")))
2.19 self.new_op(JumpIfTrue(next_method_block))
2.20 self.new_op(Jump(end_block))
2.21
2.22 @@ -1496,7 +1493,7 @@
2.23 self._endCallFunc(temp, target)
2.24
2.25 def visitConst(self, node):
2.26 - const = self.module.constant_values[node.value]
2.27 + const = self.importer.get_constant(node.value)
2.28 self.new_op(LoadConst(const))
2.29
2.30 def visitDict(self, node): raise TranslationNotImplementedError(self.module.full_name(), node, "Dict")
2.31 @@ -1528,8 +1525,8 @@
2.32 def visitListCompIf(self, node): raise TranslationNotImplementedError(self.module.full_name(), node, "ListCompIf")
2.33
2.34 def visitName(self, node):
2.35 - if self.module.predefined_constants.has_key(node.name):
2.36 - const = self.module.constant_values[self.module.predefined_constants[node.name]]
2.37 + if self.importer.predefined_constants.has_key(node.name):
2.38 + const = self.importer.get_predefined_constant(node.name)
2.39 self.new_op(LoadConst(const))
2.40 else:
2.41 self._visitName(node, self.name_load_instructions)
3.1 --- a/micropython/inspect.py Sat Nov 08 21:15:11 2008 +0100
3.2 +++ b/micropython/inspect.py Sat Nov 08 21:47:26 2008 +0100
3.3 @@ -85,14 +85,6 @@
3.4 capable of being used as an AST visitor.
3.5 """
3.6
3.7 - predefined_constants = {
3.8 - "None" : None,
3.9 - "True" : True,
3.10 - "False" : False,
3.11 - "Ellipsis" : Ellipsis,
3.12 - "NotImplemented" : NotImplemented
3.13 - }
3.14 -
3.15 def __init__(self, name, importer):
3.16
3.17 """
3.18 @@ -111,15 +103,6 @@
3.19 self.builtins = self.importer.modules.get("__builtins__")
3.20 self.loaded = 0
3.21
3.22 - # Constant records.
3.23 -
3.24 - self.constant_values = importer.constant_values
3.25 -
3.26 - # Ensure the predefined constants.
3.27 -
3.28 - for name, value in self.predefined_constants.items():
3.29 - self._make_constant(value)
3.30 -
3.31 # Current expression state.
3.32
3.33 self.expr = None
3.34 @@ -299,12 +282,6 @@
3.35 self.dispatch(n)
3.36 return Instance()
3.37
3.38 - def _make_constant(self, value):
3.39 - if not self.constant_values.has_key(value):
3.40 - const = Const(value)
3.41 - self.constant_values[value] = const
3.42 - return self.constant_values[value]
3.43 -
3.44 def _visitFunction(self, node, name):
3.45
3.46 """
3.47 @@ -401,7 +378,7 @@
3.48 def visitAssList(self, node):
3.49 for i, n in enumerate(node.nodes):
3.50 self.dispatch(n)
3.51 - self._make_constant(i) # for __getitem__(i) at run-time
3.52 + self.importer.make_constant(i) # for __getitem__(i) at run-time
3.53 return None
3.54
3.55 def visitAssName(self, node):
3.56 @@ -479,7 +456,7 @@
3.57 visitCompare = OP
3.58
3.59 def visitConst(self, node):
3.60 - return self._make_constant(node.value)
3.61 + return self.importer.make_constant(node.value)
3.62
3.63 visitContinue = NOP
3.64
3.65 @@ -602,7 +579,7 @@
3.66
3.67 def visitKeyword(self, node):
3.68 self.dispatch(node.expr)
3.69 - self._make_constant(node.name)
3.70 + self.importer.make_constant(node.name)
3.71 self.keyword_names.add(node.name)
3.72 return None
3.73
3.74 @@ -632,8 +609,8 @@
3.75
3.76 def visitName(self, node):
3.77 name = node.name
3.78 - if self.predefined_constants.has_key(name):
3.79 - attr = self._make_constant(self.predefined_constants[name])
3.80 + if self.importer.predefined_constants.has_key(name):
3.81 + attr = self.importer.get_predefined_constant(name)
3.82 elif self.namespaces and self.namespaces[-1].has_key(name):
3.83 attr = self.namespaces[-1][name]
3.84 elif self.has_key(name):