Memory diagnostics. Huge memory leak cleanup related to templates

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@4639 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2003-03-27 23:17:27 +00:00
commit 9f47936dd0
7 changed files with 167 additions and 50 deletions

View file

@ -949,7 +949,15 @@ SwigType_strip_qualifiers(SwigType *t) {
if (SwigType_isqualifier(e)) continue;
Append(r,e);
}
Setattr(memoize_stripped,Copy(t),Copy(r));
Delete(l);
{
String *key, *value;
key = Copy(t);
value = Copy(r);
Setattr(memoize_stripped,key,value);
Delete(key);
Delete(value);
}
return r;
}
@ -1587,6 +1595,7 @@ SwigType_typename_replace(SwigType *t, String *pat, String *rep) {
Delete(repbase);
}
{
String *tsuffix;
List *tparms = SwigType_parmlist(e);
int j;
String *nt = SwigType_templateprefix(e);
@ -1596,10 +1605,13 @@ SwigType_typename_replace(SwigType *t, String *pat, String *rep) {
Printf(nt,"%s",Getitem(tparms,j));
if (j < (Len(tparms)-1)) Printf(nt,",");
}
Printf(nt,")>%s", SwigType_templatesuffix(e));
tsuffix = SwigType_templatesuffix(e);
Printf(nt,")>%s", tsuffix);
Delete(tsuffix);
Clear(e);
Append(e,nt);
Delete(nt);
Delete(tparms);
}
} else if (Swig_scopename_check(e)) {
String *first, *rest;
@ -1623,6 +1635,7 @@ SwigType_typename_replace(SwigType *t, String *pat, String *rep) {
if (j < (Len(fparms)-1)) Printf(e,",");
}
Printf(e,").");
Delete(fparms);
}
Append(nt,e);
}

View file

