[pypy-svn] r79258 - in pypy/branch/fast-forward/pypy/module/_io: . test
afa at codespeak.net
afa at codespeak.net
Thu Nov 18 17:10:15 CET 2010
Author: afa
Date: Thu Nov 18 17:10:12 2010
New Revision: 79258
Modified:
pypy/branch/fast-forward/pypy/module/_io/__init__.py
pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py
pypy/branch/fast-forward/pypy/module/_io/interp_io.py
pypy/branch/fast-forward/pypy/module/_io/interp_iobase.py
pypy/branch/fast-forward/pypy/module/_io/test/test_io.py
Log:
_RawIOBase implements read(), based on an abstract readinto() method provided by subclasses
Modified: pypy/branch/fast-forward/pypy/module/_io/__init__.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/__init__.py (original)
+++ pypy/branch/fast-forward/pypy/module/_io/__init__.py Thu Nov 18 17:10:12 2010
@@ -7,7 +7,7 @@
}
interpleveldefs = {
- 'DEFAULT_BUFFER_SIZE': 'space.wrap(interp_io.DEFAULT_BUFFER_SIZE)',
+ 'DEFAULT_BUFFER_SIZE': 'space.wrap(interp_iobase.DEFAULT_BUFFER_SIZE)',
'BlockingIOError': 'interp_io.W_BlockingIOError',
'_IOBase': 'interp_iobase.W_IOBase',
'_RawIOBase': 'interp_iobase.W_RawIOBase',
Modified: pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py (original)
+++ pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py Thu Nov 18 17:10:12 2010
@@ -10,9 +10,9 @@
from pypy.rlib.rarithmetic import r_longlong, intmask
from pypy.tool.sourcetools import func_renamer
from pypy.module._io.interp_iobase import (
- W_IOBase, convert_size,
+ W_IOBase, DEFAULT_BUFFER_SIZE, convert_size,
check_readable_w, check_writable_w, check_seekable_w)
-from pypy.module._io.interp_io import DEFAULT_BUFFER_SIZE, W_BlockingIOError
+from pypy.module._io.interp_io import W_BlockingIOError
from pypy.module.thread.os_lock import Lock
STATE_ZERO, STATE_OK, STATE_DETACHED = range(3)
Modified: pypy/branch/fast-forward/pypy/module/_io/interp_io.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/interp_io.py (original)
+++ pypy/branch/fast-forward/pypy/module/_io/interp_io.py Thu Nov 18 17:10:12 2010
@@ -5,8 +5,6 @@
from pypy.module.exceptions.interp_exceptions import W_IOError
from pypy.module._io.interp_iobase import W_IOBase
-DEFAULT_BUFFER_SIZE = 8192
-
class W_BlockingIOError(W_IOError):
def __init__(self, space):
W_IOError.__init__(self, space)
Modified: pypy/branch/fast-forward/pypy/module/_io/interp_iobase.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/interp_iobase.py (original)
+++ pypy/branch/fast-forward/pypy/module/_io/interp_iobase.py Thu Nov 18 17:10:12 2010
@@ -6,6 +6,8 @@
from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.rlib.rstring import StringBuilder
+DEFAULT_BUFFER_SIZE = 8192
+
def convert_size(space, w_size):
if space.is_w(w_size, space.w_None):
return -1
@@ -271,9 +273,41 @@
)
class W_RawIOBase(W_IOBase):
- pass
+ # ________________________________________________________________
+ # Abstract read methods, based on readinto()
+
+ @unwrap_spec('self', ObjSpace, W_Root)
+ def read_w(self, space, w_size=None):
+ size = convert_size(space, w_size)
+ if size < 0:
+ return space.call_method(self, "readall")
+
+ w_buffer = space.call_function(space.w_bytearray, w_size)
+ w_length = space.call_method(self, "readinto", w_buffer)
+ space.delslice(w_buffer, w_length, space.len(w_buffer))
+ return space.str(w_buffer)
+
+ @unwrap_spec('self', ObjSpace)
+ def readall_w(self, space):
+ builder = StringBuilder()
+ while True:
+ w_data = space.call_method(self, "read",
+ space.wrap(DEFAULT_BUFFER_SIZE))
+
+ if not space.isinstance_w(w_data, space.w_str):
+ raise OperationError(space.w_TypeError, space.wrap(
+ "read() should return bytes"))
+ data = space.str_w(w_data)
+ if not data:
+ break
+ builder.append(data)
+ return space.wrap(builder.build())
+
W_RawIOBase.typedef = TypeDef(
'_RawIOBase', W_IOBase.typedef,
__new__ = generic_new_descr(W_RawIOBase),
+
+ read = interp2app(W_RawIOBase.read_w),
+ readall = interp2app(W_RawIOBase.readall_w),
)
Modified: pypy/branch/fast-forward/pypy/module/_io/test/test_io.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/test/test_io.py (original)
+++ pypy/branch/fast-forward/pypy/module/_io/test/test_io.py Thu Nov 18 17:10:12 2010
@@ -103,6 +103,16 @@
ref = weakref.ref(f)
assert ref() is f
+ def test_rawio_read(self):
+ import _io
+ class MockRawIO(_io._RawIOBase):
+ stack = ['abc', 'de', '']
+ def readinto(self, buf):
+ data = self.stack.pop(0)
+ buf[:len(data)] = data
+ return len(data)
+ assert MockRawIO().read() == 'abcde'
+
class AppTestOpen:
def setup_class(cls):
tmpfile = udir.join('tmpfile').ensure()
More information about the Pypy-commit
mailing list