Author: mattip <matti.pi...@gmail.com> Branch: object-dtype2 Changeset: r76694:be19ae2bdd93 Date: 2015-04-01 23:22 +0300 http://bitbucket.org/pypy/pypy/changeset/be19ae2bdd93/
Log: small tweaks to dtype name, customtrace; add (failing) tests diff --git a/pypy/module/micronumpy/boxes.py b/pypy/module/micronumpy/boxes.py --- a/pypy/module/micronumpy/boxes.py +++ b/pypy/module/micronumpy/boxes.py @@ -868,7 +868,7 @@ __len__ = interp2app(W_UnicodeBox.descr_len), ) -W_ObjectBox.typedef = TypeDef("numpy.object", W_ObjectBox.typedef, +W_ObjectBox.typedef = TypeDef("numpy.object_", W_ObjectBox.typedef, __new__ = interp2app(W_ObjectBox.descr__new__.im_func), __getattr__ = interp2app(W_ObjectBox.descr__getattr__), ) 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 @@ -346,15 +346,12 @@ def customtrace(gc, obj, callback, arg): #debug_print('in customtrace w/obj', obj) - length = rffi.cast(rffi.SIGNEDP, obj + offset_of_length)[0] - step = rffi.cast(rffi.SIGNEDP, obj + offset_of_step)[0] + length = (obj + offset_of_length).signed[0] + step = (obj + offset_of_step).signed[0] storage = (obj + offset_of_storage).address[0] - debug_print('tracing', length, 'objects in ndarray.storage') + #debug_print('tracing', length, 'objects in ndarray.storage') i = 0 while i < length: - #gcref = rffi.cast(llmemory.GCREF, storage) - #w_obj = cast_gcref_to_instance(W_Root, gcref) - #debug_print('tracing', w_obj) gc._trace_callback(callback, arg, storage) storage += step i += 1 @@ -369,7 +366,7 @@ gcstruct = lltype.malloc(OBJECTSTORE) # JIT does not support cast_ptr_to_adr gcstruct.storage = llmemory.cast_ptr_to_adr(storage) - print 'create gcstruct',gcstruct,'with storage',storage,'as',gcstruct.storage + #print 'create gcstruct',gcstruct,'with storage',storage,'as',gcstruct.storage gcstruct.length = length gcstruct.step = elsize return gcstruct diff --git a/pypy/module/micronumpy/test/test_dtypes.py b/pypy/module/micronumpy/test/test_dtypes.py --- a/pypy/module/micronumpy/test/test_dtypes.py +++ b/pypy/module/micronumpy/test/test_dtypes.py @@ -1350,42 +1350,4 @@ assert a[0] == 1 assert (a + a)[1] == 4 -class AppTestObjectDtypes(BaseNumpyAppTest): - def test_scalar_from_object(self): - from numpy import array - import sys - class Polynomial(object): - def whatami(self): - return 'an object' - a = array(Polynomial()) - assert a.shape == () - assert a.sum().whatami() == 'an object' - def test_uninitialized_object_array_is_filled_by_None(self): - import numpy as np - - a = np.ndarray([5], dtype="O") - - assert a[0] == None - - def test_object_arrays_add(self): - import numpy as np - - a = np.array(["foo"], dtype=object) - b = np.array(["bar"], dtype=object) - - res = a + b - assert res[0] == "foobar" - - def test_keep_object_alive(self): - # XXX how can I run this test? - import numpy as np - import gc - class O(object): - def whatami(self): - return 'an object' - fiveOs = [O()] * 5 - a = np.array(fiveOs, dtype=object) - del fiveOs - gc.collect() - assert a[2].whatami() == 'an object' diff --git a/pypy/module/micronumpy/test/test_object_arrays.py b/pypy/module/micronumpy/test/test_object_arrays.py new file mode 100644 --- /dev/null +++ b/pypy/module/micronumpy/test/test_object_arrays.py @@ -0,0 +1,53 @@ +from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest + + +class AppTestObjectDtypes(BaseNumpyAppTest): + def test_scalar_from_object(self): + from numpy import array + import sys + class Polynomial(object): + def whatami(self): + return 'an object' + a = array(Polynomial()) + assert a.shape == () + assert a.sum().whatami() == 'an object' + + def test_uninitialized_object_array_is_filled_by_None(self): + import numpy as np + + a = np.ndarray([5], dtype="O") + + assert a[0] == None + + def test_object_arrays_add(self): + import numpy as np + + a = np.array(["foo"], dtype=object) + b = np.array(["bar"], dtype=object) + + res = a + b + assert res[0] == "foobar" + + def test_reduce(self): + import numpy as np + class O(object): + def whatami(self): + return 'an object' + fiveOs = [O()] * 5 + a = np.array(fiveOs, dtype=object) + print np.maximum + b = np.maximum.reduce(a) + assert b is not None + + def test_keep_object_alive(self): + # only translated does it really test the gc + import numpy as np + import gc + class O(object): + def whatami(self): + return 'an object' + fiveOs = [O()] * 5 + a = np.array(fiveOs, dtype=object) + del fiveOs + gc.collect() + assert a[2].whatami() == 'an object' diff --git a/pypy/module/micronumpy/test/test_ufuncs.py b/pypy/module/micronumpy/test/test_ufuncs.py --- a/pypy/module/micronumpy/test/test_ufuncs.py +++ b/pypy/module/micronumpy/test/test_ufuncs.py @@ -401,7 +401,7 @@ # tests that by calling all available ufuncs on scalars, none will # raise uncaught interp-level exceptions, (and crash the test) # and those that are uncallable can be accounted for. - # test on the four base-class dtypes: int, bool, float, complex + # test on the base-class dtypes: int, bool, float, complex, object # We need this test since they have no common base class. import numpy as np def find_uncallable_ufuncs(dtype): @@ -427,6 +427,7 @@ 'fabs', 'fmod', 'invert', 'mod', 'logaddexp', 'logaddexp2', 'left_shift', 'right_shift', 'copysign', 'signbit', 'ceil', 'floor', 'trunc']) + assert find_uncallable_ufuncs('object') == set() def test_int_only(self): from numpy import bitwise_and, array _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit