Author: Brian Kearns <[email protected]>
Branch:
Changeset: r67878:b5b32411e744
Date: 2013-11-07 18:11 -0500
http://bitbucket.org/pypy/pypy/changeset/b5b32411e744/
Log: fix segfault when calling argsort on flexible arrays
diff --git a/pypy/module/micronumpy/interp_numarray.py
b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -519,10 +519,13 @@
# by converting nonnative byte order.
if self.is_scalar():
return space.wrap(0)
- s = self.get_dtype().name
- if not self.get_dtype().is_native():
- s = s[1:]
- dtype = interp_dtype.get_dtype_cache(space).dtypes_by_name[s]
+ if not self.get_dtype().is_flexible_type():
+ s = self.get_dtype().name
+ if not self.get_dtype().is_native():
+ s = s[1:]
+ dtype = interp_dtype.get_dtype_cache(space).dtypes_by_name[s]
+ else:
+ dtype = self.get_dtype()
contig = self.implementation.astype(space, dtype)
return contig.argsort(space, w_axis)
diff --git a/pypy/module/micronumpy/test/test_sorting.py
b/pypy/module/micronumpy/test/test_sorting.py
--- a/pypy/module/micronumpy/test/test_sorting.py
+++ b/pypy/module/micronumpy/test/test_sorting.py
@@ -12,8 +12,7 @@
exp = sorted(range(len(exp)), key=exp.__getitem__)
c = a.copy()
res = a.argsort()
- assert (res == exp).all(), \
- 'a,res,dtype %r,%r,%r' % (a,res,dtype)
+ assert (res == exp).all(), '%r\n%r\n%r' % (a,res,exp)
assert (a == c).all() # not modified
a = arange(100, dtype=dtype)
@@ -60,11 +59,10 @@
for dtype in ['int', 'float', 'int16', 'float32', 'uint64',
'i2', complex]:
a = array([6, 4, -1, 3, 8, 3, 256+20, 100, 101], dtype=dtype)
- b = sorted(list(a))
- c = a.copy()
- a.sort()
- assert (a == b).all(), \
- 'a,orig,dtype %r,%r,%r' % (a,c,dtype)
+ exp = sorted(list(a))
+ res = a.copy()
+ res.sort()
+ assert (res == exp).all(), '%r\n%r\n%r' % (a,res,exp)
a = arange(100, dtype=dtype)
c = a.copy()
@@ -85,7 +83,6 @@
#assert (a == b).all(), \
# 'a,orig,dtype %r,%r,%r' % (a,c,dtype)
-
# tests from numpy/tests/test_multiarray.py
def test_sort_corner_cases(self):
# test ordering for floats and complex containing nans. It is only
@@ -307,7 +304,6 @@
assert (r == array([('a', 1), ('c', 3), ('b', 255), ('d', 258)],
dtype=mydtype)).all()
-
# tests from numpy/tests/test_regression.py
def test_sort_bigendian(self):
skip('not implemented yet')
@@ -325,3 +321,13 @@
y = fromstring("\x00\x01\x00\x02", dtype="S2")
x.sort(kind='q')
assert (x == y).all()
+
+ def test_string_mergesort(self):
+ import numpypy as np
+ import sys
+ x = np.array(['a'] * 32)
+ if '__pypy__' in sys.builtin_module_names:
+ exc = raises(NotImplementedError, "x.argsort(kind='m')")
+ assert 'non-numeric types' in exc.value.message
+ else:
+ assert (x.argsort(kind='m') == np.arange(32)).all()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit