1.1 --- a/micropython/ast.py Sun Jul 27 02:00:31 2008 +0200
1.2 +++ b/micropython/ast.py Mon Jul 28 00:26:29 2008 +0200
1.3 @@ -220,6 +220,10 @@
1.4 self.new_op(StoreTemp(temp_position))
1.5 return LoadTemp(temp_position)
1.6
1.7 + def ensure_temp(self):
1.8 + if isinstance(self.active, LoadTemp):
1.9 + self.temp_position = max(self.temp_position, self.active.attr + 1)
1.10 +
1.11 def reserve_temp(self, n):
1.12 temp_position = self.temp_position
1.13 self.temp_position += n
1.14 @@ -475,6 +479,11 @@
1.15 if self._should_optimise_temp_storage() and \
1.16 self._have_temp_compatible_access():
1.17
1.18 + # Where an existing temporary storage reference will be retained,
1.19 + # keep it active.
1.20 +
1.21 + self.ensure_temp()
1.22 +
1.23 last = self.last_op()
1.24 self.remove_op()
1.25 return last
1.26 @@ -811,13 +820,13 @@
1.27 for i in range(ncontext, nargs_min):
1.28 if i not in employed_positions:
1.29 raise TranslateError(self.module.full_name(), node,
1.30 - "Argument %r not supplied for %r: need at least %d arguments." % (i+1, target.name, nargs_min))
1.31 + "Argument %r not supplied for %r: need at least %d argument(s)." % (i+1, target.name, nargs_min))
1.32
1.33 nargs = len(args)
1.34
1.35 if nargs > nargs_max and not target.has_star and not target.has_dstar:
1.36 raise TranslateError(self.module.full_name(), node,
1.37 - "Too many arguments for %r: need at most %d arguments." % (target.name, nargs_max))
1.38 + "Too many arguments for %r: need at most %d argument(s)." % (target.name, nargs_max))
1.39
1.40 # Where defaults are involved, put them into the frame.
1.41
1.42 @@ -1613,7 +1622,20 @@
1.43
1.44 def visitTryFinally(self, node): raise TranslationNotImplementedError(self.module.full_name(), node, "TryFinally")
1.45
1.46 - def visitTuple(self, node): raise TranslationNotImplementedError(self.module.full_name(), node, "Tuple")
1.47 + def visitTuple(self, node):
1.48 + self.new_op(MakeObject(len(node.nodes)))
1.49 + temp = self.get_temp()
1.50 +
1.51 + for i, n in enumerate(node.nodes):
1.52 + self.dispatch(n)
1.53 + self.record_value()
1.54 + self.new_op(temp)
1.55 + self.new_op(StoreAttr(Attr(i, None, None, None)))
1.56 + self.set_source()
1.57 + self.discard_value()
1.58 +
1.59 + self.new_op(temp)
1.60 + self.discard_temp(temp)
1.61
1.62 def visitUnaryAdd(self, node):
1.63 self._visitUnary(node, "__pos__")