ctypes and setjmp
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.
Preguntá. Respondé. Descubrí.
Todo lo que querías saber, y lo que ni imaginabas,
está en Yahoo! Respuestas (Beta).
More information about the Python-list