Hi again,

I'm exploring the typed memoryview feature with numpy and encountered a refcount error. It seems to happen when I create a slice of a memoryview, and transpose it. If I don't do both, I don't get the refcount error. It happens in the error cleanup code. I suspect that any error that causes the function to jump to the error cleanup code will do the same thing as the Exception below -- but that seemed the easiest way to demonstrate the problem. However, if there truly is an error in my code, please let me know! Thanks,

-syam

# BEGIN CODE
import numpy
cimport numpy

class MyException(Exception):
    def __init__(self):
        Exception.__init__(self)

def testfunc():
   a = numpy.arange(12).reshape([3,4])

   cdef numpy.int_t[:,:] a_view = a

   ## here is a slice followed by a transpose
   cdef numpy.int_t[:,:] b = a_view[:,:].T
   ## same thing happens with a more realistic slicing:
   #cdef numpy.int_t[:,:] b = a_view[1:2,:].T
   ## however, there is no error if I do this instead:
   #cdef numpy.int_t[:,:] b = a_view.T
   ## also no error if I do this instead:
   #cdef numpy.int_t[:,:] b = a_view[:,:]

   # The exception below is just to force the function to abort
   # and run the extraneous __PYX_XDEC_MEMVIEW in the error
   # cleanup code:
   #   Fatal Python error: Acquisition count is 0 (line XXXX)
   # Comment out this exception and we don't get the error
   raise MyException()

try:
    testfunc()
except MyException:
    pass
# END CODE



_______________________________________________
cython-devel mailing list
cython-devel@python.org
https://mail.python.org/mailman/listinfo/cython-devel

Reply via email to