This bug was caused by the fact that ctypes silently converts returned
c_void_p instances into python int values, even if the restype of a function
is c_void_p. Then, without explicit argtypes (which this module doesn't use,
out of laziness on my part), python ints passed to functions are treated as
32-bit ints.
Solution: explicitly wrap returned pointers as c_void_p, so that they'll get
treated right when passed back to C. No more segfaults!
I also reverted the _wrap_bitmap_bits_in_array code to what I wrote, as I
can vouch for that on 64-bit, whereas the other version had a "still crashes"
note...
(1) normalize_indices in _mcp.pyx should convert indices to ints: fixed
(2) huge (order of magnitude) performance problems in heap.pyx from changing
lines like:
ii = (i-1)/2 # CalcPrevAbs
to:
ii = (int)(i-1)/2 # CalcPrevAbs
for some reason, the latter goes through the python division machinery!
However, the former is invalid for cython >=0.12, so the proper solution is:
ii = (i-1)//2 # CalcPrevAbs
spath.shortest_path presents the same interface, but now uses the new mcp
classes internally, which means that it is now fully n-d, and can also find
the shortest path along any given axis. The old output format has been
retained, but is a bit weird for non-2d arrays. A more sensible n-d output
format is available, but not enabled by default.
(1) Now uses subprocess.call instead of os.system, so that paths with spaces
(and the like) are handled properly.
(2) Removes superfluous .c.new files after deciding whether or not to copy
them to the .c files.