[Pyrex] using c-methods for callbacks?

Robert Bradshaw robertwb at math.washington.edu
Sat May 30 17:35:13 CEST 2009


On May 29, 2009, at 9:00 PM, Lenard Lindstrom wrote:

> horace wrote:
>> hi,
>>
>> it would be great if i could use c-methods for callbacks but i always
>> get a crash if i access self. am i doing something wrong or doesn't
>> self get assigned correctly if the method gets called from a c- 
>> library?
>>
>> cdef class Engine:
>>   ...
>>   cdef void on_space(self): # i pass this to the c-library to be used
>> as the callback
>>     print "test!" # this works
>>     print self # this crashes
>> --------------------------------------------------------------------- 
>> ---
>>
>> _______________________________________________
>> Pyrex mailing list
>> Pyrex at lists.copyleft.no
>> http://lists.copyleft.no/mailman/listinfo/pyrex
>>
> ctypes creates C closures through libffi. That binds the self argument
> with a value. Cython won't do that. It requires assembly code, so  
> is not
> portable. You either have to get your function's arguments through
> global variables or hope the callback mechanism includes an argument
> passing mechanism. If that later, I don't know exactly how to  
> convert a
> Python object to a void pointer and back in Cython. If the  
> callbacks are
> passed a keyboard key argument by the caller then that could be  
> used as
> a key into a dictionary of Python functions.

You can write <void*>foo to convert from an object to a void* (and  
<object>x to go the other way), but note that if you do this it is  
your job to make sure the object doesn't go out of scope/get  
deallocated while the callback can still be called. If speed is not a  
concern, sticking it in a dict and using an int to retrieve it is a  
great idea.

- Robert




More information about the Pyrex mailing list