[pypy-svn] r78830 - in pypy/branch/fast-forward/pypy: interpreter module/__builtin__ module/__builtin__/test

arigo at codespeak.net arigo at codespeak.net
Sun Nov 7 18:59:08 CET 2010


Author: arigo
Date: Sun Nov  7 18:59:06 2010
New Revision: 78830

Added:
   pypy/branch/fast-forward/pypy/module/__builtin__/memoryview.py
Modified:
   pypy/branch/fast-forward/pypy/interpreter/buffer.py
   pypy/branch/fast-forward/pypy/module/__builtin__/__init__.py
   pypy/branch/fast-forward/pypy/module/__builtin__/operation.py
   pypy/branch/fast-forward/pypy/module/__builtin__/test/test_buffer.py
Log:
Implement the built-in 'memoryview' type as a thin wrapper around
an interp-level buffer.


Modified: pypy/branch/fast-forward/pypy/interpreter/buffer.py
==============================================================================
--- pypy/branch/fast-forward/pypy/interpreter/buffer.py	(original)
+++ pypy/branch/fast-forward/pypy/interpreter/buffer.py	Sun Nov  7 18:59:06 2010
@@ -207,7 +207,6 @@
     __mul__ = interp2app(Buffer.descr_mul),
     __rmul__ = interp2app(Buffer.descr_mul),
     __repr__ = interp2app(Buffer.descr_repr),
-    tobytes = interp2app(Buffer.descr_str),
     )
 Buffer.typedef.acceptable_as_base_class = False
 

Modified: pypy/branch/fast-forward/pypy/module/__builtin__/__init__.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/__builtin__/__init__.py	(original)
+++ pypy/branch/fast-forward/pypy/module/__builtin__/__init__.py	Sun Nov  7 18:59:06 2010
@@ -52,8 +52,8 @@
         'object'        : '(space.w_object)',
         'bytes'         : '(space.w_str)',
         'unicode'       : '(space.w_unicode)',
-        'buffer'        : 'operation.W_Buffer',
-        'memoryview'    : 'operation.W_Buffer',
+        'buffer'        : 'memoryview.W_Buffer',
+        'memoryview'    : 'memoryview.W_MemoryView',
 
         'file'          : 'state.get(space).w_file',
         'open'          : 'state.get(space).w_file',

Added: pypy/branch/fast-forward/pypy/module/__builtin__/memoryview.py
==============================================================================
--- (empty file)
+++ pypy/branch/fast-forward/pypy/module/__builtin__/memoryview.py	Sun Nov  7 18:59:06 2010
@@ -0,0 +1,138 @@
+"""
+Implementation of the 'buffer' and 'memoryview' types.
+"""
+from pypy.interpreter.baseobjspace import Wrappable
+from pypy.interpreter import gateway, buffer
+from pypy.interpreter.gateway import interp2app, unwrap_spec, ObjSpace, W_Root
+from pypy.interpreter.typedef import TypeDef, GetSetProperty
+from pypy.interpreter.error import OperationError
+
+W_Buffer = buffer.Buffer      # actually implemented in pypy.interpreter.buffer
+
+
+class W_MemoryView(Wrappable):
+    """Implement the built-in 'memoryview' type as a thin wrapper around
+    an interp-level buffer.
+    """
+
+    def __init__(self, buf):
+        assert isinstance(buf, buffer.Buffer)
+        self.buf = buf
+
+    def _make_descr__cmp(name):
+        def descr__cmp(self, space, w_other):
+            other = space.interpclass_w(w_other)
+            if not isinstance(other, W_MemoryView):
+                return space.w_NotImplemented
+            # xxx not the most efficient implementation
+            str1 = self.as_str()
+            str2 = other.as_str()
+            return space.wrap(getattr(operator, name)(str1, str2))
+        descr__cmp.unwrap_spec = ['self', ObjSpace, W_Root]
+        descr__cmp.func_name = name
+        return descr__cmp
+
+    descr_eq = _make_descr__cmp('eq')
+    descr_ne = _make_descr__cmp('ne')
+    descr_lt = _make_descr__cmp('lt')
+    descr_le = _make_descr__cmp('le')
+    descr_gt = _make_descr__cmp('gt')
+    descr_ge = _make_descr__cmp('ge')
+
+    def as_str(self):
+        return self.buf.as_str()
+
+    def getlength(self):
+        return self.buf.getlength()
+
+    def getslice(self, start, stop):
+        if start < 0:
+            start = 0
+        size = stop - start
+        if size < 0:
+            size = 0
+        buf = self.buf
+        if isinstance(buf, buffer.RWBuffer):
+            buf = buffer.RWSubBuffer(buf, start, size)
+        else:
+            buf = buffer.SubBuffer(buf, start, size)
+        return W_MemoryView(buf)
+
+    @unwrap_spec('self', ObjSpace)
+    def descr_buffer(self, space):
+        return space.wrap(self.buf)
+
+    @unwrap_spec('self', ObjSpace)
+    def descr_tobytes(self, space):
+        return space.wrap(self.as_str())
+
+    @unwrap_spec('self', ObjSpace)
+    def descr_tolist(self, space):
+        buf = self.buf
+        result = []
+        for i in range(buf.getlength()):
+            result.append(space.wrap(ord(buf.getitem(i))))
+        return space.newlist(result)
+
+    @unwrap_spec('self', ObjSpace, W_Root)
+    def descr_getitem(self, space, w_index):
+        start, stop, step = space.decode_index(w_index, self.getlength())
+        if step == 0:  # index only
+            return space.wrap(self.buf.getitem(start))
+        elif step == 1:
+            res = self.getslice(start, stop)
+            return space.wrap(res)
+        else:
+            raise OperationError(space.w_ValueError,
+                space.wrap("memoryview object does not support"
+                           " slicing with a step"))
+
+    @unwrap_spec('self', ObjSpace, W_Root, 'bufferstr')
+    def descr_setitem(self, space, w_index, newstring):
+        buf = self.buf
+        if isinstance(buf, buffer.RWBuffer):
+            buf.descr_setitem(space, w_index, newstring)
+        else:
+            raise OperationError(space.w_TypeError,
+                                 space.wrap("cannot modify read-only memory"))
+
+    @unwrap_spec('self', ObjSpace)
+    def descr_len(self, space):
+        return self.buf.descr_len(space)
+
+    def is_readonly(space, self):
+        return space.wrap(not isinstance(self.buf, buffer.RWBuffer))
+
+
+ at unwrap_spec(ObjSpace, W_Root, W_Root)
+def descr_new(space, w_subtype, w_object):
+    memoryview = W_MemoryView(space.buffer(w_object))
+    return space.wrap(memoryview)
+
+W_MemoryView.typedef = TypeDef(
+    "memoryview",
+    __doc__ = """\
+Create a new memoryview object which references the given object.
+""",
+    __new__ = interp2app(descr_new),
+    __buffer__  = interp2app(W_MemoryView.descr_buffer),
+    __eq__      = interp2app(W_MemoryView.descr_eq),
+    __ge__      = interp2app(W_MemoryView.descr_ge),
+    __getitem__ = interp2app(W_MemoryView.descr_getitem),
+    __gt__      = interp2app(W_MemoryView.descr_gt),
+    __le__      = interp2app(W_MemoryView.descr_le),
+    __len__     = interp2app(W_MemoryView.descr_len),
+    __lt__      = interp2app(W_MemoryView.descr_lt),
+    __ne__      = interp2app(W_MemoryView.descr_ne),
+    __setitem__ = interp2app(W_MemoryView.descr_setitem),
+    tobytes     = interp2app(W_MemoryView.descr_tobytes),
+    tolist      = interp2app(W_MemoryView.descr_tolist),
+    #format
+    #itemsize
+    #ndim
+    readonly    = GetSetProperty(W_MemoryView.is_readonly)
+    #shape
+    #strides
+    #suboffsets
+    )
+W_MemoryView.typedef.acceptable_as_base_class = False

