[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