From: Sebastian H. <ha...@ms...> - 2007-01-18 16:56:52
|
Hi, assume my (to be wrapped) C function expects a "float" argument. SWIG accepts many different value type in the target language and converts accordingly. E.g. I can call my function with any of Python's types int or float (which is a C-double). The new numpy module though introduces many new scalar types on the Python side. These are various custom classes introduced to support all flavors of C types from 'bool' to 'unsingned short'. Numpy provides a comprehensive C-API to do type-checks and conversions on these scalars. Trying to call my C function with any of these results in a type error. How can I make SWIG to have my function accept any of the regular python scalars and at the same time any of the new ones ? It seems to me that this cannot be done by a normal SWIG-typemap. Instead I think I need to know where functions like SWIGINTERN int SWIG_AsVal_double(PyObject *obj, double *val) are being defined. Thanks, Sebastian Haase |
From: Josh C. <jc...@nc...> - 2007-01-18 18:33:21
|
On Thu, 18 Jan 2007, Sebastian Haase wrote: > How can I make SWIG to have my function accept any of the regular > python scalars and at the same time any of the new ones ? > It seems to me that this cannot be done by a normal SWIG-typemap. > Instead I think I need to know where functions like > SWIGINTERN int SWIG_AsVal_double(PyObject *obj, double *val) > are being defined. I think you can just write typemaps that do not call these functions. I think that if you look at sufficiently old versions of SWIG, you'll see default typemaps for double, int, etc. that call the Python C API directly. You could add to those to utilize these other scalar types as well. Josh |
From: Sebastian H. <ha...@ms...> - 2007-01-28 20:23:17
|
On 1/18/07, Josh Cherry <jc...@nc...> wrote: > > > On Thu, 18 Jan 2007, Sebastian Haase wrote: > > > How can I make SWIG to have my function accept any of the regular > > python scalars and at the same time any of the new ones ? > > It seems to me that this cannot be done by a normal SWIG-typemap. > > Instead I think I need to know where functions like > > SWIGINTERN int SWIG_AsVal_double(PyObject *obj, double *val) > > are being defined. > > I think you can just write typemaps that do not call these functions. I > think that if you look at sufficiently old versions of SWIG, you'll see > default typemaps for double, int, etc. that call the Python C API > directly. You could add to those to utilize these other scalar types as > well. > > Josh > Thanks for the hint - that worked. But know I find that I have many type-specific functions, that using my typemap ".i" file will always ALL be put into the wrapper file, if they are actually needed or not. It seems, the code from pyprimtypes.swg (yes, I think this is where the default scalr type mapping is coming from these days) is only put "on-demand" into the wrap.cxx-file. How can I do this ? Even worse, my code makes use e.g. of SWIG_CheckUnsignedLongInRange(...) and then I get a function-undefined error - because this might not be put in . Thanks, Sebastian |
From: Josh C. <jc...@nc...> - 2007-01-31 19:56:10
|
On Sun, 28 Jan 2007, Sebastian Haase wrote: > But know I find that I have many type-specific functions, > that using my typemap ".i" file will always ALL be put into the > wrapper file, if they are actually needed or not. > > It seems, the code from pyprimtypes.swg > (yes, I think this is where the default scalr type mapping is coming > from these days) > is only put "on-demand" into the wrap.cxx-file. > How can I do this ? I imagine that all the "%fragment" stuff is doing that, but I don't know much about it. You could put the functionality in your typemaps rather than in separate functions. Also, if the functions are inlined, the "extra" ones won't affect the object code size. > Even worse, my code makes use e.g. of > SWIG_CheckUnsignedLongInRange(...) > and then I get a function-undefined error - because this might not be put in . Well, if you must use this, why not copy it, give it a different name, and have your typemap .i file insert it? Josh |