From: Joel B. M. <jm...@ga...> - 2013-01-15 21:34:26
|
Hi, I have a C(++) library which propagates errors by returning error codes in an integer return from every function. Thus the typical functions look like: long DoSomething(...); // do an operation with no result other than exceptional error long GetValue(..., RESULT *lpResult); // get the RESULT structure with possible exceptional error I'm evaluating wrapping this library with swig for access from python. I want to map the non-zero exceptional error returns to python exceptions. To this end, I've made an out typemap for long: %typemap(out) long { if( ERROR_SUCCESS != $1 ) SWIG_exception_fail(SWIG_RuntimeError, ExceptionToString($1)); } This appears promising, but the DoSomething (as above) should return PyNone. Instead I get a python exception "SystemError: error return without exception set" because the resultobj gets initialized to 0 and is never touched. I could probably set resultobj to Py_RETURN_NONE in my typemap(out), but that's not correct for functions like GetValue (as above) should return the lpResult value through a typemap(argout). I would assume this is fairly common to have integer error returns in a C library, but the closest example I could find is http://stackoverflow.com/questions/9456723/typemap-and-exception-for-error-codes-from-c-functions-for-swig-python where the exceptional error code is a parameter which a typemap(in/argout) can suppress the error parameter nicely from the higher level API. How can I have my generated resultobj be PyNone or the appropriate result in general? Thanks, Joel |