[pypy-svn] r79276 - in pypy/branch/fast-forward/pypy/module/_io: . test

afa at codespeak.net afa at codespeak.net
Fri Nov 19 15:09:21 CET 2010


Author: afa
Date: Fri Nov 19 15:09:20 2010
New Revision: 79276

Modified:
   pypy/branch/fast-forward/pypy/module/_io/interp_textio.py
   pypy/branch/fast-forward/pypy/module/_io/test/test_textio.py
Log:
Use IncrementalNewlineDecoder in TextIOWrapper


Modified: pypy/branch/fast-forward/pypy/module/_io/interp_textio.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/interp_textio.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_io/interp_textio.py	Fri Nov 19 15:09:20 2010
@@ -6,6 +6,7 @@
 from pypy.interpreter.baseobjspace import ObjSpace, Wrappable, W_Root
 from pypy.interpreter.error import OperationError, operationerrfmt
 from pypy.rlib.rstring import UnicodeBuilder
+from pypy.module._codecs import interp_codecs
 
 STATE_ZERO, STATE_OK, STATE_DETACHED = range(3)
 
@@ -246,6 +247,9 @@
             raise OperationError(space.w_IOError, space.wrap(
                 "could not determine default encoding"))
 
+        if space.is_w(w_errors, space.w_None):
+            w_errors = space.wrap("strict")
+
         if space.is_w(w_newline, space.w_None):
             newline = None
         else:
@@ -256,6 +260,21 @@
 
         self.line_buffering = line_buffering
 
+        # XXX self.writenl
+        readuniversal = not newline # null or empty
+        readtranslate = newline is None
+
+        # build the decoder object
+        if space.is_true(space.call_method(w_buffer, "readable")):
+            w_codec = interp_codecs.lookup_codec(space,
+                                                 space.str_w(self.w_encoding))
+            self.w_decoder = space.call_method(w_codec,
+                                               "incrementaldecoder", w_errors)
+            if readuniversal:
+                self.w_decoder = space.call_function(
+                    space.gettypeobject(W_IncrementalNewlineDecoder.typedef),
+                    self.w_decoder, space.wrap(readtranslate))
+
         self.state = STATE_OK
 
     def _check_init(self, space):
@@ -283,15 +302,17 @@
 
     @unwrap_spec('self', ObjSpace, W_Root)
     def read_w(self, space, w_size=None):
+        self._check_init(space)
         # XXX w_size?
         w_bytes = space.call_method(self.w_buffer, "read")
-        return space.call_method(w_bytes, "decode", self.w_encoding)
+        return space.call_method(self.w_decoder, "decode", w_bytes)
 
     @unwrap_spec('self', ObjSpace, W_Root)
     def readline_w(self, space, w_limit=None):
+        self._check_init(space)
         # XXX w_limit?
         w_bytes = space.call_method(self.w_buffer, "readline")
-        return space.call_method(w_bytes, "decode", self.w_encoding)
+        return space.call_method(self.w_decoder, "decode", w_bytes)
 
 W_TextIOWrapper.typedef = TypeDef(
     'TextIOWrapper', W_TextIOBase.typedef,

Modified: pypy/branch/fast-forward/pypy/module/_io/test/test_textio.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/test/test_textio.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_io/test/test_textio.py	Fri Nov 19 15:09:20 2010
@@ -29,6 +29,13 @@
         assert t.readable()
         assert t.seekable()
 
+    def test_newlinetranslate(self):
+        import _io
+        r = _io.BytesIO(b"abc\r\ndef\rg")
+        b = _io.BufferedReader(r, 1000)
+        t = _io.TextIOWrapper(b)
+        assert t.read() == u"abc\ndef\ng"
+
 class AppTestIncrementalNewlineDecoder:
 
     def test_newline_decoder(self):



More information about the Pypy-commit mailing list