[pypy-svn] r75668 - pypy/branch/interplevel-codecs/pypy/module/_codecs
afa at codespeak.net
afa at codespeak.net
Wed Jun 30 01:26:36 CEST 2010
Author: afa
Date: Wed Jun 30 01:26:32 2010
New Revision: 75668
Modified:
pypy/branch/interplevel-codecs/pypy/module/_codecs/interp_codecs.py
Log:
Fix for unicode literals containing \N{}
Modified: pypy/branch/interplevel-codecs/pypy/module/_codecs/interp_codecs.py
==============================================================================
--- pypy/branch/interplevel-codecs/pypy/module/_codecs/interp_codecs.py (original)
+++ pypy/branch/interplevel-codecs/pypy/module/_codecs/interp_codecs.py Wed Jun 30 01:26:32 2010
@@ -14,7 +14,7 @@
self.decode_error_handler = self.make_errorhandler(space, True)
self.encode_error_handler = self.make_errorhandler(space, False)
- self.unicodedata_getcode = None
+ self.unicodedata_handler = None
def make_errorhandler(self, space, decode):
def unicode_call_errorhandler(errors, encoding, reason, input,
@@ -56,16 +56,20 @@
return replace, newpos
return unicode_call_errorhandler
- def get_unicodedata_function(self, space):
- if self.unicodedata_getcode:
- return self.unicodedata_getcode
- w_builtin = space.getbuiltinmodule('__builtin__')
- w_import = space.getattr(w_builtin, space.wrap("__import__"))
- w_unicodedata = space.call_function(w_import,
- space.wrap("unicodedata"))
- self.unicodedata_getcode = space.getattr(w_unicodedata,
- space.wrap("_get_code"))
- return self.unicodedata_getcode
+ def get_unicodedata_handler(self, space):
+ if self.unicodedata_handler:
+ return self.unicodedata_handler
+ try:
+ w_builtin = space.getbuiltinmodule('__builtin__')
+ w_import = space.getattr(w_builtin, space.wrap("__import__"))
+ w_unicodedata = space.call_function(w_import,
+ space.wrap("unicodedata"))
+ w_getcode = space.getattr(w_unicodedata, space.wrap("_get_code"))
+ except OperationError:
+ return None
+ else:
+ self.unicodedata_handler = UnicodeData_Handler(space, w_getcode)
+ return self.unicodedata_handler
def _freeze_(self):
assert not self.codec_search_path
@@ -358,8 +362,15 @@
errors = "strict"
state = space.fromcache(CodecState)
func = getattr(runicode, rname)
- result, consumed = func(string, len(string), errors,
- final, state.decode_error_handler)
+ kwargs = {}
+ if name == 'unicode_escape':
+ unicodedata_handler = state.get_unicodedata_handler(space)
+ result, consumed = func(string, len(string), errors,
+ final, state.decode_error_handler,
+ unicodedata_handler=unicodedata_handler)
+ else:
+ result, consumed = func(string, len(string), errors,
+ final, state.decode_error_handler)
return result
raw_decoder.func_name = rname
return raw_decoder
@@ -575,15 +586,14 @@
# Unicode escape
class UnicodeData_Handler:
- def __init__(self, space):
+ def __init__(self, space, w_getcode):
self.space = space
- state = space.fromcache(CodecState)
- self.get_code = state.get_unicodedata_function(space)
+ self.w_getcode = w_getcode
def call(self, name):
space = self.space
try:
- w_code = space.call_function(self.get_code, space.wrap(name))
+ w_code = space.call_function(self.w_getcode, space.wrap(name))
except OperationError, e:
if not e.match(space, space.w_KeyError):
raise
@@ -596,10 +606,7 @@
state = space.fromcache(CodecState)
errorhandler=state.decode_error_handler
- try:
- unicode_name_handler = UnicodeData_Handler(space)
- except OperationError:
- unicode_name_handler = None
+ unicode_name_handler = state.get_unicodedata_handler(space)
result, consumed = runicode.str_decode_unicode_escape(
string, len(string), errors,
More information about the Pypy-commit
mailing list