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_:
Copyright (C) 2012-2017 Edgewall Software