Issue with ctypes and callback functions

eryk sun eryksun at gmail.com
Wed Aug 3 18:02:45 EDT 2016


On Wed, Aug 3, 2016 at 1:21 PM, Bill Somerville
<BSomerville at flexerasoftware.com> wrote:
> I can extend the SWIG shadow class to do the creation of the prototype and thunk, the
> required cast above and any extra attributes or methods like _as_parameter_ and
> from_param() but I can't see any way of having the Python callback (my_cb) magically
> receive the SWIG wrapped 'my_type' struct.

from_param is a hook method for a type that's set in a function
pointer's argtypes. It gets called to convert an argument when the
function pointer is called from Python. The return value can be a
ctypes instance, an object with a hard-coded conversion (e.g. a string
or integer), or an object that defines an _as_parameter_ attribute.

Only ctypes types are supported in callbacks, which unfortunately
isn't documented clearly. Specifically, the class dict needs to be an
extended C storage dict (i.e. StgDictObject), either to look up the
getfunc of a simple type or to ensure that instantiating a non-simple
type returns a ctypes instance (i.e. CDataObject) with a known size.
The relevant code in _CallPythonObject is as follows (when stripped of
declarations and error handling):

    cnv = PySequence_GetItem(converters, i);
    dict = PyType_stgdict(cnv);
    if (dict && dict->getfunc && !_ctypes_simple_instance(cnv)) {
        v = dict->getfunc(*pArgs, dict->size);
        PyTuple_SET_ITEM(arglist, i, v);
    } else if (dict) {
        obj = (CDataObject *)PyObject_CallFunctionObjArgs(cnv, NULL);
        memcpy(obj->b_ptr, *pArgs, dict->size);
        PyTuple_SET_ITEM(arglist, i, (PyObject *)obj);
    } else {
        PyErr_SetString(PyExc_TypeError,
                        "cannot build parameter");

I don't have much experience with SWIG. Does it provide some means to
instantiate a wrapped type from an address? If it does, then you can
use a void pointer as the callback parameter.



More information about the Python-list mailing list