From b66f1e672b268253c5e04dac8b062ff36bcc6f56 Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Wed, 30 Nov 2005 21:32:27 +0000 Subject: [PATCH] fix many/many memory leaks git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@7904 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- SWIG/Source/CParse/parser.y | 291 ++++++++++++++++++------ SWIG/Source/CParse/templ.c | 6 +- SWIG/Source/DOH/base.c | 7 +- SWIG/Source/Modules/allocate.cxx | 2 + SWIG/Source/Modules/emit.cxx | 1 + SWIG/Source/Modules/lang.cxx | 52 +++-- SWIG/Source/Modules/main.cxx | 32 ++- SWIG/Source/Modules/overload.cxx | 1 + SWIG/Source/Modules/python.cxx | 31 +-- SWIG/Source/Modules/ruby.cxx | 12 +- SWIG/Source/Modules/swigmain.cxx | 4 +- SWIG/Source/Modules/typepass.cxx | 9 +- SWIG/Source/Preprocessor/cpp.c | 85 +++++-- SWIG/Source/Preprocessor/expr.c | 7 + SWIG/Source/Preprocessor/preprocessor.h | 2 + SWIG/Source/Swig/cwrap.c | 280 ++++++++++++++++------- SWIG/Source/Swig/include.c | 14 +- SWIG/Source/Swig/naming.c | 9 +- SWIG/Source/Swig/stype.c | 9 +- SWIG/Source/Swig/swig.h | 2 +- SWIG/Source/Swig/symbol.c | 8 +- SWIG/Source/Swig/typemap.c | 12 +- SWIG/Source/Swig/typesys.c | 2 +- 23 files changed, 627 insertions(+), 251 deletions(-) diff --git a/SWIG/Source/CParse/parser.y b/SWIG/Source/CParse/parser.y index efb1709a7..7a2705976 100644 --- a/SWIG/Source/CParse/parser.y +++ b/SWIG/Source/CParse/parser.y @@ -116,7 +116,7 @@ static Node *copy_node(Node *n) { Setattr(nn,"sym:needs_symtab", "1"); } /* We don't copy any other symbol table attributes */ - if (Strncmp(key,"sym:",4) == 0) { + if (strncmp(ckey,"sym:",4) == 0) { continue; } /* If children. We copy them recursively using this function */ @@ -124,7 +124,9 @@ static Node *copy_node(Node *n) { /* Copy children */ Node *cn = k.item; while (cn) { - appendChild(nn,copy_node(cn)); + Node *copy = copy_node(cn); + appendChild(nn,copy); + Delete(copy); cn = nextSibling(cn); } continue; @@ -313,7 +315,7 @@ static String *make_name(String *name,SwigType *decl) { destructor = 1; } if (yyrename) { - String *s = yyrename; + String *s = (yyrename); yyrename = 0; if (destructor) { Insert(s,0,"~"); @@ -325,12 +327,12 @@ static String *make_name(String *name,SwigType *decl) { /* Check to see if the name is in the hash */ if (!rename_hash) { if (add_oldname) return Copy(add_oldname); - return origname; + return Copy(origname); } rn = Swig_name_object_get(rename_hash, Namespaceprefix, name, decl); if (!rn) { if (add_oldname) return Copy(add_oldname); - return name; + return Copy(name); } if (destructor) { if (Strcmp(rn,"$ignore") != 0) { @@ -384,7 +386,7 @@ static void add_symbols(Node *n) { cparse_normalize_void(n); } while (n) { - String *symname; + String *symname = 0; /* for friends, we need to pop the scope once */ String *old_prefix = 0; Symtab *old_scope = 0; @@ -424,7 +426,7 @@ static void add_symbols(Node *n) { */ String *prefix = name ? Swig_scopename_prefix(name) : 0; if (prefix) { - if (Classprefix && (Strcmp(prefix,Classprefix) == 0)) { + if (Classprefix && (StringEqual(prefix,Classprefix))) { String *base = Swig_scopename_last(name); Setattr(n,"name",base); Delete(base); @@ -462,14 +464,15 @@ static void add_symbols(Node *n) { if (!SwigType_isfunction(decl)) { String *makename = Getattr(n,"parser:makename"); if (makename) { + symname = make_name(makename,0); Delattr(n,"parser:makename"); /* temporary information, don't leave it hanging around */ } else { makename = Getattr(n,"name"); + symname = make_name(makename,0); } - symname = make_name(makename,0); if (!symname) { - symname = Getattr(n,"unnamed"); + symname = Copy(Getattr(n,"unnamed")); } if (symname) { wrn = name_warning(n,symname,0); @@ -558,8 +561,13 @@ static void add_symbols(Node *n) { /* restore the class scope if needed */ if (isfriend) { Swig_symbol_setscope(old_scope); - Namespaceprefix = old_prefix; + if (old_prefix) { + Delete(Namespaceprefix); + Namespaceprefix = old_prefix; + } } + Delete(symname); + if (add_only_one) return; n = nextSibling(n); } @@ -571,10 +579,10 @@ static void add_symbols(Node *n) { static void add_symbols_copy(Node *n) { String *name; int emode = 0; - while (n) { + char *cnodeType = Char(nodeType(n)); - if (Strcmp(nodeType(n),"access") == 0) { + if (strcmp(cnodeType,"access") == 0) { String *kind = Getattr(n,"kind"); if (Strcmp(kind,"public") == 0) { cplus_mode = CPLUS_PUBLIC; @@ -593,7 +601,8 @@ static void add_symbols_copy(Node *n) { DohIncref(add_oldname); /* If already renamed, we used that name */ if (Strcmp(add_oldname, Getattr(n,"name")) != 0) { - yyrename = add_oldname; + Delete(yyrename); + yyrename = Copy(add_oldname); } } Delattr(n,"sym:needs_symtab"); @@ -610,9 +619,10 @@ static void add_symbols_copy(Node *n) { if (Getattr(n,"requires_symtab")) { Swig_symbol_newscope(); Swig_symbol_setscopename(name); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } - if (Strcmp(nodeType(n),"class") == 0) { + if (strcmp(cnodeType,"class") == 0) { inclass = 1; if (Strcmp(Getattr(n,"kind"),"class") == 0) { cplus_mode = CPLUS_PRIVATE; @@ -620,33 +630,34 @@ static void add_symbols_copy(Node *n) { cplus_mode = CPLUS_PUBLIC; } } - if (Strcmp(nodeType(n),"extend") == 0) { + if (strcmp(cnodeType,"extend") == 0) { emode = cplus_mode; cplus_mode = CPLUS_PUBLIC; } add_symbols_copy(firstChild(n)); - if (Strcmp(nodeType(n),"extend") == 0) { + if (strcmp(cnodeType,"extend") == 0) { cplus_mode = emode; } if (Getattr(n,"requires_symtab")) { Setattr(n,"symtab", Swig_symbol_popscope()); Delattr(n,"requires_symtab"); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } if (add_oldname) { Delete(add_oldname); } - if (Strcmp(nodeType(n),"class") == 0) { + if (strcmp(cnodeType,"class") == 0) { inclass = 0; } add_oldname = 0; } else { - if (Strcmp(nodeType(n),"extend") == 0) { + if (strcmp(cnodeType,"extend") == 0) { emode = cplus_mode; cplus_mode = CPLUS_PUBLIC; } add_symbols_copy(firstChild(n)); - if (Strcmp(nodeType(n),"extend") == 0) { + if (strcmp(cnodeType,"extend") == 0) { cplus_mode = emode; } } @@ -775,6 +786,7 @@ static void merge_extensions(Node *cls, Node *am) { qargs = Swig_symbol_type_qualify(args,0); Append(prefix,qargs); Delete(nname); + Delete(qargs); nname = prefix; } return nname; @@ -810,6 +822,7 @@ static void merge_extensions(Node *cls, Node *am) { Append(bases,s); if (q) { base = NewStringf("%s::%s", q, Getattr(s,"name")); + Delete(q); } else { base = NewString(Getattr(s,"name")); } @@ -903,6 +916,7 @@ static String *resolve_node_scope(String *cname) { String *base = Swig_scopename_last(name); String *tprefix = Swig_scopename_prefix(name); Insert(scopes,0,base); + Delete(base); Delete(name); name = tprefix; } @@ -930,6 +944,7 @@ static String *resolve_node_scope(String *cname) { /* set the scope to the inner class */ Swig_symbol_setscope(Getattr(nscope_inner,"symtab")); /* save the last namespace prefix */ + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); /* and return the node name, including the inner class prefix */ break; @@ -940,6 +955,7 @@ static String *resolve_node_scope(String *cname) { Setattr(ns2,"symtab", Getattr(ns1,"symtab")); add_symbols(ns2); Swig_symbol_setscope(Getattr(ns1,"symtab")); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (nscope_inner) { if (Getattr(nscope_inner,"symtab") != Getattr(ns2,"symtab")) { @@ -1250,7 +1266,9 @@ static void default_arguments(Node *n) { /* Create new function and add to symbol table */ { - Node *new_function = new_node(Copy(nodeType(function))); + SwigType *ntype = Copy(nodeType(function)); + char *cntype = Char(ntype); + Node *new_function = new_node(ntype); SwigType *decl = Copy(Getattr(function,"decl")); int constqualifier = SwigType_isconst(decl); String *ccode = Copy(Getattr(function,"code")); @@ -1270,6 +1288,7 @@ static void default_arguments(Node *n) { Setattr(new_function,"storage", cstorage); Setattr(new_function,"type", ctype); Setattr(new_function,"throw", cthrow); + Delete(ccode); Delete(cstorage); Delete(ctype); @@ -1284,14 +1303,26 @@ static void default_arguments(Node *n) { } /* copy specific attributes for global (or in a namespace) template functions - these are not templated class methods */ - if (Strcmp(nodeType(function),"template") == 0) { + if (strcmp(cntype,"template") == 0) { Node *templatetype = Getattr(function,"templatetype"); Node *symtypename = Getattr(function,"sym:typename"); Parm *templateparms = Getattr(function,"templateparms"); - if (templatetype) Setattr(new_function,"templatetype",Copy(templatetype)); - if (symtypename) Setattr(new_function,"sym:typename",Copy(symtypename)); - if (templateparms) Setattr(new_function,"templateparms",CopyParmList(templateparms)); - } else if (Strcmp(nodeType(function),"constructor") == 0) { + if (templatetype) { + Node *tmp = Copy(templatetype); + Setattr(new_function,"templatetype",tmp); + Delete(tmp); + } + if (symtypename) { + Node *tmp = Copy(symtypename); + Setattr(new_function,"sym:typename",tmp); + Delete(tmp); + } + if (templateparms) { + Parm *tmp = CopyParmList(templateparms); + Setattr(new_function,"templateparms",tmp); + Delete(tmp); + } + } else if (strcmp(cntype,"constructor") == 0) { /* only copied for constructors as this is not a user defined feature - it is hard coded in the parser */ if (GetFlag(function,"feature:new")) SetFlag(new_function,"feature:new"); } @@ -1304,6 +1335,8 @@ static void default_arguments(Node *n) { set_nextSibling(function, new_function); function = new_function; + + Delete(ntype); } } else { function = 0; @@ -1659,14 +1692,16 @@ clear_directive : CLEAR tm_list SEMI { constant_directive : CONSTANT ID EQUAL definetype SEMI { if (($4.type != T_ERROR) && ($4.type != T_SYMBOL)) { + SwigType *type = NewSwigType($4.type); $$ = new_node("constant"); Setattr($$,"name",$2); - Setattr($$,"type",NewSwigType($4.type)); + Setattr($$,"type",type); Setattr($$,"value",$4.val); if ($4.rawval) Setattr($$,"rawval", $4.rawval); Setattr($$,"storage","%constant"); SetFlag($$,"feature:immutable"); add_symbols($$); + Delete(type); } else { if ($4.type == T_ERROR) { Swig_warning(WARN_PARSE_UNSUPPORTED_VALUE,cparse_file,cparse_line,"Unsupported constant value (ignored)\n"); @@ -1792,6 +1827,7 @@ fragment_directive: FRAGMENT LPAREN fname COMMA kwargs RPAREN HBLOCK { } | FRAGMENT LPAREN fname COMMA kwargs RPAREN LBRACE { Hash *p = $5; + String *code; skip_balanced('{','}'); $$ = new_node("fragment"); Setattr($$,"value",Getattr($3,"value")); @@ -1800,7 +1836,9 @@ fragment_directive: FRAGMENT LPAREN fname COMMA kwargs RPAREN HBLOCK { Setattr($$,"kwargs",nextSibling(p)); Delitem(scanner_ccode,0); Delitem(scanner_ccode,DOH_END); - Setattr($$,"code",Copy(scanner_ccode)); + code = Copy(scanner_ccode); + Setattr($$,"code",code); + Delete(code); } | FRAGMENT LPAREN fname RPAREN SEMI { $$ = new_node("fragment"); @@ -1902,10 +1940,13 @@ inline_directive : INLINE HBLOCK { $$ = 0; } else { + String *code; $$ = new_node("insert"); Delitem(scanner_ccode,0); Delitem(scanner_ccode,DOH_END); - Setattr($$,"code", Copy(scanner_ccode)); + code = Copy(scanner_ccode); + Setattr($$,"code", code); + Delete(code); cpps=Copy(scanner_ccode); start_inline(Char(cpps), cparse_start_line); Delete(cpps); @@ -1941,12 +1982,15 @@ insert_directive : HBLOCK { Setattr($$,"code",$5); } | INSERT LPAREN idstring RPAREN LBRACE { + String *code; skip_balanced('{','}'); $$ = new_node("insert"); Setattr($$,"section",$3); Delitem(scanner_ccode,0); Delitem(scanner_ccode,DOH_END); - Setattr($$,"code", Copy(scanner_ccode)); + code = Copy(scanner_ccode); + Setattr($$,"code", code); + Delete(code); } ; @@ -1975,7 +2019,9 @@ module_directive: MODULE options idstring { if (!import_mode) { /* first module included, we apply global ModuleName, which can be modify by -module */ - Setattr($$,"name",Copy(ModuleName)); + String *mname = Copy(ModuleName); + Setattr($$,"name",mname); + Delete(mname); } else { /* import mode, we just pass the idstring */ Setattr($$,"name",$3); @@ -1991,6 +2037,7 @@ module_directive: MODULE options idstring { name_directive : NAME LPAREN idstring RPAREN { Swig_warning(WARN_DEPRECATED_NAME,cparse_file,cparse_line, "%%name is deprecated. Use %%rename instead.\n"); + Delete(yyrename); yyrename = NewString($3); $$ = 0; } @@ -2314,13 +2361,16 @@ typemap_directive : TYPEMAP LPAREN typemap_type RPAREN tm_list stringbrace { while (len && isspace(cstr[0])) { --len; ++cstr; } while (len && isspace(cstr[len - 1])) { --len; } code = NewStringWithSize(cstr, len); + break; } } kw = nextSibling(kw); } Setattr($$,"kwargs", $3.kwargs); } - Setattr($$,"code", code ? code : NewString($6)); + code = code ? code : NewString($6); + Setattr($$,"code", code); + Delete(code); appendChild($$,$5); } } @@ -2381,10 +2431,13 @@ tm_tail : COMMA typemap_parm tm_tail { ; typemap_parm : type typemap_parameter_declarator { + Parm *parm; SwigType_push($1,$2.type); $$ = new_node("typemapitem"); - Setattr($$,"pattern",NewParm($1,$2.id)); + parm = NewParm($1,$2.id); + Setattr($$,"pattern",parm); Setattr($$,"parms", $2.parms); + Delete(parm); /* $$ = NewParm($1,$2.id); Setattr($$,"parms",$2.parms); */ } @@ -2449,15 +2502,18 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va SwigType *rty = Swig_symbol_typedef_reduce(ty,tscope); ty = Swig_symbol_type_qualify(rty,tscope); Setattr(p,"type",ty); + Delete(ty); Delete(rty); } else { ty = Swig_symbol_type_qualify(ty,tscope); Setattr(p,"type",ty); + Delete(ty); } } } else { value = Swig_symbol_type_qualify(value,tscope); Setattr(p,"value",value); + Delete(value); } p = nextSibling(p); @@ -2484,6 +2540,7 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va nn = Getattr(nn,"sym:nextSibling"); /* repeat for overloaded templated functions */ continue; } else { + String *tname = Copy($5); int def_supplied = 0; /* Expand the template */ Node *templ = Swig_symbol_clookup($5,0); @@ -2535,7 +2592,8 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va templnode = copy_node(nn); /* We need to set the node name based on name used to instantiate */ - Setattr(templnode,"name",Copy($5)); + Setattr(templnode,"name",tname); + Delete(tname); if (!specialized) { Delattr(templnode,"sym:typename"); } else { @@ -2549,6 +2607,7 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va String *nname = NewStringf("__dummy_%d__", cnt++); Swig_cparse_template_expand(templnode,nname,temparms,tscope); Setattr(templnode,"sym:name",nname); + Delete(nname); Setattr(templnode,"feature:onlychildren", "typemap,typemapitem,typemapcopy,typedef,types,fragment"); } @@ -2582,6 +2641,7 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va Swig_symbol_inherit(st); } } + Delete(bases); } } Swig_symbol_setscope(csyms); @@ -2593,10 +2653,11 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va the class */ if (extendhash) { + String *stmp = 0; String *clsname; Node *am; if (Namespaceprefix) { - clsname = NewStringf("%s::%s", Namespaceprefix, Getattr(templnode,"name")); + clsname = stmp = NewStringf("%s::%s", Namespaceprefix, Getattr(templnode,"name")); } else { clsname = Getattr(templnode,"name"); } @@ -2610,6 +2671,7 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va appendChild(templnode,am); Delattr(extendhash,clsname); } + if (stmp) Delete(stmp); } /* Add to classes hash */ if (!classes) classes = NewHash(); @@ -2618,8 +2680,11 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va if (Namespaceprefix) { String *temp = NewStringf("%s::%s", Namespaceprefix, Getattr(templnode,"name")); Setattr(classes,temp,templnode); + Delete(temp); } else { - Setattr(classes,Swig_symbol_qualifiedscopename(templnode),templnode); + String *qs = Swig_symbol_qualifiedscopename(templnode); + Setattr(classes, qs,templnode); + Delete(qs); } } } @@ -2646,6 +2711,7 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va } } Swig_symbol_setscope(tscope); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } ; @@ -2721,15 +2787,19 @@ c_decl : storage_class type declarator initializer c_decl_tail { Setattr($$,"throw",$4.throw); if (!$5) { if (Len(scanner_ccode)) { - Setattr($$,"code",Copy(scanner_ccode)); + String *code = Copy(scanner_ccode); + Setattr($$,"code",code); + Delete(code); } } else { Node *n = $5; /* Inherit attributes */ while (n) { - Setattr(n,"type",Copy($2)); + String *type = Copy($2); + Setattr(n,"type",type); Setattr(n,"storage",$1); n = nextSibling(n); + Delete(type); } } if ($4.bitfield) { @@ -2781,7 +2851,9 @@ c_decl_tail : SEMI { } if (!$4) { if (Len(scanner_ccode)) { - Setattr($$,"code",Copy(scanner_ccode)); + String *code = Copy(scanner_ccode); + Setattr($$,"code",code); + Delete(code); } } else { set_nextSibling($$,$4); @@ -2886,29 +2958,37 @@ c_enum_decl : storage_class ENUM ename LBRACE enumlist RBRACE SEMI { Setattr(n,"unnamed",unnamed); if (unnamedinstance) { - Setattr($$,"type",NewString("enum ")); + SwigType *cty = NewString("enum "); + Setattr($$,"type",cty); Setattr($$,"unnamedinstance","1"); Setattr(n,"unnamedinstance","1"); + Delete(cty); } if ($8) { Node *p = $8; set_nextSibling(n,p); while (p) { - Setattr(p,"type",Copy(ty)); + SwigType *cty = Copy(ty); + Setattr(p,"type",cty); Setattr(p,"unnamed",unnamed); Setattr(p,"storage",$1); + Delete(cty); p = nextSibling(p); } } else { if (Len(scanner_ccode)) { - Setattr(n,"code",Copy(scanner_ccode)); + String *code = Copy(scanner_ccode); + Setattr(n,"code",code); + Delete(code); } } /* Ensure that typedef enum ABC {foo} XYZ; uses XYZ for sym:name, like structs. * Note that class_rename/yyrename are bit of a mess so used this simple approach to change the name. */ if ($7.id && $3 && Cmp($1,"typedef") == 0) { - Setattr($$, "parser:makename", NewString($7.id)); + String *name = NewString($7.id); + Setattr($$, "parser:makename", name); + Delete(name); } add_symbols($$); /* Add enum to tag space */ @@ -2916,6 +2996,7 @@ c_enum_decl : storage_class ENUM ename LBRACE enumlist RBRACE SEMI { add_symbols($5); /* Add enum values to id space */ add_symbols(n); + Delete(unnamed); } ; @@ -2946,7 +3027,9 @@ c_constructor_decl : storage_class type LPAREN parms RPAREN ctor_end { Setattr($$,"decl",decl); Setattr($$,"parms",$6.parms); if (Len(scanner_ccode)) { - Setattr($$,"code",Copy(scanner_ccode)); + String *code = Copy(scanner_ccode); + Setattr($$,"code",code); + Delete(code); } } if ($6.defarg) { @@ -3006,6 +3089,7 @@ cpp_class_decl : } } + Delete(class_rename); class_rename = make_name($3,0); Classprefix = NewString($3); /* Deal with inheritance */ @@ -3042,7 +3126,9 @@ cpp_class_decl : Swig_symbol_inherit(st); } } + Delete(bases); } + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); cparse_start_line = cparse_line; @@ -3052,10 +3138,12 @@ cpp_class_decl : if (template_parameters) { Parm *tp = template_parameters; while(tp) { + String *tpname = Copy(Getattr(tp,"name")); Node *tn = new_node("templateparm"); - Setattr(tn,"name",Getattr(tp,"name")); - Swig_symbol_cadd(Copy(Getattr(tp,"name")),tn); + Setattr(tn,"name",tpname); + Swig_symbol_cadd(tpname,tn); tp = nextSibling(tp); + Delete(tpname); } } inclass = 1; @@ -3064,6 +3152,7 @@ cpp_class_decl : SwigType *ty; Symtab *cscope = prev_symtab; Node *am = 0; + String *scpname = 0; inclass = 0; $$ = new_node("class"); Setline($$,cparse_start_line); @@ -3090,7 +3179,9 @@ cpp_class_decl : Delete(clsname); } if (!classes) classes = NewHash(); - Setattr(classes,Swig_symbol_qualifiedscopename(0),$$); + scpname = Swig_symbol_qualifiedscopename(0); + Setattr(classes,scpname,$$); + Delete(scpname); appendChild($$,$7); if (am) appendChild($$,am); @@ -3117,11 +3208,15 @@ cpp_class_decl : SwigType *decltype = Getattr($9,"decl"); if (Cmp($1,"typedef") == 0) { if (!decltype || !Len(decltype)) { + String *cname; name = Getattr($9,"name"); - Setattr($$,"tdname",Copy(name)); + cname = Copy(name); + Setattr($$,"tdname",cname); + Delete(cname); /* Use typedef name as class name */ if (class_rename && (Strcmp(class_rename,$3) == 0)) { + Delete(class_rename); class_rename = NewString(name); } if (!Getattr(classes,name)) { @@ -3151,27 +3246,33 @@ cpp_class_decl : /* we add the declaration in the original namespace */ appendChild(nscope_inner,$$); Swig_symbol_setscope(Getattr(nscope_inner,"symtab")); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($$); if (nscope) $$ = nscope; /* but the variable definition in the current scope */ Swig_symbol_setscope(cscope); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($9); } else { - yyrename = NewString(class_rename); + Delete(yyrename); + yyrename = Copy(class_rename); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($$); add_symbols($9); } Swig_symbol_setscope(cscope); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } /* An unnamed struct, possibly with a typedef */ | storage_class cpptype LBRACE { + Delete(class_rename); class_rename = make_name(0,0); if (strcmp($2,"class") == 0) { cplus_mode = CPLUS_PRIVATE; @@ -3182,6 +3283,7 @@ cpp_class_decl : cparse_start_line = cparse_line; inclass = 1; Classprefix = NewStringEmpty(); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } cpp_members RBRACE declarator c_decl_tail { String *unnamed; @@ -3210,8 +3312,10 @@ cpp_class_decl : Node *p = $8; set_nextSibling(n,p); while (p) { + String *type = Copy(unnamed); Setattr(p,"unnamed",unnamed); - Setattr(p,"type",Copy(unnamed)); + Setattr(p,"type",type); + Delete(type); Setattr(p,"storage",$1); p = nextSibling(p); } @@ -3222,6 +3326,7 @@ cpp_class_decl : String *name = 0; if ($1 && (strcmp($1,"typedef") == 0)) { if (!Len($7.type)) { + String *scpname = 0; name = $7.id; Setattr($$,"tdname",name); Setattr($$,"name",name); @@ -3247,7 +3352,9 @@ cpp_class_decl : Delete(clsname); } if (!classes) classes = NewHash(); - Setattr(classes,Swig_symbol_qualifiedscopename(0),$$); + scpname = Swig_symbol_qualifiedscopename(0); + Setattr(classes,scpname,$$); + Delete(scpname); } else { Swig_symbol_setscopename((char*)""); } @@ -3258,11 +3365,14 @@ cpp_class_decl : /* Pop the scope */ Setattr($$,"symtab",Swig_symbol_popscope()); if (class_rename) { + Delete(yyrename); yyrename = NewString(class_rename); } + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($$); add_symbols(n); + Delete(unnamed); } ; @@ -3316,6 +3426,7 @@ cpp_template_decl : TEMPLATE LESSTHAN template_parms GREATERTHAN { template_para } if (sti) { Swig_symbol_setscope(sti); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); $6 = ni; } @@ -3526,6 +3637,7 @@ cpp_template_decl : TEMPLATE LESSTHAN template_parms GREATERTHAN { template_para } $$ = ntop; Swig_symbol_setscope(cscope); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (error) $$ = 0; } @@ -3589,9 +3701,12 @@ template_parms : rawparms { cpp_using_decl : USING idcolon SEMI { String *uname = Swig_symbol_type_qualify($2,0); + String *name = Swig_scopename_last($2); $$ = new_node("using"); Setattr($$,"uname",uname); - Setattr($$,"name", Swig_scopename_last($2)); + Setattr($$,"name", name); + Delete(uname); + Delete(name); add_symbols($$); } | USING NAMESPACE idcolon SEMI { @@ -3637,6 +3752,7 @@ cpp_namespace_decl : NAMESPACE idcolon LBRACE { Swig_symbol_newscope(); Swig_symbol_setscopename($2); } + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } interface RBRACE { Node *n = $5; @@ -3645,6 +3761,7 @@ cpp_namespace_decl : NAMESPACE idcolon LBRACE { Setattr(n,"symtab", Swig_symbol_popscope()); Swig_symbol_setscope($1); $$ = n; + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($$); } @@ -3666,6 +3783,7 @@ cpp_namespace_decl : NAMESPACE idcolon LBRACE { Setattr($$,"unnamed","1"); Setattr($$,"symtab", Swig_symbol_popscope()); Swig_symbol_setscope($1); + Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($$); } @@ -3750,8 +3868,10 @@ cpp_member : c_declaration { $$ = $1; } symname= make_name(Getattr($$,"name"), Getattr($$,"decl")); if (Strcmp(symname,Getattr($$,"name")) == 0) { /* No renaming operation. Set name to class name */ + Delete(yyrename); yyrename = NewString(Getattr(current_class,"sym:name")); } else { + Delete(yyrename); yyrename = symname; } } @@ -3793,7 +3913,9 @@ cpp_constructor_decl : storage_class type LPAREN parms RPAREN ctor_end { Setattr($$,"throws",$6.throws); Setattr($$,"throw",$6.throw); if (Len(scanner_ccode)) { - Setattr($$,"code",Copy(scanner_ccode)); + String *code = Copy(scanner_ccode); + Setattr($$,"code",code); + Delete(code); } SetFlag($$,"feature:new"); } else { @@ -3805,15 +3927,20 @@ cpp_constructor_decl : storage_class type LPAREN parms RPAREN ctor_end { /* A destructor (hopefully) */ cpp_destructor_decl : NOT idtemplate LPAREN parms RPAREN cpp_end { + String *name = NewStringf("~%s",$2); $$ = new_node("destructor"); - Setattr($$,"name",NewStringf("~%s",$2)); + Setattr($$,"name",name); + Delete(name); if (Len(scanner_ccode)) { - Setattr($$,"code",Copy(scanner_ccode)); + String *code = Copy(scanner_ccode); + Setattr($$,"code",code); + Delete(code); } { String *decl = NewStringEmpty(); SwigType_add_function(decl,$4); Setattr($$,"decl",decl); + Delete(decl); } Setattr($$,"throws",$6.throws); Setattr($$,"throw",$6.throw); @@ -3823,32 +3950,36 @@ cpp_destructor_decl : NOT idtemplate LPAREN parms RPAREN cpp_end { /* A virtual destructor */ | VIRTUAL NOT idtemplate LPAREN parms RPAREN cpp_vend { + String *name; + char *c; $$ = new_node("destructor"); /* Check for template names. If the class is a template and the constructor is missing the template part, we add it */ - { - char *c = Strstr(Classprefix,"<"); - if (c) { - if (!Strstr($3,"<")) { - $3 = NewStringf("%s%s",$3,c); - } - } - } + if ((c = strstr(Char(Classprefix),"<"))) { + if (!Strstr($3,"<")) { + $3 = NewStringf("%s%s",$3,c); + } + } Setattr($$,"storage","virtual"); - Setattr($$,"name",NewStringf("~%s",$3)); + name = NewStringf("~%s",$3); + Setattr($$,"name",name); + Delete(name); Setattr($$,"throws",$7.throws); Setattr($$,"throw",$7.throw); if ($7.val) { Setattr($$,"value","0"); } if (Len(scanner_ccode)) { - Setattr($$,"code",Copy(scanner_ccode)); + String *code = Copy(scanner_ccode); + Setattr($$,"code",code); + Delete(code); } { String *decl = NewStringEmpty(); SwigType_add_function(decl,$5); Setattr($$,"decl",decl); + Delete(decl); } add_symbols($$); @@ -4219,7 +4350,9 @@ valparm : parm { if (!SwigType_isfunction(decl)) { String *value = Getattr(n,"value"); if (value) { - Setattr($1,"type",Copy(value)); + String *v = Copy(value); + Setattr($1,"type",v); + Delete(v); n = 0; } } @@ -4237,10 +4370,12 @@ valparm : parm { Setattr($$,"value",$1.val); } | STRING { + String *v = NewString($1); $$ = NewParm(0,0); Setfile($$,cparse_file); Setline($$,cparse_line); - Setattr($$,"value",NewString($1)); + Setattr($$,"value",v); + Delete(v); } ; @@ -5041,21 +5176,27 @@ enumlist : enumlist COMMA edecl { ; edecl : ID { + SwigType *type = NewSwigType(T_INT); $$ = new_node("enumitem"); Setattr($$,"name",$1); - Setattr($$,"type",NewSwigType(T_INT)); + Setattr($$,"type",type); SetFlag($$,"feature:immutable"); + Delete(type); } | ID EQUAL etype { $$ = new_node("enumitem"); Setattr($$,"name",$1); Setattr($$,"enumvalue", $3.val); if ($3.type == T_CHAR) { + SwigType *type = NewSwigType(T_CHAR); Setattr($$,"value",$3.val); - Setattr($$,"type",NewSwigType(T_CHAR)); + Setattr($$,"type",type); + Delete(type); } else { + SwigType *type = NewSwigType(T_INT); Setattr($$,"value",$1); - Setattr($$,"type",NewSwigType(T_INT)); + Setattr($$,"type",type); + Delete(type); } SetFlag($$,"feature:immutable"); } @@ -5219,14 +5360,18 @@ exprcompound : expr PLUS expr { $$.type = T_INT; } | type LPAREN { + String *qty; skip_balanced('(',')'); - $1 = Swig_symbol_type_qualify($1,0); - if (SwigType_istemplate($1)) { - $1 = SwigType_namestr($1); + qty = Swig_symbol_type_qualify($1,0); + if (SwigType_istemplate(qty)) { + String *nstr = SwigType_namestr(qty); + Delete(qty); + qty = nstr; } - $$.val = NewStringf("%s%s",$1,scanner_ccode); + $$.val = NewStringf("%s%s",qty,scanner_ccode); Clear(scanner_ccode); $$.type = T_INT; + Delete(qty); } ; diff --git a/SWIG/Source/CParse/templ.c b/SWIG/Source/CParse/templ.c index f32a02085..c4af4ef68 100644 --- a/SWIG/Source/CParse/templ.c +++ b/SWIG/Source/CParse/templ.c @@ -125,7 +125,7 @@ cparse_template_expand(Node *n, String *tname, String *rname, String *templatear /* Change the node type back to normal */ if (!expanded) { expanded = 1; - set_nodeType(n,Getattr(n,k_templatetype)); + Setattr(n,k_nodetype,Getattr(n,k_templatetype)); ret = cparse_template_expand(n,tname, rname, templateargs, patchlist,typelist, cpatchlist); expanded = 0; return ret; @@ -133,9 +133,9 @@ cparse_template_expand(Node *n, String *tname, String *rname, String *templatear /* Called when template appears inside another template */ /* Member templates */ - set_nodeType(n,Getattr(n,k_templatetype)); + Setattr(n,k_nodetype,Getattr(n,k_templatetype)); ret = cparse_template_expand(n,tname, rname, templateargs, patchlist,typelist, cpatchlist); - set_nodeType(n,k_template); + Setattr(n,k_nodetype,k_template); return ret; } } else if (StringEqual(nodeType,k_cdecl)) { diff --git a/SWIG/Source/DOH/base.c b/SWIG/Source/DOH/base.c index 5acf14fda..77356d81f 100644 --- a/SWIG/Source/DOH/base.c +++ b/SWIG/Source/DOH/base.c @@ -18,14 +18,17 @@ char cvsroot_base_c[] = "$Header$"; * DohDelete() * ----------------------------------------------------------------------------- */ -/* #define SWIG_DEBUG_DELETE */ +#ifndef SWIG_DEBUG_DELETE +#define SWIG_DEBUG_DELETE 0 +#endif + void DohDelete(DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (!obj) return; -#ifdef SWIG_DEBUG_DELETE +#if SWIG_DEBUG_DELETE if (!DohCheck(b)) { fputs("DOH: Fatal error. Attempt to delete a non-doh object.\n",stderr); abort(); diff --git a/SWIG/Source/Modules/allocate.cxx b/SWIG/Source/Modules/allocate.cxx index 73aea314c..34c8176aa 100644 --- a/SWIG/Source/Modules/allocate.cxx +++ b/SWIG/Source/Modules/allocate.cxx @@ -332,6 +332,7 @@ class Allocate : public Dispatcher { if (!nabstract) { nabstract = NewList(); Setattr(n,"abstract",nabstract); + Delete(nabstract); } Append(nabstract,nn); if (!Getattr(n,"abstract:firstnode")) { @@ -557,6 +558,7 @@ public: List *abstract = NewList(); Append(abstract,na); Setattr(n,"abstract",abstract); + Delete(abstract); } } } diff --git a/SWIG/Source/Modules/emit.cxx b/SWIG/Source/Modules/emit.cxx index d0e7b1229..1b077825b 100644 --- a/SWIG/Source/Modules/emit.cxx +++ b/SWIG/Source/Modules/emit.cxx @@ -482,4 +482,5 @@ void emit_action(Node *n, Wrapper *f) { Printv(f->code,tm,"\n",NIL); } } + } diff --git a/SWIG/Source/Modules/lang.cxx b/SWIG/Source/Modules/lang.cxx index 27ebacf00..18fa9c561 100644 --- a/SWIG/Source/Modules/lang.cxx +++ b/SWIG/Source/Modules/lang.cxx @@ -956,7 +956,11 @@ Language::globalfunctionHandler(Node *n) { Delete(cbname); } Setattr(n,"parms",nonvoid_parms(parms)); - Setattr(n,"wrap:action", Swig_cresult(type,"result", Swig_cfunction_call(name,parms))); + String *call = Swig_cfunction_call(name,parms); + String *cres = Swig_cresult(type,"result", call); + Setattr(n,"wrap:action", cres); + Delete(cres); + Delete(call); functionWrapper(n); } Swig_restore(n); @@ -1207,11 +1211,10 @@ Language::membervariableHandler(Node *n) { } if (!AttributeFunctionGet) { - - String *mrename_get, *mrename_set; - - mrename_get = Swig_name_get(Swig_name_member(ClassPrefix, symname)); - mrename_set = Swig_name_set(Swig_name_member(ClassPrefix, symname)); + String *mname = Swig_name_member(ClassPrefix, symname); + String *mrename_get = Swig_name_get(mname); + String *mrename_set = Swig_name_set(mname); + Delete(mname); /* Create a function to set the value of the variable */ @@ -1234,10 +1237,14 @@ Language::membervariableHandler(Node *n) { String *base = Getattr(sn,"name"); target = NewStringf("%s::%s", base,name); } else { - target = NewStringf("(*%s)->%s",Swig_cparm_name(0,0),name); + String *pname = Swig_cparm_name(0,0); + target = NewStringf("(*%s)->%s",pname,name); + Delete(pname); } } else { - target = NewStringf("%s->%s", Swig_cparm_name(0,0),name); + String *pname = Swig_cparm_name(0,0); + target = NewStringf("%s->%s", pname,name); + Delete(pname); } tm = Swig_typemap_lookup_new("memberin",n,target,0); } @@ -1254,12 +1261,16 @@ Language::membervariableHandler(Node *n) { make_set_wrapper = 0; } } else { - Replace(tm,"$source", Swig_cparm_name(0,1), DOH_REPLACE_ANY); + String *pname0 = Swig_cparm_name(0,0); + String *pname1 = Swig_cparm_name(0,1); + Replace(tm,"$source", pname1, DOH_REPLACE_ANY); Replace(tm,"$target", target, DOH_REPLACE_ANY); - Replace(tm,"$input",Swig_cparm_name(0,1),DOH_REPLACE_ANY); - Replace(tm,"$self",Swig_cparm_name(0,0),DOH_REPLACE_ANY); + Replace(tm,"$input",pname1,DOH_REPLACE_ANY); + Replace(tm,"$self",pname0,DOH_REPLACE_ANY); Setattr(n,"wrap:action", tm); Delete(tm); + Delete(pname0); + Delete(pname1); } Delete(target); } @@ -1307,7 +1318,7 @@ Language::membervariableHandler(Node *n) { cpp_member_func(Char(gname),Char(gname),type,0); Delete(ActionFunc); } else { - String *cname = Copy(Swig_name_get(name)); + String *cname = Swig_name_get(name); cpp_member_func(Char(cname),Char(gname),type,0); Delete(cname); } @@ -1320,7 +1331,7 @@ Language::membervariableHandler(Node *n) { cpp_member_func(Char(gname),Char(gname),vty,p); Delete(ActionFunc); } else { - String *cname = Copy(Swig_name_set(name)); + String *cname = Swig_name_set(name); cpp_member_func(Char(cname),Char(gname),vty,p); Delete(cname); } @@ -2459,8 +2470,9 @@ int Language::variableWrapper(Node *n) { String *tm = Swig_typemap_lookup_new("globalin", n, name, 0); Swig_VarsetToFunction(n); - - Setattr(n,"sym:name", Swig_name_set(symname)); + String *sname = Swig_name_set(symname); + Setattr(n,"sym:name", sname); + Delete(sname); /* String *tm = Swig_typemap_lookup((char *) "globalin",type,name,name,Swig_cparm_name(0,0),name,0);*/ @@ -2471,11 +2483,13 @@ int Language::variableWrapper(Node *n) { make_set_wrapper = 0; } } else { - Replace(tm,"$source", Swig_cparm_name(0,0), DOH_REPLACE_ANY); + String *pname0 = Swig_cparm_name(0,0); + Replace(tm,"$source", pname0, DOH_REPLACE_ANY); Replace(tm,"$target", name, DOH_REPLACE_ANY); - Replace(tm,"$input",Swig_cparm_name(0,0),DOH_REPLACE_ANY); + Replace(tm,"$input",pname0,DOH_REPLACE_ANY); Setattr(n,"wrap:action", tm); Delete(tm); + Delete(pname0); } if (make_set_wrapper) { functionWrapper(n); @@ -2493,7 +2507,9 @@ int Language::variableWrapper(Node *n) { } } Swig_VargetToFunction(n); - Setattr(n,"sym:name", Swig_name_get(symname)); + String *gname = Swig_name_get(symname); + Setattr(n,"sym:name", gname); + Delete(gname); functionWrapper(n); Swig_restore(n); return SWIG_OK; diff --git a/SWIG/Source/Modules/main.cxx b/SWIG/Source/Modules/main.cxx index 610ca6603..950d2bf31 100644 --- a/SWIG/Source/Modules/main.cxx +++ b/SWIG/Source/Modules/main.cxx @@ -185,8 +185,9 @@ static void install_opts(int argc, char *argv[]) { } if (!noopt) { /* Printf(stdout,"%s\n", opt); */ - Delete(Preprocessor_define(opt, 0)); + Preprocessor_define(opt, 0); } + Delete(opt); } } } @@ -337,6 +338,7 @@ static void SWIG_dump_runtime() { Delete(s); Close(runtime); + Delete(runtime); SWIG_exit(EXIT_SUCCESS); } @@ -357,9 +359,10 @@ void SWIG_getoptions(int argc, char *argv[]) includefiles[includecount++] = Swig_copy_string(argv[i]+2); Swig_mark_arg(i); } else if (strncmp(argv[i],"-D",2) == 0) { - DOH *d = NewString(argv[i]+2); + String *d = NewString(argv[i]+2); Replace(d,(char*)"=",(char*)" ", DOH_REPLACE_ANY | DOH_REPLACE_FIRST); - Delete(Preprocessor_define((DOH *) d,0)); + Preprocessor_define((DOH *) d,0); + Delete(d); // Create a symbol Swig_mark_arg(i); } else if (strcmp(argv[i],"-E") == 0) { @@ -374,7 +377,7 @@ void SWIG_getoptions(int argc, char *argv[]) Swig_mark_arg(i); } else if (strcmp(argv[i],"-c++") == 0) { CPlusPlus=1; - Delete(Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0)); + Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0); Swig_cparse_cplusplus(1); Swig_mark_arg(i); } else if (strcmp(argv[i],"-fcompact") == 0) { @@ -461,8 +464,8 @@ void SWIG_getoptions(int argc, char *argv[]) if (!outfile_name_h) { Printf(basename, ".%s", hpp_extension); outfile_name_h = Swig_copy_string(Char(basename)); - Delete(basename); } + Delete(basename); } Swig_mark_arg(i+1); i++; @@ -651,13 +654,13 @@ int SWIG_main(int argc, char *argv[], Language *l) { // Set up some default symbols (available in both SWIG interface files // and C files) - Delete(Preprocessor_define((DOH *) "SWIG 1", 0)); - Delete(Preprocessor_define((DOH *) "__STDC__", 0)); + Preprocessor_define((DOH *) "SWIG 1", 0); + Preprocessor_define((DOH *) "__STDC__", 0); #ifdef MACSWIG - Delete(Preprocessor_define((DOH *) "SWIGMAC 1", 0)); + Preprocessor_define((DOH *) "SWIGMAC 1", 0); #endif #ifdef SWIGWIN32 - Delete(Preprocessor_define((DOH *) "SWIGWIN32 1", 0)); + Preprocessor_define((DOH *) "SWIGWIN32 1", 0); #endif // Set the SWIG version value in format 0xAABBCC from package version expected to be in format A.B.C @@ -678,7 +681,7 @@ int SWIG_main(int argc, char *argv[], Language *l) { /* Turn on contracts */ Swig_contract_mode_set(1); - Delete(Preprocessor_define(vers,0)); + Preprocessor_define(vers,0); /* Turn off directors mode */ Wrapper_director_mode_set(0); @@ -715,7 +718,7 @@ int SWIG_main(int argc, char *argv[], Language *l) { // Define the __cplusplus symbol if (CPlusPlus) - Delete(Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0)); + Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0); // Parse language dependent options lang->main(argc,argv); @@ -827,6 +830,7 @@ int SWIG_main(int argc, char *argv[], Language *l) { } Seek(fs,0,SEEK_SET); cpps = Preprocessor_parse(fs); + Delete(fs); } else { df = Swig_open(input_file); cpps = NewFileFromFile(df); @@ -965,9 +969,15 @@ int SWIG_main(int argc, char *argv[], Language *l) { if (dump_xml) { Swig_print_xml(top, xmlout); } + Delete(top); } if (tm_debug) Swig_typemap_debug(); if (memory_debug) DohMemoryDebug(); + + // Deletes + Delete(libfiles); + Preprocessor_delete(); + while (freeze); diff --git a/SWIG/Source/Modules/overload.cxx b/SWIG/Source/Modules/overload.cxx index 459894667..6f72449dc 100644 --- a/SWIG/Source/Modules/overload.cxx +++ b/SWIG/Source/Modules/overload.cxx @@ -423,6 +423,7 @@ Swig_overload_dispatch(Node *n, const String_or_char *fmt, int *maxargs) { for (/* empty */; num_braces > 0; num_braces--) Printf(f, "}\n"); Printf(f,"}\n"); /* braces closes "if" for this method */ + Delattr(ni,"wrap:parms"); } Delete(dispatch); return f; diff --git a/SWIG/Source/Modules/python.cxx b/SWIG/Source/Modules/python.cxx index a0c177847..d76f1df94 100644 --- a/SWIG/Source/Modules/python.cxx +++ b/SWIG/Source/Modules/python.cxx @@ -164,7 +164,7 @@ public: Swig_mark_arg(i); } else if (strcmp(argv[i],"-nortti") == 0) { /* Turn on no RTTI mode */ - Delete(Preprocessor_define((DOH *) "SWIG_NORTTI", 0)); + Preprocessor_define((DOH *) "SWIG_NORTTI", 0); Swig_mark_arg(i); } else if (strcmp(argv[i],"-modern") == 0) { apply = 0; @@ -189,11 +189,11 @@ public: } if (cppcast) { - Delete(Preprocessor_define((DOH *) "SWIG_CPLUSPLUS_CAST", 0)); + Preprocessor_define((DOH *) "SWIG_CPLUSPLUS_CAST", 0); } if (!global_name) global_name = NewString("cvar"); - Delete(Preprocessor_define("SWIGPYTHON 1", 0)); + Preprocessor_define("SWIGPYTHON 1", 0); SWIG_typemap_lang("python"); SWIG_config_file("python.swg"); allow_overloading(); @@ -2304,6 +2304,7 @@ public: if (!shadow_list) { shadow_list = NewList(); Setattr(getCurrentClass(),"shadow_methods", shadow_list); + Delete(shadow_list); } Append(shadow_list, symname); } else { @@ -2560,27 +2561,29 @@ public: Language::membervariableHandler(n); shadow = oldshadow; + String *mname = Swig_name_member(class_name,symname); + String *sname = Swig_name_set(mname); + String *gname = Swig_name_get(mname); if (shadow) { int assignable = is_assignable(n); if (!modern) { if (assignable) { - Printv(f_shadow, tab4, "__swig_setmethods__[\"", symname, "\"] = ", module, ".", Swig_name_set(Swig_name_member(class_name,symname)), "\n", NIL); + Printv(f_shadow, tab4, "__swig_setmethods__[\"", symname, "\"] = ", module, ".", sname, "\n", NIL); } - Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = ", module, ".", Swig_name_get(Swig_name_member(class_name,symname)),"\n", NIL); + Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = ", module, ".", gname,"\n", NIL); } if (!classic) { if (!assignable) { - Printv(f_shadow,tab4, modern ? "" : "if _newclass:", - symname," = property(", module, ".", - Swig_name_get(Swig_name_member(class_name,symname)),")\n", NIL); + Printv(f_shadow, tab4, modern ? "" : "if _newclass:", symname," = property(", module, ".", gname,")\n", NIL); } else { - Printv(f_shadow,tab4, modern ? "" : "if _newclass:", - symname," = property(", - module, ".", Swig_name_get(Swig_name_member(class_name,symname)),", ", - module, ".", Swig_name_set(Swig_name_member(class_name,symname)),")\n", NIL); + Printv(f_shadow, tab4, modern ? "" : "if _newclass:", symname," = property(", module, ".", gname,", ", module, ".", sname,")\n", NIL); } } } + Delete(mname); + Delete(sname); + Delete(gname); + return SWIG_OK; } @@ -2597,7 +2600,9 @@ public: t = Getattr(n,"type"); symname = Getattr(n,"sym:name"); if (SwigType_isconst(t) && !Getattr(n, "value")) { - Printf(f_shadow_stubs,"%s.%s = %s.%s.%s\n", class_name, symname, module, global_name, Swig_name_member(class_name,symname)); + String *mname = Swig_name_member(class_name,symname); + Printf(f_shadow_stubs,"%s.%s = %s.%s.%s\n", class_name, symname, module, global_name, mname); + Delete(mname); } } return SWIG_OK; diff --git a/SWIG/Source/Modules/ruby.cxx b/SWIG/Source/Modules/ruby.cxx index 288f0b3c0..521736d3a 100644 --- a/SWIG/Source/Modules/ruby.cxx +++ b/SWIG/Source/Modules/ruby.cxx @@ -2041,10 +2041,11 @@ public: String *freefunc = NewString(""); String *freebody = NewString(""); + String *pname0 = Swig_cparm_name(0,0); Printv(freefunc, "free_", klass->mname, NIL); Printv(freebody, "SWIGINTERN void\n", - freefunc, "(", klass->type, " *", Swig_cparm_name(0,0), ") {\n", + freefunc, "(", klass->type, " *", pname0, ") {\n", tab4, NIL); if (Extend) { @@ -2052,7 +2053,7 @@ public: if (wrap) { Printv(f_wrappers, wrap, NIL); } - /* Printv(freebody, Swig_name_destroy(name), "(", Swig_cparm_name(0,0), ")", NIL); */ + /* Printv(freebody, Swig_name_destroy(name), "(", pname0, ")", NIL); */ Printv(freebody,Getattr(n,"wrap:action"), NIL); } else { String *action = Getattr(n,"wrap:action"); @@ -2061,14 +2062,14 @@ public: } else { /* In the case swig emits no destroy function. */ if (CPlusPlus) - Printf(freebody, "delete %s;\n", Swig_cparm_name(0,0)); + Printf(freebody, "delete %s;\n", pname0); else - Printf(freebody, "free((char*) %s);\n", Swig_cparm_name(0,0)); + Printf(freebody, "free((char*) %s);\n", pname0); } } if (GetFlag(n,"feature:trackobjects")) { - Printf(freebody, " SWIG_RubyRemoveTracking(%s);\n", Swig_cparm_name(0,0)); + Printf(freebody, " SWIG_RubyRemoveTracking(%s);\n", pname0); } Printv(freebody, "}\n\n", NIL); @@ -2078,6 +2079,7 @@ public: current = NO_CPP; Delete(freefunc); Delete(freebody); + Delete(pname0); return SWIG_OK; } diff --git a/SWIG/Source/Modules/swigmain.cxx b/SWIG/Source/Modules/swigmain.cxx index 684668f6d..dbcebcabc 100644 --- a/SWIG/Source/Modules/swigmain.cxx +++ b/SWIG/Source/Modules/swigmain.cxx @@ -198,6 +198,8 @@ int main(int margc, char **margv) { dl = (fac)(); } } - return SWIG_main(argc,argv,dl); + int res = SWIG_main(argc,argv,dl); + delete dl; + return res; } diff --git a/SWIG/Source/Modules/typepass.cxx b/SWIG/Source/Modules/typepass.cxx index 62703be77..9fd6c35cf 100644 --- a/SWIG/Source/Modules/typepass.cxx +++ b/SWIG/Source/Modules/typepass.cxx @@ -131,7 +131,7 @@ class TypePass : private Dispatcher { if (first == cls) return; /* The Marcelo check */ if (!cls) cls = first; - + List *alist = 0; List *ilist = Getattr(cls,bases); if (!ilist) { List *nlist = Getattr(cls,baselist); @@ -184,7 +184,7 @@ class TypePass : private Dispatcher { bcls = 0; } else { if (Getattr(bcls,"typepass:visit")) { - if (!ilist) ilist = NewList(); + if (!ilist) ilist = alist = NewList(); Append(ilist,bcls); } else { Swig_warning(WARN_TYPE_UNDEFINED_CLASS,Getfile(cls),Getline(cls),"Base class '%s' undefined.\n", bname); @@ -214,6 +214,8 @@ class TypePass : private Dispatcher { Setattr(cls,bases,ilist); } } + if (alist) Delete(alist); + if (!ilist) return; int len = Len(ilist); int i; @@ -269,9 +271,8 @@ class TypePass : private Dispatcher { append_list(allbases,Getattr(cls,"privatebases")); if (Len(allbases)) { Setattr(cls,"allbases",allbases); - } else { - Delete(allbases); } + Delete(allbases); } /* ------------------------------------------------------------ diff --git a/SWIG/Source/Preprocessor/cpp.c b/SWIG/Source/Preprocessor/cpp.c index 38c846e71..6e12da1c1 100644 --- a/SWIG/Source/Preprocessor/cpp.c +++ b/SWIG/Source/Preprocessor/cpp.c @@ -29,6 +29,7 @@ static int imported_depth = 0; /* Depth of %imported files */ static int single_include = 1; /* Only include each file once */ static Hash *included_files = 0; static List *dependencies = 0; +static SwigScanner *id_scan = 0; /* Test a character to see if it starts an identifier */ #define isidentifier(c) ((isalpha(c)) || (c == '_') || (c == '$')) @@ -72,8 +73,7 @@ copy_location(const DOH *s1, DOH *s2) { } static String *cpp_include(String_or_char *fn, int sysfile) { - String *s; - s = sysfile ? Swig_include_sys(fn) : Swig_include(fn); + String *s = sysfile ? Swig_include_sys(fn) : Swig_include(fn); if (s && single_include) { String *file = Getfile(s); if (Getattr(included_files,file)) { @@ -180,9 +180,58 @@ void Preprocessor_init(void) { cpp = NewHash(); s = NewHash(); Setattr(cpp,k_symbols,s); + Delete(s); Preprocessor_expr_init(); /* Initialize the expression evaluator */ included_files = NewHash(); + + id_scan = NewSwigScanner();; + } + +void Preprocessor_delete(void) { + Delete(k_args); + Delete(k_define); + Delete(k_defined); + Delete(k_else); + Delete(k_elif); + Delete(k_endif); + Delete(k_expanded); + Delete(k_if); + Delete(k_ifdef); + Delete(k_ifndef); + Delete(k_name); + Delete(k_swigmacro); + Delete(k_symbols); + Delete(k_undef); + Delete(k_value); + Delete(k_error); + Delete(k_warning); + Delete(k_pragma); + Delete(k_level); + Delete(k_line); + Delete(k_include); + Delete(k_varargs); + + Delete(k_dinclude); + Delete(k_dimport); + Delete(k_dextern); + Delete(k_ddefine); + Delete(k_dline); + + + Delete(k_LINE); + Delete(k_FILE); + Delete(cpp); + Delete(included_files); + Preprocessor_expr_delete(); + DelSwigScanner(id_scan); + + Delete(dependencies); + + Delete(Swig_last_file()); + Delete(Swig_add_directory(0)); +} + /* ----------------------------------------------------------------------------- * void Preprocessor_include_all() - Instruct preprocessor to include all files * ----------------------------------------------------------------------------- */ @@ -418,7 +467,7 @@ Hash *Preprocessor_define(const String_or_char *_str, int swigmacro) /* Go create the macro */ macro = NewHash(); - Setattr(macro,k_name, macroname); + Setattr(macro,k_name,macroname); if (arglist) { Setattr(macro,k_args,arglist); @@ -428,7 +477,6 @@ Hash *Preprocessor_define(const String_or_char *_str, int swigmacro) } } Setattr(macro,k_value,macrovalue); - Delete(macrovalue); Setline(macro,line); Setfile(macro,file); if (swigmacro) { @@ -441,9 +489,13 @@ Hash *Preprocessor_define(const String_or_char *_str, int swigmacro) Swig_error(Getfile(m1),Getline(m1),"previous definition of '%s'.\n",macroname); goto macro_error; } + } else { + Setattr(symbols,macroname,macro); + Delete(macro); } - Setattr(symbols,macroname,macro); + Delete(macroname); + Delete(macrovalue); Delete(str); Delete(argstr); @@ -454,6 +506,7 @@ Hash *Preprocessor_define(const String_or_char *_str, int swigmacro) Delete(argstr); Delete(arglist); Delete(macroname); + Delete(macrovalue); return 0; } @@ -1056,16 +1109,12 @@ Preprocessor_replace(DOH *s) static int check_id(DOH *s) { - static SwigScanner *scan = 0; int c; int hastok = 0; + SwigScanner *scan = id_scan; Seek(s,0,SEEK_SET); - if (!scan) { - scan = NewSwigScanner(); - } - SwigScanner_clear(scan); s = Copy(s); Seek(s,SEEK_SET,0); @@ -1113,8 +1162,7 @@ static void add_chunk(DOH *ns, DOH *chunk, int allow) { static void push_imported() { if (imported_depth == 0) { - DOH *m = Preprocessor_define("SWIGIMPORTED 1", 0); - Delete(m); + Preprocessor_define("SWIGIMPORTED 1", 0); } ++imported_depth; } @@ -1145,10 +1193,10 @@ String * Preprocessor_parse(String *s) { String *ns; /* New string containing the preprocessed text */ - String *chunk, *sval, *decl; + String *chunk, *decl; Hash *symbols; String *id = 0, *value = 0, *comment = 0; - int i, state, val, e, c; + int i, state, e, c; int start_line = 0; int allow = 1; int level = 0; @@ -1371,7 +1419,6 @@ Preprocessor_parse(String *s) } Delete(v); } - Delete(m); } } else if (StringEqual(id,k_undef)) { if (allow) Preprocessor_undef(value); @@ -1420,8 +1467,9 @@ Preprocessor_parse(String *s) cond_lines[level] = Getline(id); level++; if (allow) { + int val; + String *sval = Preprocessor_replace(value); start_level = level; - sval = Preprocessor_replace(value); Seek(sval,0,SEEK_SET); /* Printf(stdout,"Evaluating '%s'\n", sval); */ val = Preprocessor_expr(sval,&e); @@ -1447,7 +1495,8 @@ Preprocessor_parse(String *s) allow = 0; mask = 0; } else if (level == start_level) { - sval = Preprocessor_replace(value); + int val; + String *sval = Preprocessor_replace(value); Seek(sval,0,SEEK_SET); val = Preprocessor_expr(sval,&e); if (e) { @@ -1689,7 +1738,7 @@ Preprocessor_parse(String *s) } if (allow) { Seek(value,0,SEEK_SET); - Delete(Preprocessor_define(value,1)); + Preprocessor_define(value,1); } StringPutc('\n',ns); addline(ns,value,0); diff --git a/SWIG/Source/Preprocessor/expr.c b/SWIG/Source/Preprocessor/expr.c index cba822bae..ed3df8f20 100644 --- a/SWIG/Source/Preprocessor/expr.c +++ b/SWIG/Source/Preprocessor/expr.c @@ -226,6 +226,13 @@ Preprocessor_expr_init (void) { if (!scan) scan = NewSwigScanner(); } +void +Preprocessor_expr_delete (void) { + SwigScanner_clear(scan); + DelSwigScanner(scan); +} + + /* ----------------------------------------------------------------------------- * Tokenizer * ----------------------------------------------------------------------------- */ diff --git a/SWIG/Source/Preprocessor/preprocessor.h b/SWIG/Source/Preprocessor/preprocessor.h index 67634cb10..778c1c912 100644 --- a/SWIG/Source/Preprocessor/preprocessor.h +++ b/SWIG/Source/Preprocessor/preprocessor.h @@ -24,12 +24,14 @@ extern char *Preprocessor_expr_error(void); extern Hash *Preprocessor_define(const String_or_char *str, int swigmacro); extern void Preprocessor_undef(const String_or_char *name); extern void Preprocessor_init(void); +extern void Preprocessor_delete(void); extern String *Preprocessor_parse(String *s); extern void Preprocessor_include_all(int); extern void Preprocessor_import_all(int); extern void Preprocessor_ignore_missing(int); extern List *Preprocessor_depend(void); extern void Preprocessor_expr_init(void); +extern void Preprocessor_expr_delete(void); #ifdef __cplusplus } diff --git a/SWIG/Source/Swig/cwrap.c b/SWIG/Source/Swig/cwrap.c index c957a6d29..ce6a79167 100644 --- a/SWIG/Source/Swig/cwrap.c +++ b/SWIG/Source/Swig/cwrap.c @@ -87,7 +87,7 @@ Swig_clocal(SwigType *t, const String_or_char *name, const String_or_char *value Delete(lstrn); } else { String *lstrname = SwigType_lstr(t,name); - Printf(decl,"%s", lstrname); + Append(decl,lstrname); Delete(lstrname); } } @@ -156,34 +156,19 @@ Swig_wrapped_var_assign(SwigType *t, const String_or_char *name) { * argument behaviour is required. * ----------------------------------------------------------------------------- */ int Swig_cargs(Wrapper *w, ParmList *p) { - int i; - SwigType *pt; - String *pvalue; - String *pname; - String *local; - String *lname; - SwigType *altty; - String *type; - int tycode; - int compactdefargs = ParmList_is_compactdefargs(p); - - i = 0; + int i = 0; + int compactdefargs = ParmList_is_compactdefargs(p); while (p != 0) { - lname = Swig_cparm_name(p,i); - pt = Getattr(p,"type"); + String *lname = Swig_cparm_name(p,i); + SwigType *pt = Getattr(p,"type"); if ((SwigType_type(pt) != T_VOID)) { - pname = Getattr(p,"name"); - + String *local = 0; + String *type = Getattr(p,"type"); /* default values only emitted if in compact default args mode */ - if (compactdefargs) - pvalue = Getattr(p,"value"); - else - pvalue = 0; - - type = Getattr(p,"type"); - altty = SwigType_alttype(type,0); - tycode = SwigType_type(type); + String *pvalue = (compactdefargs) ? Getattr(p,"value") : 0; + SwigType *altty = SwigType_alttype(type,0); + int tycode = SwigType_type(type); if (tycode == T_REFERENCE) { if (pvalue) { SwigType *tvalue; @@ -222,8 +207,10 @@ int Swig_cargs(Wrapper *w, ParmList *p) { Delete(altty); } Wrapper_add_localv(w,lname,local,NIL); + Delete(local); i++; } + Delete(lname); p = nextSibling(p); } return(i); @@ -272,13 +259,15 @@ String *Swig_cresult(SwigType *t, const String_or_char *name, const String_or_ch { char *c = Char(decl) + Len(decl) - 1; if (!((*c == ';') || (*c == '}'))) - Printf(fcall, ";"); + Append(fcall, ";"); } - Printf(fcall,"\n"); + Append(fcall,"\n"); if (SwigType_type(t) == T_REFERENCE) { - Printf(fcall,"%s = (%s) &_result_ref;\n", name, SwigType_lstr(t,0)); - Printf(fcall,"}\n"); + String *lstr = SwigType_lstr(t,0); + Printf(fcall,"%s = (%s) &_result_ref;\n", name, lstr); + Append(fcall,"}\n"); + Delete(lstr); } return fcall; } @@ -333,9 +322,9 @@ Swig_cfunction_call(String_or_char *name, ParmList *parms) { String *rcaststr = SwigType_rcaststr(rpt, pname); if (comma) { - Printf(func, ",%s", rcaststr); + Printv(func, ",", rcaststr, NIL); } else { - Printf(func, "%s", rcaststr); + Append(func,rcaststr); } Delete(rpt); Delete(pname); @@ -369,23 +358,28 @@ Swig_cmethod_call(String_or_char *name, ParmList *parms, String_or_char *self) { SwigType *pt; int comma = 0; - if (!self) self = (char *) "(this)->"; - func = NewStringEmpty(); - nname = SwigType_namestr(name); if (!p) return func; + + if (!self) self = (char *) "(this)->"; Append(func,self); + + nname = SwigType_namestr(name); pt = Getattr(p,"type"); /* If the method is invoked through a dereferenced pointer, we don't add any casts (needed for smart pointers). Otherwise, we cast to the appropriate type */ if (Strstr(func,"*this")) { - Replaceall(func,"this", Swig_cparm_name(p,0)); + String *pname = Swig_cparm_name(p,0); + Replaceall(func,"this", pname); + Delete(pname); } else { - String *rcaststr = SwigType_rcaststr(pt, Swig_cparm_name(p,0)); + String *pname = Swig_cparm_name(p,0); + String *rcaststr = SwigType_rcaststr(pt, pname); Replaceall(func,"this", rcaststr); Delete(rcaststr); + Delete(pname); } /* @@ -407,9 +401,10 @@ Swig_cmethod_call(String_or_char *name, ParmList *parms, String_or_char *self) { if ((SwigType_type(pt) != T_VOID)) { String *pname = Swig_cparm_name(p,i); String *rcaststr = SwigType_rcaststr(pt, pname); - if (comma) Printf(func,","); - Printf(func,"%s", rcaststr); + if (comma) Append(func,","); + Append(func,rcaststr); Delete(rcaststr); + Delete(pname); comma = 1; i++; } @@ -464,10 +459,11 @@ Swig_cppconstructor_base_call(String_or_char *name, ParmList *parms, int skip_se func = NewStringEmpty(); Printf(func,"new %s(", nname); while (p) { - String *pname; pt = Getattr(p,"type"); if ((SwigType_type(pt) != T_VOID)) { - if (comma) Printf(func,","); + String *rcaststr = 0; + String *pname = 0; + if (comma) Append(func,","); if (!Getattr(p, "arg:byname")) { pname = Swig_cparm_name(p,i); i++; @@ -477,12 +473,15 @@ Swig_cppconstructor_base_call(String_or_char *name, ParmList *parms, int skip_se else pname = Copy(Getattr(p, "name")); } - Printf(func,"%s", SwigType_rcaststr(pt, pname)); - comma = 1; + rcaststr = SwigType_rcaststr(pt, pname); + Append(func,rcaststr); + Delete(rcaststr); + comma = 1; + Delete(pname); } p = nextSibling(p); } - Printf(func,")"); + Append(func,")"); Delete(nname); return func; } @@ -567,9 +566,11 @@ Swig_unref_call(Node *n) { Node *cn = Swig_methodclass(n); String* unref = Swig_rflag_search(cn,"feature:unref","feature:nounref"); if (unref) { + String *pname = Swig_cparm_name(0,0); unref = NewString(unref); - Replaceall(unref,"$this",Swig_cparm_name(0,0)); - Replaceall(unref,"$self",Swig_cparm_name(0,0)); + Replaceall(unref,"$this",pname); + Replaceall(unref,"$self",pname); + Delete(pname); } return unref; } @@ -603,9 +604,15 @@ Swig_ref_call(Node *n, const String* lname) { String * Swig_cdestructor_call(Node *n) { String* unref = Swig_unref_call(n); - if (unref) return unref; - return NewStringf("free((char *) %s);",Swig_cparm_name(0,0)); + if (unref) { + return unref; + } else { + String *pname = Swig_cparm_name(0,0); + String *call = NewStringf("free((char *) %s);",pname); + Delete(pname); + return call; + } } @@ -620,9 +627,14 @@ Swig_cdestructor_call(Node *n) { String * Swig_cppdestructor_call(Node *n) { String* unref = Swig_unref_call(n); - if (unref) return unref; - - return NewStringf("delete %s;",Swig_cparm_name(0,0)); + if (unref) { + return unref; + } else { + String *pname = Swig_cparm_name(0,0); + String *call = NewStringf("delete %s;",pname); + Delete(pname); + return call; + } } /* ----------------------------------------------------------------------------- @@ -637,20 +649,25 @@ Swig_cppdestructor_call(Node *n) { String * Swig_cmemberset_call(String_or_char *name, SwigType *type, String_or_char *self) { String *func; + String *pname0 = Swig_cparm_name(0,0); + String *pname1 = Swig_cparm_name(0,1); func = NewStringEmpty(); if (!self) self = NewString("(this)->"); else self = NewString(self); - Replaceall(self,"this",Swig_cparm_name(0,0)); + Replaceall(self,"this",pname0); if (SwigType_type(type) != T_ARRAY) { if (!Strstr(type,"enum $unnamed")) { - Printf(func,"if (%s) %s%s = %s",Swig_cparm_name(0,0), self,name, - Swig_wrapped_var_deref(type, Swig_cparm_name(0,1))); + String *dref = Swig_wrapped_var_deref(type, pname1); + Printf(func,"if (%s) %s%s = %s",pname0, self,name,dref); + Delete(dref); } else { Printf(func,"if (%s && sizeof(int) == sizeof(%s%s)) *(int*)(void*)&(%s%s) = %s", - Swig_cparm_name(0,0), self, name, self, name, Swig_cparm_name(0,1)); + pname0, self, name, self, name, pname1); } } Delete(self); + Delete(pname0); + Delete(pname1); return(func); } @@ -668,12 +685,17 @@ String * Swig_cmemberget_call(const String_or_char *name, SwigType *t, String_or_char *self) { String *func; + String *call; + String *pname0 = Swig_cparm_name(0,0); if (!self) self = NewString("(this)->"); else self = NewString(self); - Replaceall(self,"this",Swig_cparm_name(0,0)); + Replaceall(self,"this",pname0); func = NewStringEmpty(); - Printf(func,"%s (%s%s)", Swig_wrapped_var_assign(t,""),self, name); + call = Swig_wrapped_var_assign(t,""); + Printf(func,"%s (%s%s)", call,self, name); Delete(self); + Delete(call); + Delete(pname0); return func; } @@ -783,10 +805,10 @@ Swig_MethodToFunction(Node *n, String *classname, int flags) { /* Generate action code for the access */ if (!(flags & CWRAP_EXTEND)) { String *call = Swig_cmethod_call(name,p,self); - String *result = Swig_cresult(Getattr(n,"type"),"result", call); - Setattr(n,"wrap:action", result); + String *cres = Swig_cresult(Getattr(n,"type"),"result", call); + Setattr(n,"wrap:action", cres); Delete(call); - Delete(result); + Delete(cres); } else { /* Methods with default arguments are wrapped with additional methods for each default argument, * however, only one extra %extend method is generated. */ @@ -816,10 +838,14 @@ Swig_MethodToFunction(Node *n, String *classname, int flags) { int i = 0; Parm *pp = p; String *func = NewStringf("%s(", mangled); + String *cres; + if (Cmp(Getattr(n,"storage"),"static") != 0) { - String *fadd = NewStringf("(%s*)(%s)->operator ->()", cname, Swig_cparm_name(pp,i)); + String *pname = Swig_cparm_name(pp,i); + String *fadd = NewStringf("(%s*)(%s)->operator ->()", cname, pname); Append(func,fadd); Delete(fadd); + Delete(pname); pp = nextSibling(pp); if (pp) Append(func,","); } else{ @@ -839,9 +865,15 @@ Swig_MethodToFunction(Node *n, String *classname, int flags) { } } Append(func,")"); - Setattr(n,"wrap:action", Swig_cresult(Getattr(n,"type"),"result", func)); + cres = Swig_cresult(Getattr(n,"type"),"result", func); + Setattr(n,"wrap:action", cres); + Delete(cres); } else { - Setattr(n,"wrap:action", Swig_cresult(Getattr(n,"type"),"result", Swig_cfunction_call(mangled,p))); + String *call = Swig_cfunction_call(mangled,p); + String *cres = Swig_cresult(Getattr(n,"type"),"result", call); + Setattr(n,"wrap:action", cres); + Delete(call); + Delete(cres); } Delete(membername); @@ -962,7 +994,8 @@ Swig_ConstructorToFunction(Node *n, String *classname, if (flags & CWRAP_EXTEND) { /* Constructors with default arguments are wrapped with additional constructor methods for each default argument, * however, only one extra %extend method is generated. */ - + String *call; + String *cres; String *defaultargs = Getattr(n,"defaultargs"); String *code = Getattr(n,"code"); String *membername = Swig_name_construct(classname); @@ -979,9 +1012,12 @@ Swig_ConstructorToFunction(Node *n, String *classname, if (!defaultargs && code) { Swig_add_extension_code(n, mangled, parms, type, code, cparse_cplusplus); } - - Setattr(n,"wrap:action", Swig_cresult(type,"result", Swig_cfunction_call(mangled,parms))); - + + call = Swig_cfunction_call(mangled,parms); + cres = Swig_cresult(type,"result", call); + Setattr(n,"wrap:action", cres); + Delete(cres); + Delete(call); Delete(membername); Delete(mangled); } else { @@ -1009,7 +1045,9 @@ Swig_ConstructorToFunction(Node *n, String *classname, * implemented in the target language, calls to those methods will * generate Swig::DirectorPureVirtualException exceptions. */ - Append(action, Swig_cresult(type, "result", director_call)); + String *cres = Swig_cresult(type, "result", director_call); + Append(action, cres); + Delete(cres); } else { /* (scottm): The code for creating a new director is now a string template that gets passed in via the director_ctor argument. @@ -1018,22 +1056,35 @@ Swig_ConstructorToFunction(Node *n, String *classname, $director_new: Call new for director class $nondirector_new: Call new for non-director class */ + String *cres; Append(action, director_ctor); Replaceall( action, "$comparison", tmp_none_comparison); - Replaceall( action, "$director_new", - Swig_cresult(type, "result", director_call) ); - Replaceall( action, "$nondirector_new", - Swig_cresult(type, "result", nodirector_call) ); + + cres = Swig_cresult(type, "result", director_call); + Replaceall( action, "$director_new",cres); + Delete(cres); + + cres = Swig_cresult(type, "result", nodirector_call); + Replaceall( action, "$nondirector_new", cres); + Delete(cres); } Setattr(n, "wrap:action", action); Delete(tmp_none_comparison); Delete(action); Delete(directorname); } else { - Setattr(n,"wrap:action", Swig_cresult(type,"result", Swig_cppconstructor_call(classname,parms))); + String *call = Swig_cppconstructor_call(classname,parms); + String *cres = Swig_cresult(type,"result", call); + Setattr(n,"wrap:action", cres); + Delete(cres); + Delete(call); } } else { - Setattr(n,"wrap:action", Swig_cresult(type,"result", Swig_cconstructor_call(classname))); + String *call = Swig_cconstructor_call(classname); + String *cres = Swig_cresult(type,"result", call); + Setattr(n,"wrap:action", cres); + Delete(cres); + Delete(call); } } Setattr(n,"type",type); @@ -1065,6 +1116,8 @@ Swig_DestructorToFunction(Node *n, String *classname, int cplus, int flags) type = NewString("void"); if (flags & CWRAP_EXTEND) { + String *cres; + String *call; String *membername, *mangled, *code; membername = Swig_name_destroy(classname); mangled = Swig_name_mangle(membername); @@ -1072,14 +1125,26 @@ Swig_DestructorToFunction(Node *n, String *classname, int cplus, int flags) if (code) { Swig_add_extension_code(n, mangled, p, type, code, cparse_cplusplus); } - Setattr(n,"wrap:action", NewStringf("%s;\n", Swig_cfunction_call(mangled,p))); + call = Swig_cfunction_call(mangled,p); + cres = NewStringf("%s;\n", call); + Setattr(n,"wrap:action", cres); Delete(membername); Delete(mangled); + Delete(call); + Delete(cres); } else { if (cplus) { - Setattr(n,"wrap:action", NewStringf("%s\n",Swig_cppdestructor_call(n))); + String *call = Swig_cppdestructor_call(n); + String *cres = NewStringf("%s\n",call); + Setattr(n,"wrap:action", cres); + Delete(call); + Delete(cres); } else { - Setattr(n,"wrap:action", NewStringf("%s\n", Swig_cdestructor_call(n))); + String *call = Swig_cdestructor_call(n); + String *cres = NewStringf("%s\n", call); + Setattr(n,"wrap:action", cres); + Delete(call); + Delete(cres); } } Setattr(n,"type",type); @@ -1107,6 +1172,8 @@ Swig_MembersetToFunction(Node *n, String *classname, int flags) { String *membername; String *mangled; String *self= 0; + String *sname; + varref = flags & CWRAP_VAR_REFERENCE; if (flags & CWRAP_SMART_POINTER) { @@ -1116,7 +1183,8 @@ Swig_MembersetToFunction(Node *n, String *classname, int flags) { name = Getattr(n,"name"); type = Getattr(n,"type"); - membername = Swig_name_member(classname, Swig_name_set(name)); + sname = Swig_name_set(name); + membername = Swig_name_member(classname, sname); mangled = Swig_name_mangle(membername); t = NewString(classname); @@ -1135,13 +1203,23 @@ Swig_MembersetToFunction(Node *n, String *classname, int flags) { Delete(p); if (flags & CWRAP_EXTEND) { + String *call; + String *cres; String *code = Getattr(n,"code"); if (code) { Swig_add_extension_code(n, mangled, parms, void_type, code, cparse_cplusplus); } - Setattr(n,"wrap:action", NewStringf("%s;\n", Swig_cfunction_call(mangled,parms))); + call = Swig_cfunction_call(mangled,parms); + cres = NewStringf("%s;\n", call); + Setattr(n,"wrap:action", cres); + Delete(call); + Delete(cres); } else { - Setattr(n,"wrap:action", NewStringf("%s;\n", Swig_cmemberset_call(name,type,self))); + String *call = Swig_cmemberset_call(name,type,self); + String *cres = NewStringf("%s;\n", call); + Setattr(n,"wrap:action", cres); + Delete(call); + Delete(cres); } Setattr(n,"type",void_type); Setattr(n,"parms", parms); @@ -1149,6 +1227,7 @@ Swig_MembersetToFunction(Node *n, String *classname, int flags) { Delete(ty); Delete(void_type); Delete(membername); + Delete(sname); Delete(mangled); Delete(self); varref = 0; @@ -1171,6 +1250,7 @@ Swig_MembergetToFunction(Node *n, String *classname, int flags) { String *membername; String *mangled; String *self = 0; + String *gname; varref = flags & CWRAP_VAR_REFERENCE; if (flags & CWRAP_SMART_POINTER) { @@ -1185,8 +1265,9 @@ Swig_MembergetToFunction(Node *n, String *classname, int flags) { name = Getattr(n,"name"); type = Getattr(n,"type"); - - membername = Swig_name_member(classname, Swig_name_get(name)); + + gname = Swig_name_get(name); + membername = Swig_name_member(classname, gname); mangled = Swig_name_mangle(membername); t = NewString(classname); @@ -1196,19 +1277,31 @@ Swig_MembergetToFunction(Node *n, String *classname, int flags) { ty = Swig_wrapped_var_type(type); if (flags & CWRAP_EXTEND) { + String *call; + String *cres; + String *code = Getattr(n,"code"); if (code) { Swig_add_extension_code(n, mangled, parms, ty, code, cparse_cplusplus); } - Setattr(n,"wrap:action", Swig_cresult(ty,"result",Swig_cfunction_call(mangled,parms))); + call = Swig_cfunction_call(mangled,parms); + cres = Swig_cresult(ty,"result",call); + Setattr(n,"wrap:action", cres); + Delete(cres); + Delete(call); } else { - Setattr(n,"wrap:action", Swig_cresult(ty,"result",Swig_cmemberget_call(name,type,self))); + String *call = Swig_cmemberget_call(name,type,self); + String *cres = Swig_cresult(ty,"result",call); + Setattr(n,"wrap:action", cres); + Delete(call); + Delete(cres); } Setattr(n,"type",ty); Setattr(n,"parms", parms); Delete(parms); Delete(ty); Delete(membername); + Delete(gname); Delete(mangled); varref = 0; return SWIG_OK; @@ -1236,9 +1329,18 @@ Swig_VarsetToFunction(Node *n) { Delete(ty); if (!Strstr(type,"enum $unnamed")) { - Setattr(n,"wrap:action", NewStringf("%s = %s;\n", nname, Swig_wrapped_var_deref(type,Swig_cparm_name(0,0)))); + String *pname = Swig_cparm_name(0,0); + String *dref = Swig_wrapped_var_deref(type,pname); + String *call = NewStringf("%s = %s;\n", nname, dref); + Setattr(n,"wrap:action", call); + Delete(call); + Delete(dref); + Delete(pname); } else { - Setattr(n,"wrap:action", NewStringf("if (sizeof(int) == sizeof(%s)) *(int*)(void*)&(%s) = %s;\n", nname, nname, Swig_cparm_name(0,0))); + String *pname = Swig_cparm_name(0,0); + String *call = NewStringf("if (sizeof(int) == sizeof(%s)) *(int*)(void*)&(%s) = %s;\n", nname, nname, pname); + Setattr(n,"wrap:action", call); + Delete(call); } Setattr(n,"type","void"); Setattr(n,"parms",parms); @@ -1255,6 +1357,7 @@ Swig_VarsetToFunction(Node *n) { int Swig_VargetToFunction(Node *n) { + String *cres, *call; String *name, *nname; SwigType *type, *ty; @@ -1263,8 +1366,11 @@ Swig_VargetToFunction(Node *n) { nname = SwigType_namestr(name); ty = Swig_wrapped_var_type(type); - - Setattr(n,"wrap:action", Swig_cresult(ty,"result",Swig_wrapped_var_assign(type,nname))); + call = Swig_wrapped_var_assign(type,nname); + cres = Swig_cresult(ty,"result",call); + Setattr(n,"wrap:action", cres); + Delete(cres); + Delete(call); Setattr(n,"type",ty); Delattr(n,"parms"); Delete(nname); diff --git a/SWIG/Source/Swig/include.c b/SWIG/Source/Swig/include.c index 189440876..72dadf40b 100644 --- a/SWIG/Source/Swig/include.c +++ b/SWIG/Source/Swig/include.c @@ -68,15 +68,19 @@ Swig_swiglib_get() { * Adds a directory to the SWIG search path. * ----------------------------------------------------------------------------- */ -void +List * Swig_add_directory(const String_or_char *dirname) { String *dir = 0; if (!directories) directories = NewList(); assert(directories); - dir = NewString((char *) dirname); - assert(dir); - Setattr(dir,"sysdir","1"); - Append(directories, dir); + if (dirname) { + dir = NewString((char *) dirname); + assert(dir); + Setattr(dir,"sysdir","1"); + Append(directories, dir); + Delete(dir); + } + return directories; } diff --git a/SWIG/Source/Swig/naming.c b/SWIG/Source/Swig/naming.c index fb6070c4c..90bdc4314 100644 --- a/SWIG/Source/Swig/naming.c +++ b/SWIG/Source/Swig/naming.c @@ -537,10 +537,13 @@ Swig_name_object_inherit(Hash *namehash, String *base, String *derived) { if (!newh) { newh = NewHash(); Setattr(namehash,nkey,newh); + Delete(newh); } for (oi = First(n); oi.key; oi = Next(oi)) { if (!Getattr(newh,oi.key)) { - Setattr(newh,oi.key,Copy(oi.item)); + String *ci = Copy(oi.item); + Setattr(newh,oi.key,ci); + Delete(ci); } } } @@ -700,8 +703,10 @@ Swig_feature_set(Hash *features, const String_or_char *name, SwigType *decl, con } else { fhash = Getattr(n,decl); if (!fhash) { + String *cdecl = Copy(decl); fhash = NewHash(); - Setattr(n,Copy(decl),fhash); + Setattr(n,cdecl,fhash); + Delete(cdecl); Delete(fhash); } } diff --git a/SWIG/Source/Swig/stype.c b/SWIG/Source/Swig/stype.c index 0806210a7..de10b4cae 100644 --- a/SWIG/Source/Swig/stype.c +++ b/SWIG/Source/Swig/stype.c @@ -355,7 +355,7 @@ void SwigType_add_default(String *def, SwigType *nr) SwigType *SwigType_default(SwigType *t) { - String *r1, *def; + String *r1, *def, *cdef; String *r = 0; char *cr; @@ -440,10 +440,10 @@ SwigType *SwigType_default(SwigType *t) { #ifdef SWIG_NEW_TYPE_DEFAULT SwigType_del_array(nr); SwigType_add_default(def, nr); - Delete(nr); #else Append(def,"SWIGTYPE"); #endif + Delete(nr); } } else if (SwigType_ismemberpointer(r)) { if (strcmp(cr,"m(CLASS).SWIGTYPE") == 0) { @@ -469,7 +469,9 @@ SwigType *SwigType_default(SwigType *t) { if (r != t) Delete(r); #ifdef SWIG_DEFAULT_CACHE /* The cache produces strange results, see enum_template.i case */ - Setattr(default_cache,t,Copy(def)); + cdef = Copy(def); + Setattr(default_cache,t, cdef); + Delete(cdef); #endif if (StringEqual(def,t)) { Delete(def); @@ -1055,6 +1057,7 @@ SwigType_typename_replace(SwigType *t, String *pat, String *rep) { } Clear(t); Append(t,nt); + Delete(nt); Delete(elem); } diff --git a/SWIG/Source/Swig/swig.h b/SWIG/Source/Swig/swig.h index d2c005fb1..eae21988c 100644 --- a/SWIG/Source/Swig/swig.h +++ b/SWIG/Source/Swig/swig.h @@ -97,7 +97,7 @@ typedef DOH SwigType; /* --- File interface --- */ -extern void Swig_add_directory(const String_or_char *dirname); +extern List *Swig_add_directory(const String_or_char *dirname); extern void Swig_push_directory(const String_or_char *dirname); extern void Swig_pop_directory(); extern String *Swig_last_file(); diff --git a/SWIG/Source/Swig/symbol.c b/SWIG/Source/Swig/symbol.c index a5ed56fd0..dc19c0c9a 100644 --- a/SWIG/Source/Swig/symbol.c +++ b/SWIG/Source/Swig/symbol.c @@ -277,11 +277,14 @@ Swig_symbol_init() { ccurrent = NewHash(); set_nodeType(current_symtab,k_symboltable); Setattr(current_symtab,k_symtab,current); + Delete(current); Setattr(current_symtab,k_csymtab, ccurrent); + Delete(ccurrent); /* Set the global scope */ symtabs = NewHash(); Setattr(symtabs,empty_string,current_symtab); + Delete(current_symtab); global_scope = current_symtab; } @@ -378,6 +381,7 @@ Swig_symbol_newscope() set_nodeType(h,k_symboltable); Setattr(h,k_symtab,hsyms); + Delete(hsyms); set_parentNode(h,current_symtab); n = lastChild(current_symtab); @@ -390,8 +394,9 @@ Swig_symbol_newscope() current = hsyms; ccurrent = NewHash(); Setattr(h,k_csymtab,ccurrent); + Delete(ccurrent); current_symtab = h; - return current_symtab; + return h; } /* ----------------------------------------------------------------------------- @@ -473,6 +478,7 @@ void Swig_symbol_inherit(Symtab *s) { if (!inherit) { inherit = NewList(); Setattr(current_symtab,k_inherit, inherit); + Delete(inherit); } assert(s != current_symtab); for (i = 0; i < Len(inherit); i++) { diff --git a/SWIG/Source/Swig/typemap.c b/SWIG/Source/Swig/typemap.c index 34d65eb18..beb71c438 100644 --- a/SWIG/Source/Swig/typemap.c +++ b/SWIG/Source/Swig/typemap.c @@ -1101,7 +1101,7 @@ static void typemap_locals(DOHString *s, ParmList *l, Wrapper *f, int argnum) { str = NewStringEmpty(); - if (Strncmp(pn,"_global_",8) == 0) { + if (strncmp(Char(pn),"_global_",8) == 0) { isglobal = 1; } @@ -1159,7 +1159,10 @@ String *Swig_typemap_lookup(const String_or_char *op, SwigType *type, String_or_ if (!s) return 0; /* Blocked */ - if (Cmp(s,"pass") == 0) return 0; + if (Cmp(s,"pass") == 0) { + Delete(mtype); + return 0; + } s = Copy(s); /* Make a local copy of the typemap code */ @@ -1345,6 +1348,7 @@ Printf(stdout, "Swig_typemap_lookup %s [%s %s]\n", op, type, pname ? pname : "NO } sprintf(temp,"%s:%s",Char(op),Char(Getattr(kw,k_name))); Setattr(node,tmop_name(temp), value); + Delete(value); kw = nextSibling(kw); } @@ -1400,13 +1404,15 @@ Swig_typemap_attach_kwargs(Hash *tm, const String_or_char *op, Parm *p) { String *type = Getattr(kw,k_type); if (type) { Hash *v = NewHash(); - Setattr(v,k_value,value); Setattr(v,k_type,type); + Setattr(v,k_value,value); + Delete(value); value = v; } Clear(temp); Printf(temp,"%s:%s",op,Getattr(kw,k_name)); Setattr(p,tmop_name(temp),value); + Delete(value); kw = nextSibling(kw); } Delete(temp); diff --git a/SWIG/Source/Swig/typesys.c b/SWIG/Source/Swig/typesys.c index fe17b9f48..f72675b02 100644 --- a/SWIG/Source/Swig/typesys.c +++ b/SWIG/Source/Swig/typesys.c @@ -794,7 +794,7 @@ SwigType *SwigType_typedef_resolve(SwigType *t) { String *key = NewString(t); if (r) { SwigType *r1; - Setattr(typedef_resolve_cache,key,r); + Setattr(typedef_resolve_cache,key,r); Setmeta(r,k_scope,resolved_scope); r1 = Copy(r); Delete(r);