[pypy-commit] pypy dtypes-compatability: split out _get_shape, wip
mattip
noreply at buildbot.pypy.org
Sun Jul 12 22:12:24 CEST 2015
Author: mattip <matti.picus at gmail.com>
Branch: dtypes-compatability
Changeset: r78537:51bdd6b20e88
Date: 2015-07-11 22:34 +0300
http://bitbucket.org/pypy/pypy/changeset/51bdd6b20e88/
Log: split out _get_shape, wip
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
@@ -865,6 +865,33 @@
dtype.descr_set_metadata(space, w_metadata)
return dtype
+def _get_shape(space, w_shape):
+ if w_shape is None:
+ return None
+ if space.isinstance_w(w_shape, space.w_int):
+ dim = space.int_w(w_shape)
+ return [dim]
+ shape_w = space.fixedview(w_shape)
+ if len(shape_w) == 1:
+ if not space.isinstance_w(shape_w[0], space.w_int):
+ return None
+ shape = []
+ for w_dim in shape_w:
+ try:
+ dim = space.int_w(w_dim)
+ except OperationError as e:
+ if e.match(space, space.w_OverflowError):
+ raise oefmt(space.w_ValueError, "invalid shape in fixed-type tuple.")
+ else:
+ raise
+ if dim > 2 ** 32 -1:
+ raise oefmt(space.w_ValueError, "invalid shape in fixed-type tuple: "
+ "dimension does not fit into a C int.")
+ elif dim < 0:
+ raise oefmt(space.w_ValueError, "invalid shape in fixed-type tuple: "
+ "dimension smaller than zero.")
+ shape.append(dim)
+ return shape
@unwrap_spec(align=bool, copy=bool)
def descr__new__(space, w_subtype, w_dtype, align=False, copy=False,
@@ -878,33 +905,15 @@
def make_new_dtype(space, w_subtype, w_dtype, alignment, copy=False, w_shape=None, w_metadata=None):
cache = get_dtype_cache(space)
- if w_shape is not None and (space.isinstance_w(w_shape, space.w_int) or
- space.len_w(w_shape) > 0):
+ shape = _get_shape(space, w_shape)
+ if shape is not None:
subdtype = make_new_dtype(space, w_subtype, w_dtype, alignment, copy, w_metadata=w_metadata)
+ if len(shape) == 1 and shape[0] == 1:
+ print '_get_shape returned', shape
+ return subdtype
+ print 'uhh, _get_shape returned', shape
assert isinstance(subdtype, W_Dtype)
- size = 1
- if space.isinstance_w(w_shape, space.w_int):
- dim = space.int_w(w_shape)
- if dim == 1:
- return subdtype
- w_shape = space.newtuple([w_shape])
- shape = []
- for w_dim in space.fixedview(w_shape):
- try:
- dim = space.int_w(w_dim)
- except OperationError as e:
- if e.match(space, space.w_OverflowError):
- raise oefmt(space.w_ValueError, "invalid shape in fixed-type tuple.")
- else:
- raise
- if dim > 2 ** 32 -1:
- raise oefmt(space.w_ValueError, "invalid shape in fixed-type tuple: "
- "dimension does not fit into a C int.")
- elif dim < 0:
- raise oefmt(space.w_ValueError, "invalid shape in fixed-type tuple: "
- "dimension smaller than zero.")
- shape.append(dim)
- size *= dim
+ size = support.product(shape)
size *= subdtype.elsize
if size >= 2 ** 31:
raise oefmt(space.w_ValueError, "invalid shape in fixed-type tuple: "
@@ -993,8 +1002,9 @@
W_Dtype.descr_set_names,
W_Dtype.descr_del_names),
metadata = GetSetProperty(W_Dtype.descr_get_metadata,
- W_Dtype.descr_set_metadata,
- W_Dtype.descr_del_metadata),
+ #W_Dtype.descr_set_metadata,
+ #W_Dtype.descr_del_metadata,
+ ),
flags = GetSetProperty(W_Dtype.descr_get_flags),
__eq__ = interp2app(W_Dtype.descr_eq),
More information about the pypy-commit
mailing list