[C++-sig] In a C++ extension, how to use a C++ class exported in another extension

Ralf W. Grosse-Kunstleve rwgk at yahoo.com
Sun Jul 3 20:56:12 CEST 2005


--- David Abrahams <dave at boost-consulting.com> wrote:
> > Looking some more, isn't this almost it?
> >
> >   http://www.boost.org/libs/python/doc/v2/lvalue_from_pytype.html
> 
> Yes.

Cool!

> > just knowing that ((PySwigObject*)obj.ptr())->ptr gives us the T*.
>
> Oh, I see; all Swig objects have the same type?

Yes!

> Well you need some way to identify the Python objects for which the
> above statement is true, unless you want to forego all error checking
> and just allow a crash if a Swig-wrapped Foo is passed where a
> Swig-wrapped Bar is expected.

I hadn't though of that. Thanks, David!

Encouraged by your "Yes" above I gave it a good push. Here is the
result:

 
http://cvs.sourceforge.net/viewcvs.py/cctbx/boost_adaptbx/swig_args_ext.cpp?view=markup

  (Also attached.)

This solution is based on what I found in SWIG-1.3.24/Lib/python/pyrun.swg.
At the heart of the solution is this simple fragment:

    static void* extract(PyObject* op) \
    { \
        if (std::strcmp(op->ob_type->tp_name, "PySwigObject") != 0) return 0; \
        PySwigObject* swig_obj_ptr = reinterpret_cast<PySwigObject*>(op); \
        if (std::strcmp(swig_obj_ptr->desc, "_p_" # T) != 0) return 0; \
        return swig_obj_ptr->ptr; \
    } \

And here is the corresponding test script:

 
http://cvs.sourceforge.net/viewcvs.py/cctbx/boost_adaptbx/tst_swig_args.py?view=markup

The test script slightly edited:

    import example # SWIG-1.3.24/Examples/python/class
    import boost_python_swig_args_ext

    c = example.Circle(10)
    c.x = 20
    c.y = 30

    s = example.Square(10)
    s.x = -10
    s.y = 5

    boost_python_swig_args_ext.show(c.this)
    boost_python_swig_args_ext.show(s.this)

The test runs successfully under Linux. It proves that the overloaded
show() function works correctly, which means the simple strcmp() logic
in the C++ fragment above works as it should. I also used valgrind and
did a leak check. If someone wants to reproduce:

    gunzip -c swig-1.3.24.tar.gz | tar xf -
    cd SWIG-1.3.24
    ./configure
    make
    cd Examples/python/class
    make
    cp _example.so example.py <somewhere on PYTHONPATH>
    ar r libswig_class_example.a example.o

Then compile and link boost_python_swig_args_ext with
-lswig_class_example.

David, would you want to include the core of swig_args_ext.cpp in,
e.g., boost/python/swig_arg.h? I think it would be a valuable
addition. There are many SWIG-wrapped libraries. People could easily
use them while writing their own extensions with Boost.Python.

Cheers,
        Ralf

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: swig_args_ext.cpp
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20050703/c65d2991/attachment.txt>


More information about the Cplusplus-sig mailing list