[pypy-svn] r78147 - in pypy/branch/fast-forward/pypy/module/_io: . test
afa at codespeak.net
afa at codespeak.net
Wed Oct 20 20:03:58 CEST 2010
Author: afa
Date: Wed Oct 20 20:03:56 2010
New Revision: 78147
Added:
pypy/branch/fast-forward/pypy/module/_io/test/test_bufferedio.py
Modified:
pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py
pypy/branch/fast-forward/pypy/module/_io/interp_iobase.py
Log:
Start a BufferedIO
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 Wed Oct 20 20:03:56 2010
@@ -1,19 +1,80 @@
-from pypy.module._io.interp_iobase import W_IOBase
from pypy.interpreter.typedef import (
TypeDef, generic_new_descr)
+from pypy.interpreter.gateway import interp2app, unwrap_spec
+from pypy.interpreter.baseobjspace import ObjSpace, W_Root
+from pypy.interpreter.error import OperationError
+from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.module._io.interp_iobase import W_IOBase
+from pypy.module._io.interp_io import DEFAULT_BUFFER_SIZE
+from pypy.module.thread.os_lock import Lock
class W_BufferedIOBase(W_IOBase):
- pass
+ def __init__(self, space):
+ W_IOBase.__init__(self, space)
+ self.buffer = None
+ self.lock = None
+
+ def _init(self, space):
+ if self.buffer_size <= 0:
+ raise OperationError(space.w_ValueError, space.wrap(
+ "buffer size must be strictly positive"))
+
+ if self.buffer:
+ lltype.free(self.buffer, flavor='raw')
+ self.buffer = lltype.malloc(rffi.CCHARP.TO, self.buffer_size,
+ flavor='raw')
+
+ ## XXX cannot free a Lock?
+ ## if self.lock:
+ ## self.lock.free()
+ self.lock = Lock(space)
+
+ try:
+ self._raw_tell(space)
+ except OperationError:
+ pass
+
+ def _raw_tell(self, space):
+ w_pos = space.call_method(self.raw, "tell")
+ pos = space.r_longlong_w(w_pos)
+ if pos < 0:
+ raise OperationError(space.w_IOError, space.wrap(
+ "raw stream returned invalid position"))
+
+ self.abs_pos = pos
+ return pos
+
W_BufferedIOBase.typedef = TypeDef(
'_BufferedIOBase', W_IOBase.typedef,
__new__ = generic_new_descr(W_BufferedIOBase),
)
class W_BufferedReader(W_BufferedIOBase):
- pass
+ def __init__(self, space):
+ W_BufferedIOBase.__init__(self, space)
+ self.ok = False
+ self.detached = False
+
+ @unwrap_spec('self', ObjSpace, W_Root, int)
+ def descr_init(self, space, w_raw, buffer_size=DEFAULT_BUFFER_SIZE):
+ raw = space.interp_w(W_IOBase, w_raw)
+ raw.check_readable_w(space)
+
+ self.raw = raw
+ self.buffer_size = buffer_size
+ self.readable = True
+ self.writable = False
+
+ self._init(space)
+ self._reset_buf()
+
+ def _reset_buf(self):
+ self.read_end = -1
+
W_BufferedReader.typedef = TypeDef(
'BufferedReader', W_BufferedIOBase.typedef,
__new__ = generic_new_descr(W_BufferedReader),
+ __init__ = interp2app(W_BufferedReader.descr_init),
)
class W_BufferedWriter(W_BufferedIOBase):
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 Wed Oct 20 20:03:56 2010
@@ -110,6 +110,20 @@
return space.w_False
@unwrap_spec('self', ObjSpace)
+ def check_readable_w(self, space):
+ if not space.is_true(space.call_method(self, 'readable')):
+ raise OperationError(
+ space.w_IOError,
+ space.wrap("file or stream is not readable"))
+
+ @unwrap_spec('self', ObjSpace)
+ def check_writable_w(self, space):
+ if not space.is_true(space.call_method(self, 'writable')):
+ raise OperationError(
+ space.w_IOError,
+ space.wrap("file or stream is not writable"))
+
+ @unwrap_spec('self', ObjSpace)
def check_seekable_w(self, space):
if not space.is_true(space.call_method(self, 'seekable')):
raise OperationError(
@@ -214,6 +228,8 @@
readable = interp2app(W_IOBase.readable_w),
writable = interp2app(W_IOBase.writable_w),
seekable = interp2app(W_IOBase.seekable_w),
+ _checkReadable = interp2app(W_IOBase.check_readable_w),
+ _checkWritable = interp2app(W_IOBase.check_writable_w),
_checkSeekable = interp2app(W_IOBase.check_seekable_w),
closed = GetSetProperty(W_IOBase.closed_get_w),
Added: pypy/branch/fast-forward/pypy/module/_io/test/test_bufferedio.py
==============================================================================
--- (empty file)
+++ pypy/branch/fast-forward/pypy/module/_io/test/test_bufferedio.py Wed Oct 20 20:03:56 2010
@@ -0,0 +1,14 @@
+from pypy.conftest import gettestobjspace
+from pypy.tool.udir import udir
+
+class AppTestBufferedIO:
+ def setup_class(cls):
+ cls.space = gettestobjspace(usemodules=['_io'])
+ tmpfile = udir.join('tmpfile')
+ tmpfile.write("a\nb\nc", mode='wb')
+ cls.w_tmpfile = cls.space.wrap(str(tmpfile))
+
+ def test_simple(self):
+ import _io
+ raw = _io.FileIO(self.tmpfile)
+ _io.BufferedReader(raw)
More information about the Pypy-commit
mailing list