Fix memory leaks in the generated wrapper code.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@5098 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Matthias Köppe 2003-09-10 11:22:12 +00:00
commit b416754856

View file

@ -97,19 +97,19 @@
/* Do not check for NULL pointers (override checks). */ /* Do not check for NULL pointers (override checks). */
%typemap(check) C_TYPE *VECTORINPUT, %typemap(check) (int VECTORLENINPUT, C_TYPE *VECTORINPUT),
const C_TYPE *VECTORINPUT, (size_t VECTORLENINPUT, C_TYPE *VECTORINPUT),
C_TYPE *LISTINPUT, (int LISTLENINPUT, C_TYPE *LISTINPUT),
const C_TYPE *LISTINPUT (size_t LISTLENINPUT, C_TYPE *LISTINPUT)
"/* no check for NULL pointer */"; "/* no check for NULL pointer */";
/* Discard the temporary array after the call. */ /* Discard the temporary array after the call. */
%typemap(freearg) C_TYPE *VECTORINPUT, %typemap(freearg) (int VECTORLENINPUT, C_TYPE *VECTORINPUT),
const C_TYPE *VECTORINPUT, (size_t VECTORLENINPUT, C_TYPE *VECTORINPUT),
C_TYPE *LISTINPUT, (int LISTLENINPUT, C_TYPE *LISTINPUT),
const C_TYPE *LISTINPUT (size_t LISTLENINPUT, C_TYPE *LISTINPUT)
{if ($1!=NULL) SWIG_free($1);} {if ($2!=NULL) SWIG_free($2);}
%enddef %enddef
@ -218,6 +218,45 @@ TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(double, gh_scm2double, gh_double2scm, real);
TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(char *, SWIG_scm2str, gh_str02scm, string); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(char *, SWIG_scm2str, gh_str02scm, string);
TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(const char *, SWIG_scm2str, gh_str02scm, string); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(const char *, SWIG_scm2str, gh_str02scm, string);
/* For the char *, free all strings after converting */
%typemap(freearg)
(int *VECTORLENOUTPUT, char ***VECTOROUTPUT),
(size_t *VECTORLENOUTPUT, char ***VECTOROUTPUT),
(int *LISTLENOUTPUT, char ***LISTOUTPUT),
(size_t *LISTLENOUTPUT, char ***LISTOUTPUT),
(int *VECTORLENOUTPUT, const char ***VECTOROUTPUT),
(size_t *VECTORLENOUTPUT, const char ***VECTOROUTPUT),
(int *LISTLENOUTPUT, const char ***LISTOUTPUT),
(size_t *LISTLENOUTPUT, const char ***LISTOUTPUT)
{
if ((*$2)!=NULL) {
int i;
for (i = 0; i < *$1; i++) {
if ((*$2)[i] != NULL) free((*$2)[i]);
}
free(*$2);
}
}
%typemap(freearg) (int VECTORLENINPUT, char **VECTORINPUT),
(size_t VECTORLENINPUT, char **VECTORINPUT),
(int LISTLENINPUT, char **LISTINPUT),
(size_t LISTLENINPUT, char **LISTINPUT),
(int VECTORLENINPUT, const char **VECTORINPUT),
(size_t VECTORLENINPUT, const char **VECTORINPUT),
(int LISTLENINPUT, const char **LISTINPUT),
(size_t LISTLENINPUT, const char **LISTINPUT)
{
if (($2)!=NULL) {
int i;
for (i = 0; i< $1; i++)
if (($2)[i] != NULL) free(($2)[i]);
free($2);
}
}
/* Following is a macro that emits typemaps that are much more /* Following is a macro that emits typemaps that are much more
flexible. (They are also messier.) It supports multiple parallel flexible. (They are also messier.) It supports multiple parallel
lists and vectors (sharing one length argument each). lists and vectors (sharing one length argument each).
@ -428,3 +467,24 @@ TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(double, gh_scm2double, gh_double2scm,
TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(char *, SWIG_scm2str, gh_str02scm, string); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(char *, SWIG_scm2str, gh_str02scm, string);
TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(const char *, SWIG_scm2str, gh_str02scm, string); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(const char *, SWIG_scm2str, gh_str02scm, string);
%typemap(freearg) char **PARALLEL_LISTINPUT, char **PARALLEL_VECTORINPUT,
const char **PARALLEL_LISTINPUT, const char **PARALLEL_VECTORINPUT
{
if (($1)!=NULL) {
int i;
for (i = 0; i<*_global_list_length; i++)
if (($1)[i] != NULL) SWIG_free(($1)[i]);
SWIG_free($1);
}
}
%typemap(freearg) char ***PARALLEL_LISTOUTPUT, char ***PARALLEL_VECTOROUTPUT,
const char ***PARALLEL_LISTOUTPUT, const char ***PARALLEL_VECTOROUTPUT
{
if ((*$1)!=NULL) {
int i;
for (i = 0; i<_global_arraylentemp; i++)
if ((*$1)[i] != NULL) free((*$1)[i]);
free(*$1);
}
}