Python: Keep reference to owning container during element access

This commit is contained in:
Jake Cobb 2018-04-18 17:28:31 -04:00
commit 65dd1c49bc

View file

@ -36,6 +36,13 @@
%include <std_except.i>
%fragment("container_owner_attribute", "header") {
PyObject* container_owner_attribute() {
static PyObject* name = SWIG_Python_str_FromChar("__owner");
return name;
}
}
%fragment(SWIG_Traits_frag(swig::SwigPtr_PyObject),"header",fragment="StdTraits") {
namespace swig {
template <> struct traits<SwigPtr_PyObject > {
@ -766,6 +773,17 @@ namespace swig
size_type __len__() const {
return self->size();
}
%typemap(ret, fragment="container_owner_attribute") value_type& {
PyObject* swigThis = PyObject_GetAttrString($result, "this");
PyErr_Clear();
if (swigThis && SwigPyObject_Check(swigThis) &&
(reinterpret_cast<SwigPyObject*>(swigThis)->own & SWIG_POINTER_OWN) != SWIG_POINTER_OWN) {
// try to store reference to parent
PyObject_GenericSetAttr($result, container_owner_attribute(), $self);
}
Py_XDECREF(swigThis);
}
}
%enddef