[pypy-commit] pypy dtypes-compatability: add, implement flags, fix alignment
mattip
noreply at buildbot.pypy.org
Wed Jun 10 22:06:17 CEST 2015
Author: mattip <matti.picus at gmail.com>
Branch: dtypes-compatability
Changeset: r78018:37b77ed73855
Date: 2015-06-10 23:04 +0300
http://bitbucket.org/pypy/pypy/changeset/37b77ed73855/
Log: add, implement flags, fix alignment
diff --git a/pypy/module/micronumpy/constants.py b/pypy/module/micronumpy/constants.py
--- a/pypy/module/micronumpy/constants.py
+++ b/pypy/module/micronumpy/constants.py
@@ -92,6 +92,21 @@
ARRAY_ELEMENTSTRIDES = 0x0080 # strides are units of the dtype element size
ARRAY_NOTSWAPPED = 0x0200 #native byte order
+#dtype flags
+ITEM_REFCOUNT = 0x01
+ITEM_HASOBJECT = 0x01
+LIST_PICKLE = 0x02
+ITEM_IS_POINTER = 0x04
+NEEDS_INIT = 0x08
+NEEDS_PYAPI = 0x10
+USE_GETITEM = 0x20
+USE_SETITEM = 0x40
+ALIGNED_STRUCT = 0x80
+FROM_FIELDS = NEEDS_INIT | LIST_PICKLE | ITEM_REFCOUNT | NEEDS_PYAPI
+OBJECT_DTYPE_FLAGS = (LIST_PICKLE | USE_GETITEM | ITEM_IS_POINTER |
+ ITEM_REFCOUNT | NEEDS_INIT | NEEDS_PYAPI)
+
+
LITTLE = '<'
BIG = '>'
NATIVE = '='
diff --git a/pypy/module/micronumpy/descriptor.py b/pypy/module/micronumpy/descriptor.py
--- a/pypy/module/micronumpy/descriptor.py
+++ b/pypy/module/micronumpy/descriptor.py
@@ -54,7 +54,7 @@
class W_Dtype(W_Root):
_immutable_fields_ = [
"itemtype?", "w_box_type", "byteorder?", "names?", "fields?",
- "elsize?", "alignment?", "shape?", "subdtype?", "base?"]
+ "elsize?", "alignment?", "shape?", "subdtype?", "base?", "flags?"]
@enforceargs(byteorder=SomeChar())
def __init__(self, itemtype, w_box_type, byteorder=NPY.NATIVE, names=[],
@@ -69,13 +69,17 @@
if elsize < 0:
elsize = itemtype.get_element_size()
self.elsize = elsize
- self.alignment = itemtype.alignment
self.shape = shape
self.subdtype = subdtype
+ self.flags = 0
+ if isinstance(itemtype, types.ObjectType):
+ self.flags = NPY.OBJECT_DTYPE_FLAGS
if not subdtype:
self.base = self
+ self.alignment = itemtype.get_element_size()
else:
self.base = subdtype.base
+ self.alignment = subdtype.itemtype.get_element_size()
@property
def num(self):
@@ -216,7 +220,7 @@
return space.newlist(descr)
def descr_get_hasobject(self, space):
- return space.w_False
+ return space.wrap(self.is_object())
def descr_get_isbuiltin(self, space):
if self.fields is None:
@@ -238,6 +242,9 @@
def descr_get_shape(self, space):
return space.newtuple([space.wrap(dim) for dim in self.shape])
+ def descr_get_flags(self, space):
+ return space.wrap(self.flags)
+
def descr_get_fields(self, space):
if not self.fields:
return space.w_None
@@ -429,7 +436,6 @@
version = space.wrap(3)
endian = self.byteorder
- flags = 0
if endian == NPY.NATIVE:
endian = NPY.NATBYTE
subdescr = self.descr_get_subdtype(space)
@@ -441,7 +447,7 @@
else:
w_size = space.wrap(-1)
w_alignment = space.wrap(-1)
- w_flags = space.wrap(flags)
+ w_flags = space.wrap(self.flags)
data = space.newtuple([version, space.wrap(endian), subdescr,
names, values, w_size, w_alignment, w_flags])
@@ -466,6 +472,7 @@
w_fields = space.getitem(w_data, space.wrap(4))
size = space.int_w(space.getitem(w_data, space.wrap(5)))
alignment = space.int_w(space.getitem(w_data, space.wrap(6)))
+ flags = space.int_w(space.getitem(w_data, space.wrap(7)))
if (w_names == space.w_None) != (w_fields == space.w_None):
raise oefmt(space.w_ValueError, "inconsistent fields and names in Numpy dtype unpickling")
@@ -507,6 +514,7 @@
if self.is_flexible():
self.elsize = size
self.alignment = alignment
+ self.flags = flags
@unwrap_spec(new_order=str)
def descr_newbyteorder(self, space, new_order=NPY.SWAP):
@@ -560,12 +568,14 @@
if align:
# Set offset to the next power-of-two above offset
offset = (offset + maxalign -1) & (-maxalign)
- return W_Dtype(types.RecordType(space), space.gettypefor(boxes.W_VoidBox),
+ retval = W_Dtype(types.RecordType(space), space.gettypefor(boxes.W_VoidBox),
names=names, fields=fields, elsize=offset)
-
+ retval.flags |= NPY.NEEDS_PYAPI
+ return retval
def dtype_from_dict(space, w_dict):
raise oefmt(space.w_NotImplementedError, "dtype from dict")
+ retval.flags |= NPY.NEEDS_PYAPI
def dtype_from_spec(space, w_spec):
@@ -690,7 +700,7 @@
return dtype
if space.isinstance_w(w_dtype, space.w_type) and \
space.is_true(space.issubtype(w_dtype, dtype.w_box_type)):
- return W_Dtype(dtype.itemtype, w_box_type=w_dtype, elsize=0)
+ return W_Dtype(dtype.itemtype, w_dtype, elsize=0)
if space.isinstance_w(w_dtype, space.w_type):
return cache.w_objectdtype
raise oefmt(space.w_TypeError, "data type not understood")
@@ -720,6 +730,7 @@
names = GetSetProperty(W_Dtype.descr_get_names,
W_Dtype.descr_set_names,
W_Dtype.descr_del_names),
+ flags = GetSetProperty(W_Dtype.descr_get_flags),
__eq__ = interp2app(W_Dtype.descr_eq),
__ne__ = interp2app(W_Dtype.descr_ne),
More information about the pypy-commit
mailing list