[pypy-commit] pypy PyBuffer-backport: Update micronumpy
rlamy
pypy.commits at gmail.com
Wed May 10 14:04:10 EDT 2017
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: PyBuffer-backport
Changeset: r91223:4c49b02f7487
Date: 2017-05-10 19:03 +0100
http://bitbucket.org/pypy/pypy/changeset/4c49b02f7487/
Log: Update micronumpy
diff --git a/pypy/module/micronumpy/concrete.py b/pypy/module/micronumpy/concrete.py
--- a/pypy/module/micronumpy/concrete.py
+++ b/pypy/module/micronumpy/concrete.py
@@ -1,3 +1,4 @@
+from pypy.interpreter.buffer import BufferView
from pypy.interpreter.error import oefmt
from rpython.rlib import jit, rgc
from rpython.rlib.rarithmetic import ovfcheck
@@ -21,7 +22,7 @@
TimSort = make_timsort_class()
class StrideSort(TimSort):
- '''
+ '''
argsort (return the indices to sort) a list of strides
'''
def __init__(self, rangelist, strides, order):
@@ -380,14 +381,14 @@
def get_buffer(self, space, flags):
errtype = space.w_ValueError # should be BufferError, numpy does this instead
- if ((flags & space.BUF_C_CONTIGUOUS) == space.BUF_C_CONTIGUOUS and
+ if ((flags & space.BUF_C_CONTIGUOUS) == space.BUF_C_CONTIGUOUS and
not self.flags & NPY.ARRAY_C_CONTIGUOUS):
raise oefmt(errtype, "ndarray is not C-contiguous")
- if ((flags & space.BUF_F_CONTIGUOUS) == space.BUF_F_CONTIGUOUS and
+ if ((flags & space.BUF_F_CONTIGUOUS) == space.BUF_F_CONTIGUOUS and
not self.flags & NPY.ARRAY_F_CONTIGUOUS):
raise oefmt(errtype, "ndarray is not Fortran contiguous")
if ((flags & space.BUF_ANY_CONTIGUOUS) == space.BUF_ANY_CONTIGUOUS and
- not (self.flags & NPY.ARRAY_F_CONTIGUOUS and
+ not (self.flags & NPY.ARRAY_F_CONTIGUOUS and
self.flags & NPY.ARRAY_C_CONTIGUOUS)):
raise oefmt(errtype, "ndarray is not contiguous")
if ((flags & space.BUF_STRIDES) != space.BUF_STRIDES and
@@ -397,7 +398,7 @@
not self.flags & NPY.ARRAY_WRITEABLE):
raise oefmt(errtype, "buffer source array is read-only")
readonly = not (flags & space.BUF_WRITABLE) == space.BUF_WRITABLE
- return ArrayBuffer(self, readonly)
+ return ArrayView(self, readonly)
def astype(self, space, dtype, order, copy=True):
# copy the general pattern of the strides
@@ -527,7 +528,7 @@
try:
length = support.product_check(shape)
self.size = ovfcheck(length * dtype.elsize)
- except OverflowError:
+ except OverflowError:
raise oefmt(dtype.itemtype.space.w_ValueError, "array is too big.")
if storage == lltype.nullptr(RAW_STORAGE):
if dtype.num == NPY.OBJECT:
@@ -701,10 +702,8 @@
def __del__(self):
free_raw_storage(self.storage)
-
-class ArrayBuffer(Buffer):
+class ArrayData(Buffer):
_immutable_ = True
-
def __init__(self, impl, readonly):
self.impl = impl
self.readonly = readonly
@@ -725,6 +724,28 @@
from rpython.rtyper.lltypesystem import rffi
return rffi.ptradd(self.impl.storage, self.impl.start)
+
+class ArrayView(BufferView):
+ _immutable_ = True
+
+ def __init__(self, impl, readonly):
+ self.impl = impl
+ self.readonly = readonly
+ self.data = ArrayData(impl, readonly)
+
+ def getlength(self):
+ return self.data.getlength()
+
+ def getbytes(self, start, size):
+ return self.data[start:start + size]
+
+ def as_readbuf(self):
+ return ArrayData(self.impl, readonly=True)
+
+ def as_writebuf(self):
+ assert not self.readonly
+ return ArrayData(self.impl, readonly=False)
+
def getformat(self):
sb = StringBuilder()
self.impl.dtype.getformat(sb)
@@ -741,5 +762,3 @@
def getstrides(self):
return self.impl.strides
-
-
diff --git a/pypy/module/micronumpy/ndarray.py b/pypy/module/micronumpy/ndarray.py
--- a/pypy/module/micronumpy/ndarray.py
+++ b/pypy/module/micronumpy/ndarray.py
@@ -3,6 +3,7 @@
WrappedDefault
from pypy.interpreter.typedef import TypeDef, GetSetProperty, \
make_weakref_descr
+from pypy.interpreter.buffer import SimpleView
from rpython.rlib import jit
from rpython.rlib.rstring import StringBuilder
from rpython.rlib.rawstorage import RAW_STORAGE_PTR
@@ -806,17 +807,9 @@
def buffer_w(self, space, flags):
return self.implementation.get_buffer(space, flags)
- def readbuf_w(self, space):
- return self.implementation.get_buffer(space, space.BUF_FULL_RO)
-
- def writebuf_w(self, space):
- return self.implementation.get_buffer(space, space.BUF_FULL)
-
- def charbuf_w(self, space):
- return self.implementation.get_buffer(space, space.BUF_FULL_RO).as_str()
-
def descr_get_data(self, space):
- return space.newbuffer(self.implementation.get_buffer(space, space.BUF_FULL))
+ return space.newbuffer(
+ self.implementation.get_buffer(space, space.BUF_FULL).as_writebuf())
@unwrap_spec(offset=int, axis1=int, axis2=int)
def descr_diagonal(self, space, offset=0, axis1=0, axis2=1):
More information about the pypy-commit
mailing list