Modified: pypy/branch/fast-forward/pypy/module/__builtin__/operation.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/__builtin__/operation.py	(original)
+++ pypy/branch/fast-forward/pypy/module/__builtin__/operation.py	Sun Nov  7 18:59:06 2010
@@ -2,10 +2,10 @@
 Interp-level implementation of the basic space operations.
 """
 
-from pypy.interpreter import gateway, buffer
+from pypy.interpreter import gateway
 from pypy.interpreter.baseobjspace import ObjSpace, W_Root
 from pypy.interpreter.error import OperationError
-from pypy.interpreter.gateway import interp2app, unwrap_spec
+from pypy.interpreter.gateway import interp2app
 from pypy.interpreter.typedef import TypeDef
 from pypy.rlib.runicode import UNICHR
 from pypy.rlib.rarithmetic import isnan, isinf
@@ -14,8 +14,6 @@
 import __builtin__
 NoneNotWrapped = gateway.NoneNotWrapped
 
-W_Buffer = buffer.Buffer
-
 def abs(space, w_val):
     "abs(number) -> number\n\nReturn the absolute value of the argument."
     return space.abs(w_val)

Modified: pypy/branch/fast-forward/pypy/module/__builtin__/test/test_buffer.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/__builtin__/test/test_buffer.py	(original)
+++ pypy/branch/fast-forward/pypy/module/__builtin__/test/test_buffer.py	Sun Nov  7 18:59:06 2010
@@ -160,9 +160,27 @@
         raises(ValueError, buffer, a, -1)
         raises(ValueError, buffer, a, 0, -2)
 
-class AppTestMemoryview:
+class AppTestMemoryView:
     def test_basic(self):
         v = memoryview("abc")
         assert v.tobytes() == "abc"
         assert len(v) == 3
         assert list(v) == ['a', 'b', 'c']
+        assert v.tolist() == [97, 98, 99]
+        assert v[1] == "b"
+        assert v[-1] == "c"
+        raises(TypeError, "v[1] = 'x'")
+        assert v.readonly is True
+        w = v[1:234]
+        assert isinstance(w, memoryview)
+        assert len(w) == 2
+
+    def test_rw(self):
+        data = bytearray('abcefg')
+        v = memoryview(data)
+        assert v.readonly is False
+        v[0] = 'z'
+        assert data == bytearray(b'zbcefg')
+        v[1:4] = '123'
+        assert data == bytearray(b'z123fg')
+        raises((ValueError, TypeError), "v[2] = 'spam'")



More information about the Pypy-commit mailing list