2.1 --- a/micropython/ast.py Sun Sep 07 00:47:20 2008 +0200
2.2 +++ b/micropython/ast.py Sun Sep 07 02:17:05 2008 +0200
2.3 @@ -30,8 +30,9 @@
2.4 "A code optimiser."
2.5
2.6 supported_optimisations = [
2.7 - "constant_storage", "source_storage", "known_target", "self_access",
2.8 - "temp_storage", "load_operations", "no_operations", "unused_results"
2.9 + "constant_storage", "known_target", "self_access",
2.10 + "temp_storage", "load_operations", "no_operations",
2.11 + "unused_results"
2.12 ]
2.13
2.14 def __init__(self, translation, optimisations=None):
2.15 @@ -50,9 +51,6 @@
2.16 def should_optimise_constant_storage(self):
2.17 return "constant_storage" in self.optimisations
2.18
2.19 - def should_optimise_source_storage(self):
2.20 - return "source_storage" in self.optimisations
2.21 -
2.22 def should_optimise_known_target(self):
2.23 return "known_target" in self.optimisations
2.24
2.25 @@ -221,25 +219,6 @@
2.26 else:
2.27 return 0
2.28
2.29 - def optimise_source_storage(self):
2.30 -
2.31 - """
2.32 - Where the source value in an assignment can be inserted into the
2.33 - eventual target without intermediate storage, optimise away the storage
2.34 - instruction.
2.35 - """
2.36 -
2.37 - if self.should_optimise_source_storage() and \
2.38 - self.translation.active_source is not None and \
2.39 - self.translation.active_source.source is None and \
2.40 - self.translation.active_source.input is None and \
2.41 - self.translation.active_source is self.translation.active:
2.42 -
2.43 - self.translation.remove_op()
2.44 - return 1
2.45 - else:
2.46 - return 0
2.47 -
2.48 def optimise_known_target(self):
2.49
2.50 """
2.51 @@ -365,7 +344,7 @@
2.52
2.53 "Discard results which will not be used."
2.54
2.55 - if self.have_simple_input():
2.56 + if self.should_optimise_unused_results() and self.have_simple_input():
2.57 self.translation.remove_active_value()
2.58
2.59 # Program visitors.
2.60 @@ -610,13 +589,15 @@
2.61
2.62 # Assignment expression values.
2.63
2.64 - def record_value(self):
2.65 - self.expr_temp.append(self.get_temp())
2.66 - self.active_source = self.active
2.67 + def record_value(self, immediate=1):
2.68 + if immediate:
2.69 + temp = self.optimiser.optimise_temp_storage()
2.70 + else:
2.71 + temp = self.get_temp()
2.72 + self.expr_temp.append(temp)
2.73
2.74 def discard_value(self):
2.75 self.discard_temp(self.expr_temp.pop())
2.76 - self.active_source = None
2.77
2.78 def set_source(self):
2.79 if self.active is not None:
2.80 @@ -725,7 +706,6 @@
2.81
2.82 self.active = None
2.83 self.active_value = None
2.84 - self.active_source = None
2.85
2.86 # Visitor methods.
2.87
2.88 @@ -1438,7 +1418,7 @@
2.89
2.90 "Make a sequence of 'sequence_type' for the given program 'node'."
2.91
2.92 - self.make_object(self.get_builtin(sequence_type, node), len(node.nodes))
2.93 + self.make_object(self.get_builtin_class(sequence_type, node), len(node.nodes))
2.94 temp = self.get_temp()
2.95
2.96 for i, n in enumerate(node.nodes):
2.97 @@ -1530,18 +1510,18 @@
2.98
2.99 def visitAssign(self, node):
2.100 self.dispatch(node.expr)
2.101 - self.record_value()
2.102 + self.record_value(0)
2.103
2.104 for n in node.nodes:
2.105 - self.dispatch(n, 1)
2.106 + self.dispatch(n)
2.107
2.108 self.discard_value()
2.109
2.110 - def visitAssAttr(self, node, top_level=0):
2.111 + def visitAssAttr(self, node):
2.112 self._visitAttr(node, self.attribute_store_instructions)
2.113 self.set_source()
2.114
2.115 - def visitAssList(self, node, top_level=1):
2.116 + def visitAssList(self, node):
2.117 for i, n in enumerate(node.nodes):
2.118 self._startCallFunc()
2.119 self.new_op(self.expr_temp[-1])
2.120 @@ -1552,19 +1532,13 @@
2.121
2.122 # Provide a different source value.
2.123
2.124 - self.record_value()
2.125 - self.dispatch(n, 0)
2.126 + self.record_value(0)
2.127 + self.dispatch(n)
2.128 self.discard_value()
2.129
2.130 - def visitAssName(self, node, top_level=1):
2.131 -
2.132 - # Optimise away intermediate source storage.
2.133 -
2.134 - if top_level:
2.135 - no_source = self.optimiser.optimise_source_storage()
2.136 + def visitAssName(self, node):
2.137 self._visitName(node, self.name_store_instructions)
2.138 - if not top_level or not no_source:
2.139 - self.set_source()
2.140 + self.set_source()
2.141
2.142 visitAssTuple = visitAssList
2.143
2.144 @@ -1936,7 +1910,10 @@
2.145 self._visitBinary(node, "__mod__", "__rmod__")
2.146
2.147 def visitModule(self, node):
2.148 + extend = ExtendFrame()
2.149 + self.new_op(extend)
2.150 self.dispatch(node.node)
2.151 + self.set_frame_usage(node, extend)
2.152
2.153 def visitMul(self, node):
2.154 self._visitBinary(node, "__mul__", "__rmul__")
2.155 @@ -2034,6 +2011,9 @@
2.156 def visitStmt(self, node):
2.157 for n in node.nodes:
2.158 self.dispatch(n)
2.159 + if self.temp_positions:
2.160 + #print "Had temp", self.temp_positions
2.161 + self.temp_positions = set()
2.162
2.163 def visitSub(self, node):
2.164 self._visitBinary(node, "__sub__", "__rsub__")