Mercurial > genshi > genshi-test
comparison markup/eval.py @ 134:df44110ca91d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
* Evaluation errors in expressions now include the original expression code in the traceback.
author | cmlenz |
---|---|
date | Sun, 06 Aug 2006 18:07:21 +0000 |
parents | b9a0031d4bbb |
children | d91e1e822969 |
comparison
equal
deleted
inserted
replaced
133:b9a0031d4bbb | 134:df44110ca91d |
---|---|
70 """Create the expression. | 70 """Create the expression. |
71 | 71 |
72 @param source: the expression as string | 72 @param source: the expression as string |
73 """ | 73 """ |
74 self.source = source | 74 self.source = source |
75 self.code = _compile(source, filename, lineno) | 75 self.code = _compile(self, filename, lineno) |
76 | 76 |
77 def __repr__(self): | 77 def __repr__(self): |
78 return '<Expression "%s">' % self.source | 78 return '<Expression "%s">' % self.source |
79 | 79 |
80 def evaluate(self, data, nocall=False): | 80 def evaluate(self, data, nocall=False): |
92 if not nocall and callable(retval): | 92 if not nocall and callable(retval): |
93 retval = retval() | 93 retval = retval() |
94 return retval | 94 return retval |
95 | 95 |
96 | 96 |
97 def _compile(source, filename=None, lineno=-1): | 97 def _compile(expr, filename=None, lineno=-1): |
98 tree = parse(source, 'eval') | 98 tree = parse(expr.source, 'eval') |
99 xform = ExpressionASTTransformer() | 99 xform = ExpressionASTTransformer() |
100 tree = xform.visit(tree) | 100 tree = xform.visit(tree) |
101 | 101 |
102 if isinstance(filename, unicode): | 102 if isinstance(filename, unicode): |
103 # unicode file names not allowed for code objects | 103 # unicode file names not allowed for code objects |
114 | 114 |
115 # We'd like to just set co_firstlineno, but it's readonly. So we need to | 115 # We'd like to just set co_firstlineno, but it's readonly. So we need to |
116 # clone the code object while adjusting the line number | 116 # clone the code object while adjusting the line number |
117 return new.code(0, code.co_nlocals, code.co_stacksize, | 117 return new.code(0, code.co_nlocals, code.co_stacksize, |
118 code.co_flags | 0x0040, code.co_code, code.co_consts, | 118 code.co_flags | 0x0040, code.co_code, code.co_consts, |
119 code.co_names, code.co_varnames, filename, code.co_name, | 119 code.co_names, code.co_varnames, filename, repr(expr), |
120 lineno, code.co_lnotab, (), ()) | 120 lineno, code.co_lnotab, (), ()) |
121 | 121 |
122 def _lookup_name(data, name, locals_=None): | 122 def _lookup_name(data, name, locals_=None): |
123 val = None | 123 val = None |
124 if locals_: | 124 if locals_: |