fix various missing INCREF/DECREF and other to run clean with fpectl

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@7989 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2005-12-15 23:29:10 +00:00
commit 24f109f8ca
3 changed files with 8 additions and 10 deletions

View file

@ -161,7 +161,7 @@ typedef struct {
PyObject *newraw; PyObject *newraw;
PyObject *newargs; PyObject *newargs;
PyObject *destroy; PyObject *destroy;
PyObject *delargs; int delargs;
} PySwigClientData; } PySwigClientData;
SWIGRUNTIME PySwigClientData * SWIGRUNTIME PySwigClientData *
@ -184,6 +184,7 @@ PySwigClientData_New(PyObject* obj)
Py_INCREF(data->newraw); Py_INCREF(data->newraw);
data->newargs = PyTuple_New(1); data->newargs = PyTuple_New(1);
PyTuple_SetItem(data->newargs, 0, obj); PyTuple_SetItem(data->newargs, 0, obj);
Py_INCREF(data->newargs);
} }
/* the destroy method, aka as the C++ delete method */ /* the destroy method, aka as the C++ delete method */
data->destroy = PyObject_GetAttrString(data->klass, "__swig_destroy__"); data->destroy = PyObject_GetAttrString(data->klass, "__swig_destroy__");
@ -194,7 +195,7 @@ PySwigClientData_New(PyObject* obj)
if (data->destroy) { if (data->destroy) {
Py_INCREF(data->destroy); Py_INCREF(data->destroy);
int flags = PyCFunction_GET_FLAGS(data->destroy); int flags = PyCFunction_GET_FLAGS(data->destroy);
data->delargs = (flags & (METH_VARARGS)) ? PyTuple_New(1) : 0; data->delargs = (flags & (METH_VARARGS));
} else { } else {
data->delargs = 0; data->delargs = 0;
} }
@ -209,7 +210,6 @@ PySwigClientData_Del(PySwigClientData* data)
Py_XDECREF(data->newraw); Py_XDECREF(data->newraw);
Py_XDECREF(data->newargs); Py_XDECREF(data->newargs);
Py_XDECREF(data->destroy); Py_XDECREF(data->destroy);
Py_XDECREF(data->delargs);
free(data); free(data);
} }
@ -334,13 +334,13 @@ PySwigObject_dealloc(PyObject *v)
PyObject *res; PyObject *res;
PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
PyObject *mself = PyCFunction_GET_SELF(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy);
PyObject *args = data->delargs; if (data->delargs) {
if (args) {
/* we need to create a temporal object to carry the destroy operation */ /* we need to create a temporal object to carry the destroy operation */
PyObject *tmp = PySwigObject_New(sobj->ptr, ty, 0); PyObject *tmp = PySwigObject_New(sobj->ptr, ty, 0);
PyObject *args = PyTuple_New(1);
PyTuple_SetItem(args,0,tmp); PyTuple_SetItem(args,0,tmp);
res = ((*meth)(mself, args)); res = ((*meth)(mself, args));
PyTuple_SetItem(args,0,SWIG_Py_Void()); Py_DECREF(args);
} else { } else {
res = ((*meth)(mself, v)); res = ((*meth)(mself, v));
} }

View file

@ -138,10 +138,10 @@
%define %ptr_typecheck_typemap(check,asptr_meth,frag,Type...) %define %ptr_typecheck_typemap(check,asptr_meth,frag,Type...)
%typemap(typecheck,precedence=check,fragment=frag) %typemap(typecheck,precedence=check,fragment=frag)
Type * Type *
"$1 = asptr_meth($input, (Type**)(0));"; "$1 = asptr_meth($input, (Type**)(0)) != 0;";
%typemap(typecheck,precedence=check,fragment=frag) %typemap(typecheck,precedence=check,fragment=frag)
Type, const Type& Type, const Type&
"Type *ptr; $1 = asptr_meth($input, &ptr) && ptr;"; "$1 = asptr_meth($input, (Type**)(0)) != 0;";
%enddef %enddef

View file

@ -2216,7 +2216,6 @@ public:
} }
Printf(f_directors_h,"\n\n"); Printf(f_directors_h,"\n\n");
Printf(f_directors_h,"public:\n");
Printf(f_directors_h,"#if defined(SWIG_DIRECTOR_VTABLE)\n"); Printf(f_directors_h,"#if defined(SWIG_DIRECTOR_VTABLE)\n");
Printf(f_directors_h,"/* VTable implementation */\n"); Printf(f_directors_h,"/* VTable implementation */\n");
Printf(f_directors_h," PyObject *swig_get_method(size_t method_index, const char *method_name) const {\n"); Printf(f_directors_h," PyObject *swig_get_method(size_t method_index, const char *method_name) const {\n");
@ -2229,7 +2228,6 @@ public:
Printf(f_directors_h," msg += method_name;\n"); Printf(f_directors_h," msg += method_name;\n");
Printf(f_directors_h," Swig::DirectorMethodException::raise(msg.c_str());\n"); Printf(f_directors_h," Swig::DirectorMethodException::raise(msg.c_str());\n");
Printf(f_directors_h," }\n"); Printf(f_directors_h," }\n");
Printf(f_directors_h," Py_DECREF(swig_get_self());\n");
Printf(f_directors_h," vtable[method_index] = method;\n"); Printf(f_directors_h," vtable[method_index] = method;\n");
Printf(f_directors_h," };\n"); Printf(f_directors_h," };\n");
Printf(f_directors_h," return method;\n"); Printf(f_directors_h," return method;\n");