fix memory PyObject * typemaps to avoid memory leaks with iterators

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@8375 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2006-01-11 23:05:12 +00:00
commit 0969072b63
4 changed files with 30 additions and 4 deletions

View file

@ -1,7 +1,13 @@
import sys
from langobj import *
x ="hello"
if identity(x) != x:
rx = sys.getrefcount(x)
v = identity(x)
rv = sys.getrefcount(v)
if v != x:
raise RuntimeError
if rv - rx != 1:
raise RuntimeError

View file

@ -42,6 +42,18 @@ namespace swig {
struct PyObject_ptr {};
%apply PyObject * {PyObject_ptr};
%apply PyObject * const& {PyObject_ptr const&};
/* For output */
%typemap(out,noblock=1) PyObject_ptr {
$result = (PyObject *)$1;
Py_INCREF($result);
}
%typemap(out,noblock=1) PyObject_ptr const & {
$result = (PyObject *)*$1;
Py_INCREF($result);
}
}
%{

View file

@ -26,6 +26,9 @@ namespace swig
Mark methods that return new objects
*/
%newobject PySwigIterator::copy;
%newobject PySwigIterator::value;
%newobject PySwigIterator::next;
%newobject PySwigIterator::previous;
%newobject PySwigIterator::operator + (ptrdiff_t n) const;
%newobject PySwigIterator::operator - (ptrdiff_t n) const;
}

View file

@ -85,13 +85,18 @@
/* For output, we increase the reference object */
%typemap(out,noblock=1) PyObject * {
Py_XINCREF($1);
/* hello */
$result = $1;
%#if !($owner)
Py_XINCREF($result);
%#endif
}
%typemap(out,noblock=1) PyObject * const & {
Py_XINCREF(*$1);
$result = *$1;
%#if !($owner)
Py_XINCREF($result);
%#endif
}
/* Consttab, needed for callbacks, it should be removed later */