[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