@ -486,7 +486,6 @@ static SwigType *strip_arrays(SwigType *type) {
return t;
}
/* -----------------------------------------------------------------------------
* Swig_typemap_search()
*
@ -532,7 +531,9 @@ Swig_typemap_search(const String_or_char *op, SwigType *type, String_or_char *na
if (isarray) {
/* If working with arrays, strip away all of the dimensions and replace with "ANY".
See if that generates a match */
if (!noarrays) noarrays = strip_arrays(ctype);
if (!noarrays) {
noarrays = strip_arrays(ctype);
}
tma = Getattr(typemaps[ts],noarrays);
if (tma && cname) {
tm1 = Getattr(tma,cname);
@ -565,9 +566,7 @@ Swig_typemap_search(const String_or_char *op, SwigType *type, String_or_char *na
{
String *octype;
if (unstripped) {
if (unstripped != type) {
Delete(ctype);
}
Delete(ctype);
ctype = unstripped;
unstripped = 0;
}
@ -576,36 +575,11 @@ Swig_typemap_search(const String_or_char *op, SwigType *type, String_or_char *na
if (octype != type) Delete(octype);
}
}
#ifdef NEW
/* No match seems to be found at all. Try a SWIGTYPE substitution */
if (!primitive) {
SwigType *base = SwigType_base(type);
primitive = SwigType_prefix(type);
if (Strstr(base,"enum ")) {
Append(primitive,"enum SWIGTYPE");
} else {
Append(primitive,"SWIGTYPE");
}
tm = Getattr(typemaps[ts],primitive);
if (tm && cname) {
tm1 = Getattr(tm, cname);
if (tm1) {
result = Getattr(tm1,tmop);
if (result) goto ret_result;
}
}
if (tm) {
result = Getattr(tm,tmop);
if (result) goto ret_result;
}
Delete(primitive);
primitive = 0;
}
#endif
/* Hmmm. Well, no match seems to be found at all. See if there is some kind of default mapping */
if (!primitive)
if (!primitive) {
primitive = SwigType_default(type);
}
tm = Getattr(typemaps[ts],primitive);
if (tm && cname) {
tm1 = Getattr(tm,cname);
@ -618,7 +592,7 @@ Swig_typemap_search(const String_or_char *op, SwigType *type, String_or_char *na
result = Getattr(tm,tmop);
if (result) goto ret_result;
}
if (ctype != type) Delete(ctype);
if (ctype != type) { Delete(ctype); ctype = 0; }
ts--; /* Hmmm. Nothing found in this scope. Guess we'll go try another scope */
}
result = backup;
@ -634,6 +608,7 @@ Swig_typemap_search(const String_or_char *op, SwigType *type, String_or_char *na
return result;
}
/* -----------------------------------------------------------------------------
* Swig_typemap_search_multi()
*

View file

@ -176,6 +176,7 @@ int SwigType_typedef_class(String_or_char *name) {
cname = NewString(name);
Setmeta(cname,"class","1");
Setattr(current_typetab,cname,cname);
Delete(cname);
flush_cache();
return 0;
}
@ -506,23 +507,30 @@ SwigType *SwigType_typedef_resolve(SwigType *t) {
String *namebase = 0;
String *nameprefix = 0;
int newtype = 0;
static String *noscope = 0;
/*
if (!noscope) {
noscope = NewString("");
}
*/
resolved_scope = 0;
/*
if (!typedef_resolve_cache) {
typedef_resolve_cache = NewHash();
}
/*
r = Getattr(typedef_resolve_cache,t);
if (r) {
if (r != DohNone) {
if (r != noscope) {
resolved_scope = Getmeta(r,"scope");
return Copy(r);
} else {
return 0;
}
}
*/
*/
base = SwigType_base(t);
@ -551,6 +559,7 @@ SwigType *SwigType_typedef_resolve(SwigType *t) {
if (nameprefix) {
/* Name had a prefix on it. See if we can locate the proper scope for it */
s = SwigType_find_scope(s,nameprefix);
/* Couldn't locate a scope for the type. */
if (!s) {
Delete(base);
@ -586,7 +595,10 @@ SwigType *SwigType_typedef_resolve(SwigType *t) {
}
if (type && (Strcmp(base,type) == 0)) {
if (newtype) Delete(type);
Delete(base);
Delete(namebase);
Delete(nameprefix);
r = 0;
goto return_result;
}
@ -600,6 +612,7 @@ SwigType *SwigType_typedef_resolve(SwigType *t) {
int i,sz;
int rep = 0;
type = SwigType_templateprefix(base);
newtype = 1;
suffix = SwigType_templatesuffix(base);
Append(type,"<(");
tparms = SwigType_parmlist(base);
@ -614,6 +627,7 @@ SwigType *SwigType_typedef_resolve(SwigType *t) {
}
if (tpr) {
Append(type,tpr);
Delete(tpr);
rep = 1;
} else {
Append(type,tp);
@ -631,12 +645,15 @@ SwigType *SwigType_typedef_resolve(SwigType *t) {
}
if (namebase) Delete(namebase);
if (nameprefix) Delete(nameprefix);
namebase = 0;
nameprefix = 0;
} else {
if (SwigType_isfunction(base)) {
List *parms;
int i,sz;
int rep = 0;
type = NewString("f(");
newtype = 1;
parms = SwigType_parmlist(base);
sz = Len(parms);
for (i = 0; i < sz; i++) {
@ -649,6 +666,7 @@ SwigType *SwigType_typedef_resolve(SwigType *t) {
}
if (tpr) {
Append(type,tpr);
Delete(tpr);
rep = 1;
} else {
Append(type,tp);
@ -667,6 +685,7 @@ SwigType *SwigType_typedef_resolve(SwigType *t) {
rt = SwigType_typedef_resolve(mtype);
if (rt) {
type = NewStringf("m(%s).", rt);
newtype = 1;
Delete(rt);
}
Delete(mtype);
@ -700,17 +719,25 @@ SwigType *SwigType_typedef_resolve(SwigType *t) {
}
return_result:
if (!r) {
Setattr(typedef_resolve_cache,NewString(t),DohNone);
} else {
Setattr(typedef_resolve_cache,NewString(t),r);
Setmeta(r,"scope",resolved_scope);
r = Copy(r);
/*
{
String *key = NewString(t);
if (!r) {
Setattr(typedef_resolve_cache,key,noscope);
} else {
SwigType *r1;
Setattr(typedef_resolve_cache,key,r);
Setmeta(r,"scope",resolved_scope);
r1 = Copy(r);
Delete(r);
r = r1;
}
Delete(key);
}
*/
return r;
}
/* -----------------------------------------------------------------------------
* SwigType_typedef_resolve_all()
*
@ -734,8 +761,12 @@ SwigType *SwigType_typedef_resolve_all(SwigType *t) {
r = n;
}
{
String *key;
SwigType *rr = Copy(r);
Setattr(typedef_all_cache,NewString(t),rr);
key = NewString(t);
Setattr(typedef_all_cache,key,rr);
Delete(key);
Delete(rr);
}
return r;
}
@ -841,6 +872,7 @@ SwigType *SwigType_typedef_qualified(SwigType *t)
value = qn;
continue;
} else {
Delete(qn);
break;
}
} else if ((Strcmp(nodeType(n),"cdecl") == 0) && (Getattr(n,"value"))) {
@ -852,6 +884,7 @@ SwigType *SwigType_typedef_qualified(SwigType *t)
break;
}
Append(qprefix,value);
Delete(value);
} else {
Append(qprefix,p);
}
@ -871,6 +904,7 @@ SwigType *SwigType_typedef_qualified(SwigType *t)
Append(e,qprefix);
Delete(tprefix);
Delete(qprefix);
Delete(parms);
}
if (Strncmp(e,"::",2) == 0) {
Delitem(e,0);
@ -883,7 +917,9 @@ SwigType *SwigType_typedef_qualified(SwigType *t)
String *p;
p = Firstitem(parms);
while (p) {
Append(s,SwigType_typedef_qualified(p));
String *pq = SwigType_typedef_qualified(p);
Append(s,pq);
Delete(pq);
p = Nextitem(parms);
if (p) {
Append(s,",");
@ -892,6 +928,7 @@ SwigType *SwigType_typedef_qualified(SwigType *t)
Append(s,").");
Append(result,s);
Delete(s);
Delete(parms);
} else if (SwigType_isarray(e)) {
String *ndim;
String *dim = SwigType_parm(e);
@ -904,7 +941,14 @@ SwigType *SwigType_typedef_qualified(SwigType *t)
}
}
Delete(elements);
Setattr(typedef_qualified_cache,NewString(t),NewString(result));
{
String *key, *cresult;
key = NewString(t);
cresult = NewString(result);
Setattr(typedef_qualified_cache,key,cresult);
Delete(key);
Delete(cresult);
}
return result;
}
@ -1157,6 +1201,7 @@ void SwigType_remember_clientdata(SwigType *t, const String_or_char *clientdata)
Hash *h;
SwigType *fr;
SwigType *qr;
String *tkey;
if (!r_mangled) {
r_mangled = NewHash();
@ -1172,7 +1217,9 @@ void SwigType_remember_clientdata(SwigType *t, const String_or_char *clientdata)
if (last && (Cmp(last,clientdata) == 0)) return;
}
Setattr(r_remembered, Copy(t), clientdata ? NewString(clientdata) : (void *) "");
tkey = Copy(t);
Setattr(r_remembered, tkey, clientdata ? NewString(clientdata) : (void *) "");
Delete(tkey);
mt = SwigType_manglestr(t); /* Create mangled string */