Author: Amaury Forgeot d'Arc <amaur...@gmail.com>
Branch: py3.3
Changeset: r73593:be8eea97342c
Date: 2014-09-17 20:24 +0200
http://bitbucket.org/pypy/pypy/changeset/be8eea97342c/

Log:    Python 3.3 acknowledged that sys.defaultencoding is utf-8 and will
        never change.

        Simplify encode_object(), this also removes an assertion which
        prevented module initialization from calling compile() (used by
        namedtuple for example)

diff --git a/pypy/module/sys/__init__.py b/pypy/module/sys/__init__.py
--- a/pypy/module/sys/__init__.py
+++ b/pypy/module/sys/__init__.py
@@ -7,7 +7,7 @@
 
 class Module(MixedModule):
     """Sys Builtin Module. """
-    _immutable_fields_ = ["defaultencoding?", "debug?"]
+    _immutable_fields_ = ["defaultencoding", "debug?"]
 
     def __init__(self, space, w_name):
         """NOT_RPYTHON""" # because parent __init__ isn't
@@ -15,7 +15,6 @@
             del self.__class__.interpleveldefs['pypy_getudir']
         super(Module, self).__init__(space, w_name)
         self.recursionlimit = 100
-        self.w_default_encoder = None
         self.defaultencoding = "utf-8"
         self.filesystemencoding = None
         self.debug = True
@@ -199,16 +198,6 @@
                 return space.wrap(operror.get_traceback())
         return None
 
-    def get_w_default_encoder(self):
-        if self.w_default_encoder is not None:
-            # XXX is this level of caching ok?  CPython has some shortcuts
-            # for common encodings, but as far as I can see it has no general
-            # cache.
-            return self.w_default_encoder
-        else:
-            from pypy.module.sys.interp_encoding import get_w_default_encoder
-            return get_w_default_encoder(self.space)
-
     def get_flag(self, name):
         space = self.space
         return space.int_w(space.getattr(self.get('flags'), space.wrap(name)))
diff --git a/pypy/module/sys/interp_encoding.py 
b/pypy/module/sys/interp_encoding.py
--- a/pypy/module/sys/interp_encoding.py
+++ b/pypy/module/sys/interp_encoding.py
@@ -7,17 +7,6 @@
 implementation."""
     return space.wrap(space.sys.defaultencoding)
 
-def get_w_default_encoder(space):
-    assert not (space.config.translating and not we_are_translated()), \
-        "get_w_default_encoder() should not be called during translation"
-    w_encoding = space.wrap(space.sys.defaultencoding)
-    mod = space.getbuiltinmodule("_codecs")
-    w_lookup = space.getattr(mod, space.wrap("lookup"))
-    w_functuple = space.call_function(w_lookup, w_encoding)
-    w_encoder = space.getitem(w_functuple, space.wrap(0))
-    space.sys.w_default_encoder = w_encoder    # cache it
-    return w_encoder
-
 if sys.platform == "win32":
     base_encoding = "mbcs"
 elif sys.platform == "darwin":
diff --git a/pypy/objspace/std/unicodeobject.py 
b/pypy/objspace/std/unicodeobject.py
--- a/pypy/objspace/std/unicodeobject.py
+++ b/pypy/objspace/std/unicodeobject.py
@@ -481,24 +481,20 @@
 
 
 def encode_object(space, w_object, encoding, errors):
-    if encoding is None:
-        # Get the encoder functions as a wrapped object.
-        # This lookup is cached.
-        w_encoder = space.sys.get_w_default_encoder()
-    else:
-        if errors is None or errors == 'strict':
-            if encoding == 'ascii':
-                u = space.unicode_w(w_object)
-                eh = unicodehelper.encode_error_handler(space)
-                return space.wrapbytes(unicode_encode_ascii(
-                        u, len(u), None, errorhandler=eh))
-            if encoding == 'utf-8':
-                u = space.unicode_w(w_object)
-                eh = unicodehelper.encode_error_handler(space)
-                return space.wrapbytes(unicode_encode_utf_8(
-                        u, len(u), None, errorhandler=eh))
-        from pypy.module._codecs.interp_codecs import lookup_codec
-        w_encoder = space.getitem(lookup_codec(space, encoding), space.wrap(0))
+    if errors is None or errors == 'strict':
+        if encoding is None or encoding == 'utf-8':
+            u = space.unicode_w(w_object)
+            eh = unicodehelper.encode_error_handler(space)
+            return space.wrapbytes(unicode_encode_utf_8(
+                    u, len(u), errors, errorhandler=eh))
+        elif encoding == 'ascii':
+            u = space.unicode_w(w_object)
+            eh = unicodehelper.encode_error_handler(space)
+            return space.wrapbytes(unicode_encode_ascii(
+                    u, len(u), errors, errorhandler=eh))
+
+    from pypy.module._codecs.interp_codecs import lookup_codec
+    w_encoder = space.getitem(lookup_codec(space, encoding), space.wrap(0))
     if errors is None:
         w_errors = space.wrap('strict')
     else:
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to