1.1 --- a/micropython/data.py Mon Aug 23 00:15:03 2010 +0200
1.2 +++ b/micropython/data.py Sun Aug 29 02:03:24 2010 +0200
1.3 @@ -1405,11 +1405,24 @@
1.4 self.all_local_usage = 0
1.5
1.6 def _add_parameters(self, argnames):
1.7 +
1.8 + "Add 'argnames' to the namespace."
1.9 +
1.10 + for name in argnames:
1.11 + self.set(name, Instance())
1.12 +
1.13 + for name, top_level in self._flattened_parameters(argnames):
1.14 + if not top_level:
1.15 + self.set(name, Instance())
1.16 +
1.17 + def _flattened_parameters(self, argnames, top_level=1):
1.18 + l = []
1.19 for name in argnames:
1.20 if isinstance(name, tuple):
1.21 - self._add_parameters(name)
1.22 + l += self._flattened_parameters(name, 0)
1.23 else:
1.24 - self.set(name, Instance())
1.25 + l.append((name, top_level))
1.26 + return l
1.27
1.28 def __repr__(self):
1.29 if self.location is not None:
1.30 @@ -1495,6 +1508,24 @@
1.31 parameters[name] = i
1.32 return parameters
1.33
1.34 + def tuple_parameters(self, argnames=None):
1.35 +
1.36 + """
1.37 + Return a list of (position, parameter) entries corresponding to tuple
1.38 + parameters, where each parameter may either be a string or another such
1.39 + list of entries.
1.40 + """
1.41 +
1.42 + names = argnames or self.argnames
1.43 +
1.44 + l = []
1.45 + for i, name in enumerate(names):
1.46 + if isinstance(name, tuple):
1.47 + l.append((i, self.tuple_parameters(name)))
1.48 + elif argnames:
1.49 + l.append((i, name))
1.50 + return l
1.51 +
1.52 def all_locals(self):
1.53
1.54 "Return a dictionary mapping names to local and parameter details."
1.55 @@ -1556,17 +1587,17 @@
1.56 for i, default in enumerate(self.default_attrs):
1.57 default.position = i
1.58
1.59 - # Locals.
1.60 + # Parameters.
1.61
1.62 - i = None
1.63 - for i, name in enumerate(self.argnames):
1.64 - self[name].position = i
1.65 + i = self._finalise_parameters()
1.66
1.67 if i is not None:
1.68 nparams = i + 1
1.69 else:
1.70 nparams = 0
1.71
1.72 + # Locals (and tuple parameter names).
1.73 +
1.74 i = None
1.75 for i, attr in enumerate(self.locals().values()):
1.76 attr.position = i + nparams
1.77 @@ -1580,6 +1611,15 @@
1.78 self.all_local_usage = nparams + nothers
1.79 self.finalised = 1
1.80
1.81 + def _finalise_parameters(self):
1.82 + if not self.argnames:
1.83 + return None
1.84 +
1.85 + for i, name in enumerate(self.argnames):
1.86 + self[name].position = i
1.87 +
1.88 + return i
1.89 +
1.90 def as_instantiator(self):
1.91
1.92 "Make an instantiator function from a method, keeping all arguments."