[pypy-svn] r48494 - pypy/branch/unicode-objspace/pypy/objspace/std
cfbolz at codespeak.net
cfbolz at codespeak.net
Sat Nov 10 03:13:58 CET 2007
Author: cfbolz
Date: Sat Nov 10 03:13:55 2007
New Revision: 48494
Modified:
pypy/branch/unicode-objspace/pypy/objspace/std/unicodetype.py
Log:
part 2: no more applevel code in the __new__
Modified: pypy/branch/unicode-objspace/pypy/objspace/std/unicodetype.py
==============================================================================
--- pypy/branch/unicode-objspace/pypy/objspace/std/unicodetype.py (original)
+++ pypy/branch/unicode-objspace/pypy/objspace/std/unicodetype.py Sat Nov 10 03:13:55 2007
@@ -142,24 +142,26 @@
# ____________________________________________________________
-app = gateway.applevel('''
-def unicode_from_encoded_object(obj, encoding, errors):
- import codecs, sys
+def unicode_from_encoded_object(space, w_obj, encoding, errors):
+ w_codecs = space.getbuiltinmodule("_codecs")
if encoding is None:
- encoding = sys.getdefaultencoding()
- decoder = codecs.getdecoder(encoding)
+ encoding = space.defaultencoding
+ w_decode = space.getattr(w_codecs, space.wrap("decode"))
if errors is None:
- retval, length = decoder(obj)
+ w_retval, w_length = space.unpacktuple(
+ space.call(w_decode, obj, space.wrap(encoding)), 2)
else:
- retval, length = decoder(obj, errors)
- if not isinstance(retval, unicode):
- raise TypeError("decoder did not return an unicode object (type=%s)" %
- type(retval).__name__)
+ w_retval, w_length = space.unpacktuple(
+ space.call(w_decode, obj, space.wrap(encoding),
+ space.wrap(errors)), 2)
+ if not space.is_true(space.isinstance(w_retval, space.w_unicode)):
+ raise OperationError(
+ space.w_TypeError,
+ space.wrap(
+ "decoder did not return an unicode object (type=%s)" %
+ space.type(retval).getname('?')))
return retval
-
-''')
-unicode_from_encoded_object = app.interphook('unicode_from_encoded_object')
def unicode_from_object(space, w_obj):
if space.is_true(space.isinstance(w_obj, space.w_str)):
@@ -178,8 +180,7 @@
w_res = space.call(w_unicode_method)
if space.is_true(space.isinstance(w_res, space.w_unicode)):
return w_res
- return unicode_from_encoded_object(w_res, space.w_None,
- space.wrap("strict"))
+ return unicode_from_encoded_object(w_res, None, "strict")
def unicode_from_string(space, w_str):
# this is a performance and bootstrapping hack
@@ -218,7 +219,16 @@
else:
w_value = unicode_from_object(space, w_obj)
else:
- w_value = unicode_from_encoded_object(space, w_obj, w_encoding, w_errors)
+ if space.is_w(w_encoding, space.w_None):
+ encoding = None
+ else:
+ encoding = space.str_w(w_encoding)
+ if space.is_w(w_errors, space.w_None):
+ errors = None
+ else:
+ errors = space.str_w(w_errors)
+ errors
+ w_value = unicode_from_encoded_object(space, w_obj, encoding, errors)
# help the annotator! also the ._value depends on W_UnicodeObject layout
assert isinstance(w_value, W_UnicodeObject)
w_newobj = space.allocate_instance(W_UnicodeObject, w_unicodetype)
More information about the Pypy-commit
mailing list