ctypes and setjmp

Gabriel Genellina gagsl-py at yahoo.com.ar
Sat Oct 7 02:50:39 CEST 2006

At Friday 6/10/2006 16:14, Thomas Heller wrote:

> > Currently ctypes can't play well with any C code that requires 
> use of setjmp
> > as part of its API.
> > libpng is one of those libraries.
> >
>I didn't know that setjmp/longjmp is actually used by production libraries
>for error handling.

Using setjmp to report errors in a general library is, uhm, a bit 
crazy at least!
C programmers are certainly crazy people :)

>How is this pattern used in C?  Do you call setjump() before each api call,
>or do you call setjump once, and then do all the api calls?  What do you do
>when setjmp() returns != 0?  Exit the program?  Log a message?  How do you
>determine which call failed?  How do you pass the jmp_buf that you passed to
>setjmp() to the api call?

The setjmp must be on scope when a longjmp is called. Since there is 
no endjmp/canceljmp, this in the practice means that you have to call 
setjmp in *every* function that calls another one which may issue a longjmp.
There are other alternatives in plain C (cexcept: 
http://cexcept.sourceforge.net/) but that wont help you with ctypes.

>For ctypes, the only solution I can think of is to invent a new calling
>convention, which will call setjmp() first internally before calling the
>libpng api function...

May be reasonable - a non-zero in setjmp would raise a Python 
exception. But perhaps a new calling convention is not needed: as you 
need a way to indicate *which* argument is the jmp_buf, just a new 
argument type would suffice. If you encounter one such thing in the 
function.argtypes list, that means a setjmp is needed before calling 
the actual function.

Gabriel Genellina
Softlab SRL 

Preguntá. Respondé. Descubrí.
Todo lo que querías saber, y lo que ni imaginabas,
está en Yahoo! Respuestas (Beta).
¡Probalo ya! 

More information about the Python-list mailing list