comparison markup/eval.py @ 167:1999291f7a30 trunk

Handle non-ASCII characters in expressions. Closes #29. Thanks to Arnar Birgisson for reporting the problem and comping up with a patch!
author cmlenz
date Thu, 17 Aug 2006 15:22:12 +0000
parents 54a4be707664
children 061491fb4ea8
comparison
equal deleted inserted replaced
166:d43f50402cf2 167:1999291f7a30
65 __slots__ = ['source', 'code'] 65 __slots__ = ['source', 'code']
66 66
67 def __init__(self, source, filename=None, lineno=-1): 67 def __init__(self, source, filename=None, lineno=-1):
68 if isinstance(source, basestring): 68 if isinstance(source, basestring):
69 self.source = source 69 self.source = source
70 self.code = _compile(parse(source, 'eval'), source, 70 if isinstance(source, unicode):
71 source = '\xef\xbb\xbf' + source.encode('utf-8')
72 self.code = _compile(parse(source, 'eval'), self.source,
71 filename=filename, lineno=lineno) 73 filename=filename, lineno=lineno)
72 else: 74 else:
73 assert isinstance(source, ast.Node) 75 assert isinstance(source, ast.Node)
74 self.source = '?' 76 self.source = '?'
75 self.code = _compile(ast.Expression(source), filename=filename, 77 self.code = _compile(ast.Expression(source), filename=filename,
113 # 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
114 # clone the code object while adjusting the line number 116 # clone the code object while adjusting the line number
115 return new.code(0, code.co_nlocals, code.co_stacksize, 117 return new.code(0, code.co_nlocals, code.co_stacksize,
116 code.co_flags | 0x0040, code.co_code, code.co_consts, 118 code.co_flags | 0x0040, code.co_code, code.co_consts,
117 code.co_names, code.co_varnames, filename, 119 code.co_names, code.co_varnames, filename,
118 '<Expression "%s">' % (str(source) or '?'), lineno, 120 '<Expression %s>' % (repr(source).replace("'", '"') or '?'),
119 code.co_lnotab, (), ()) 121 lineno, code.co_lnotab, (), ())
120 122
121 def _lookup_name(data, name, locals_=None): 123 def _lookup_name(data, name, locals_=None):
122 val = None 124 val = None
123 if locals_: 125 if locals_:
124 val = locals_.get(name) 126 val = locals_.get(name)
Copyright (C) 2012-2017 Edgewall Software