(cross-posted to pyrex/cython, apologies if this is bad behavior)

I've run into a number of issues with casting python objects to void* and
back. 

Ultimately the reason I want to do this is to allow C functions to call
python functions as callbacks, passing python callables as void* to C is a
pattern that has been discussed on these lists multiple times.

However, in addition to python callables, I want to figure out how I can
pass other python objects to the python callback through the void* trick.

Here is some test code for this:
 
---------
void.pyx
---------

cdef void* pack_tuple( int i, int j ):
    t = ( i, j )
    return <void*>t

cdef void* pack_dict( int i, int j ):
    d = { 'i': i, 'j': j }
    return <void*>d

cdef unpack_tuple( void* t ):
    u = <object>t

    print u
    print u[0]
    print u[1]

    # (<refcnt 0 at 0xb7d3ca2c>, 10)
    # (<refcnt 0 at 0xb7d3ca0c>, <type 'str'>)
    # 10


cdef unpack_dict( void* d ):
    u = <object>d

    # print u

    # {'Py_Repr': [{...}, [...]]}
    # Fatal Python error: GC object already tracked
    # Aborted

    print u['i']
    print u['j']

    #     5
    #     10

cpdef run_tuple(int i, int j):
    print "__Tuple__"
    cdef void* packed
    packed = pack_tuple(i,j)
    unpack_tuple(packed)
    print "Done"

cpdef run_dict(int i, int j):
    print "__Dict__"
    cdef void* packed
    packed = pack_dict(i,j)
    unpack_dict(packed)
    print "Done"

------------
void_test.py
------------

import void

if __name__ == "__main__":

    void.run_tuple(5,10)
    void.run_dict(5,10)


--x-x-x---

Here are the problems I'm encountering:

1) packing as a tuple just doesn't work. The first argument (5) cannot be
retrieved. See output in comments above.

2) If I put in a dummy first argument in pack_tuple, like ('', 5, 10), I get
(<nil>, 5, 10), but accessing index 0 segfaults. I can access index 1 and 2
(containing 5 and 10 respectively) just fine though. What is going on here?

3) Packing as a dict seems to work well, except that if I try to print this
dict, it aborts. 

4) Calling run_tuple causes the program to hang on exit.

5) Lists behave similar to tuples.

Any help would be greatly appreciated.
For reference, I'm using

$ cython -v
Cython version 0.9.6.14

$ uname -a
Linux greyice 2.6.24-17-generic #1 SMP Thu May 1 14:31:33 UTC 2008 i686
GNU/Linux

$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2
--enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr
--enable-targets=all --enable-checking=release --build=i486-linux-gnu
--host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)

$ python -V
Python 2.5.2

Compilation and running:

$ cython void.pyx
$ gcc -c -fPIC -I/usr/include/python2.5/ void.c
$ gcc -shared void.o  -o void.so
$ python void_test.py

Thanks
Venky Iyer

_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to