On Oct 15, 2009, at 11:40 AM, Michael Droettboom wrote:
I recently committed a regression test and bugfix for object
pointers in
record arrays of unaligned size (meaning where each record is not a
multiple of sizeof(PyObject **)).
For example:
a1 = np.zeros((10,), dtype=[('o', 'O'), ('c', 'c')])
a2 = np.zeros((10,), 'S10')
# This copying would segfault
a1['o'] = a2
http://projects.scipy.org/numpy/ticket/1198
Unfortunately, this unit test has opened up a whole hornet's nest of
alignment issues on Solaris. The various reference counting functions
(PyArray_INCREF etc.) in refcnt.c all fail on unaligned object
pointers,
for instance. Interestingly, there are comments in there saying
"handles misaligned data" (eg. line 190), but in fact it doesn't, and
doesn't look to me like it would. But I won't rule out a mistake in
building it on my part.
Thanks for this bug report. It would be very helpful if you could
provide the line number where the code is giving a bus error and
explain why you think the code in question does not handle misaligned
data (it still seems like it should to me --- but perhaps I must be
missing something --- I don't have a Solaris box to test on).
Perhaps, the real problem is elsewhere (such as other places where the
mistake of forgetting about striding needing to be aligned also before
pursuing the fast alignment path that you pointed out in another place
of code).
This was the thinking for why the code (that I think is in question)
should handle mis-aligned data:
1) pointers that are not aligned to the correct size need to be copied
to an aligned memory area before being de-referenced.
2) static variables defined in a function will be aligned by the C
compiler.
So, what the code in refcnt.c does is to copy the value in the NumPy
data-area (i.e. pointed to by it->dataptr) to another memory location
(the stack variable temp), dereference it and then increment it's
reference count.
196: temp = (PyObject **)it->dataptr;
197: Py_XINCREF(*temp);
I'm puzzled why this should fail. The stack trace showing where
this fails would be very useful in figuring out what to fix.
This is all independent of defining a variable to decide whether or
not to even care about worrying about un-aligned data (which we could
avoid worrying about on Intel and AMD).
I'm all in favor of such a flag if it would speed up code, but I don't
see it as the central issue here.
Any more details about the bug you have found would be greatly
appreciated.
-Travis
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion