# HG changeset patch # User Matt Mackall # Date 2009-05-17 23:17:04 # Node ID d72d1a97408a589d5181a10645789ecfaa05d567 # Parent bd45047afaeb260ca4da9d039aaee2e249e8e122 templater: replace eval with closure diff --git a/mercurial/templater.py b/mercurial/templater.py --- a/mercurial/templater.py +++ b/mercurial/templater.py @@ -83,14 +83,17 @@ class engine(object): def _filter(self, expr, get, map): if expr not in self.cache: parts = expr.split('|') - filters = parts[1:] - for f in filters: - if f not in self.filters: - raise SyntaxError(_("unknown filter '%s'") % expr) - calls = '('.join(i for i in reversed(filters)) - end = ')' * len(filters) - code = "lambda _get: %s(_get('%s')%s" % (calls, parts[0], end) - self.cache[expr] = eval(code, self.filters) + val = parts[0] + try: + filters = [self.filters[f] for f in parts[1:]] + except KeyError, i: + raise SyntaxError(_("unknown filter '%s'") % i[0]) + def apply(get): + x = get(val) + for f in filters: + x = f(x) + return x + self.cache[expr] = apply return self.cache[expr](get) def _process(self, tmpl, map):