diff --git a/Examples/test-suite/python/refcount_runme.py b/Examples/test-suite/python/refcount_runme.py index d7c708774..b429404e7 100644 --- a/Examples/test-suite/python/refcount_runme.py +++ b/Examples/test-suite/python/refcount_runme.py @@ -13,3 +13,20 @@ if a.ref_count() != 3: print "This program will crash... now" +rca = b2.get_rca() +b3 = B.create(rca) + +if a.ref_count() != 5: + print "This program will crash... now" + + +v = vector_A(2) +v[0] = a +v[1] = a + +x = v[0] +del v + + + + diff --git a/Examples/test-suite/refcount.i b/Examples/test-suite/refcount.i index 33c27c20b..5dfd951d3 100644 --- a/Examples/test-suite/refcount.i +++ b/Examples/test-suite/refcount.i @@ -1,6 +1,6 @@ %module refcount -%warnfilter(362); +%warnfilter(SWIGWARN_IGNORE_OPERATOR_EQ,SWIGWARN_LANG_IDENTIFIER); %{ #include @@ -20,6 +20,8 @@ %newobject B::create(A* a); %newobject B::cloner(); + + %inline %{ struct A : RCObj @@ -50,6 +52,15 @@ struct A3 : A1, private A2 { }; + +%} + +#ifdef SWIGPYTHON +%extend_smart_pointer(RCPtr); +%template(RCPtr_A) RCPtr; +#endif + +%inline %{ struct B : RCObj { @@ -75,8 +86,19 @@ // std::cout << "deleting b" << std::endl; } + RCPtr get_rca() { + return _a; + } + private: RCPtr _a; }; %} + +#ifdef SWIGPYTHON + +%include +%template(vector_A) std::vector >; + +#endif diff --git a/Lib/python/pytypemaps.swg b/Lib/python/pytypemaps.swg index 58dc067ab..79db179d9 100644 --- a/Lib/python/pytypemaps.swg +++ b/Lib/python/pytypemaps.swg @@ -91,6 +91,26 @@ %typemap(constcode) SWIGTYPE ((*)(ANY)) ""; +/* Smart Pointers */ +%typemap(out,noblock=1) const SWIGTYPE & SMARTPOINTER { + $result = SWIG_NewPointerObj(%new_copy(*$1, $*ltype), $descriptor, SWIG_POINTER_OWN | %newpointer_flags); +} +%typemap(ret,noblock=1) const SWIGTYPE & SMARTPOINTER, SWIGTYPE SMARTPOINTER { + if ($result) { + PyObject *robj = PyObject_CallMethod($result, "__deref__", NULL); + if (robj && !PyErr_Occurred()) { + PySwigObject_append((PyObject *) SWIG_Python_GetSwigThis($result), + (PyObject *) SWIG_Python_GetSwigThis(robj)); + Py_DECREF(robj); + } + } +} +/* Use this macro to extend the smart pointer support */ +%define %extend_smart_pointer(Type...) +%implicitconv Type; +%apply const SWIGTYPE& SMARTPOINTER { const Type& }; +%apply SWIGTYPE SMARTPOINTER { Type }; +%enddef