[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