1.1 --- a/micropython/trans.py Sun Sep 05 02:20:05 2010 +0200
1.2 +++ b/micropython/trans.py Sun Sep 05 21:14:40 2010 +0200
1.3 @@ -1261,28 +1261,9 @@
1.4 """
1.5
1.6 temp_fn = self._getOperatorFunction(node)
1.7 - self._visitUnaryCall(node, temp_fn, node.expr)
1.8 + self._visitCall(node, temp_fn, (node.expr,))
1.9 self.discard_temp(temp_fn)
1.10
1.11 - def _visitUnaryCall(self, node, temp_fn, expr):
1.12 -
1.13 - """
1.14 - Invoke the appropriate operator module function for the operation
1.15 - represented by 'node', given a 'temp_fn' reference to a function, along
1.16 - with the 'expr' operand node.
1.17 - """
1.18 -
1.19 - # Evaluate and store the operand in temporary storage.
1.20 -
1.21 - self.dispatch(expr)
1.22 - temp = self.optimiser.optimise_temp_storage()
1.23 -
1.24 - self._generateInvocation(temp_fn, (temp,))
1.25 -
1.26 - # Compilation duties...
1.27 -
1.28 - self.discard_temp(temp)
1.29 -
1.30 def _visitBinaryBit(self, node):
1.31
1.32 """
1.33 @@ -1296,7 +1277,7 @@
1.34
1.35 for right in node.nodes:
1.36 if left is not None:
1.37 - self._visitBinaryCall(node, temp_fn, left, right)
1.38 + self._visitCall(node, temp_fn, (left, right))
1.39 left = right
1.40
1.41 self.discard_temp(temp_fn)
1.42 @@ -1309,33 +1290,31 @@
1.43 """
1.44
1.45 temp_fn = self._getOperatorFunction(node)
1.46 - self._visitBinaryCall(node, temp_fn, node.left, node.right)
1.47 + self._visitCall(node, temp_fn, (node.left, node.right))
1.48 self.discard_temp(temp_fn)
1.49
1.50 - def _visitBinaryCall(self, node, temp_fn, left, right):
1.51 + def _visitCall(self, node, temp_fn, args):
1.52
1.53 """
1.54 Invoke the appropriate operator module function for the operation
1.55 represented by 'node', given a 'temp_fn' reference to a function, along
1.56 - with the 'left' and 'right' operand nodes.
1.57 + with the 'args' (the operand nodes).
1.58 """
1.59
1.60 - # Evaluate and store the left operand in temporary storage.
1.61 + # Evaluate and store the operands in temporary storage.
1.62
1.63 - self.dispatch(left)
1.64 - temp1 = self.optimiser.optimise_temp_storage()
1.65 + temp_list = []
1.66
1.67 - # Evaluate and store the right operand in temporary storage.
1.68 + for arg in args:
1.69 + self.dispatch(arg)
1.70 + temp_list.append(self.optimiser.optimise_temp_storage())
1.71
1.72 - self.dispatch(right)
1.73 - temp2 = self.optimiser.optimise_temp_storage()
1.74 -
1.75 - self._generateInvocation(temp_fn, (temp1, temp2))
1.76 + self._generateInvocation(temp_fn, temp_list)
1.77
1.78 # Compilation duties...
1.79
1.80 - self.discard_temp(temp1)
1.81 - self.discard_temp(temp2)
1.82 + for temp in temp_list:
1.83 + self.discard_temp(temp)
1.84
1.85 def _generateInvocation(self, temp_fn, temp_list):
1.86
1.87 @@ -1354,11 +1333,11 @@
1.88 self._doCallFunc(temp_fn)
1.89 self._endCallFunc(temp_fn)
1.90
1.91 - def _getOperatorFunction(self, node):
1.92 + def _getOperatorFunction(self, node, operator_name=None):
1.93
1.94 "Return an operator function reference for the given 'node'."
1.95
1.96 - return self._generateOperatorFunction(node.__class__.__name__)
1.97 + return self._generateOperatorFunction(operator_name or node.__class__.__name__)
1.98
1.99 def _getOperatorAugAssignFunction(self, node):
1.100