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