Author: Matti Picus <[email protected]>
Branch: memoryview-attributes
Changeset: r86339:c7b6199d9a55
Date: 2016-08-20 21:22 +1200
http://bitbucket.org/pypy/pypy/changeset/c7b6199d9a55/

Log:    move itemsize logic to W_MemoryView (arigato), set valid defaults in
        Buffer, typos

diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -319,11 +319,7 @@
         return self.size
 
     def getitem(self, index):
-        if self.itemsize == 1:
-            return self.ptr[index]
-        start = index * self.itemsize
-        stop = (index + 1) * self.itemsize
-        return self.getslice(start, stop, 1, stop - start)
+        return self.ptr[index]
 
     def get_raw_address(self):
         return rffi.cast(rffi.CCHARP, self.ptr)
@@ -334,8 +330,8 @@
     def getshape(self):
         return self.shape
 
-    def getslice(self, start, stop, step, size):
-        return ''.join([self.ptr[i] for i in range(start, stop, step)])
+    def getitemsize(self):
+        return self.itemsize
 
 def wrap_getreadbuffer(space, w_self, w_args, func):
     func_target = rffi.cast(readbufferproc, func)
@@ -586,8 +582,8 @@
             return space.call_args(space.get(new_fn, w_self), args)
         api_func = slot_tp_new.api_func
     elif name == 'tp_as_buffer.c_bf_getbuffer':
-        buf_fn = w_type.getdictvalue(space, '__buffer__')
-        if buf_fn is None:
+        buff_fn = w_type.getdictvalue(space, '__buffer__')
+        if buff_fn is None:
             return
         @cpython_api([PyObject, Py_bufferP, rffi.INT_real], 
                 rffi.INT_real, header=None, error=-1)
diff --git a/pypy/objspace/std/memoryobject.py 
b/pypy/objspace/std/memoryobject.py
--- a/pypy/objspace/std/memoryobject.py
+++ b/pypy/objspace/std/memoryobject.py
@@ -73,6 +73,15 @@
 
     def descr_getitem(self, space, w_index):
         start, stop, step, size = space.decode_index4(w_index, 
self.getlength())
+        itemsize = self.buf.getitemsize()
+        if itemsize > 1:
+            start *= itemsize
+            size *= itemsize
+            stop  = start + size
+            if step == 0:
+                step = 1
+            if stop > self.getlength():
+                raise oefmt(space.w_IndexError, 'index out of range')
         if step not in (0, 1):
             raise oefmt(space.w_NotImplementedError, "")
         if step == 0:  # index only
@@ -85,6 +94,15 @@
         if self.buf.readonly:
             raise oefmt(space.w_TypeError, "cannot modify read-only memory")
         start, stop, step, size = space.decode_index4(w_index, 
self.getlength())
+        itemsize = self.buf.getitemsize()
+        if itemsize > 1:
+            start *= itemsize
+            size *= itemsize
+            stop  = start + size
+            if step == 0:
+                step = 1
+            if stop > self.getlength():
+                raise oefmt(space.w_IndexError, 'index out of range')
         if step not in (0, 1):
             raise oefmt(space.w_NotImplementedError, "")
         value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
diff --git a/rpython/rlib/buffer.py b/rpython/rlib/buffer.py
--- a/rpython/rlib/buffer.py
+++ b/rpython/rlib/buffer.py
@@ -60,13 +60,13 @@
         raise ValueError("no raw buffer")
 
     def getformat(self):
-        raise NotImplementedError
+        return 'B'
 
     def getitemsize(self):
-        raise NotImplementedError
+        return 1
 
     def getndim(self):
-        raise NotImplementedError
+        return 1
 
     def getshape(self):
         return [self.getlength()]
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to