diff --git a/Source/CParse/cparse.h b/Source/CParse/cparse.h index 1fbb28d4c..cf52c56a1 100644 --- a/Source/CParse/cparse.h +++ b/Source/CParse/cparse.h @@ -43,8 +43,6 @@ extern int yylex(); /* parser.y */ extern SwigType *Swig_cparse_type(String *); extern Node *Swig_cparse(File *); -extern String *Swig_cparse_name_warning(Node *n, String *prefix, String *name,SwigType *decl); -extern String *Swig_cparse_symbol_name(Node *n,String *prefix, String *name, SwigType *decl, String *oldname); extern Hash *Swig_cparse_features(); extern void SWIG_cparse_set_compact_default_args(int defargs); extern int SWIG_cparse_template_reduce(int treduce); @@ -52,10 +50,7 @@ extern int SWIG_cparse_template_reduce(int treduce); /* util.c */ extern void Swig_cparse_replace_descriptor(String *s); extern void cparse_normalize_void(Node *); -extern int need_protected(Node *n, int dirprot_mode); extern Parm *Swig_cparse_parm(String *s); -extern int need_name_warning(Node *n); -extern int need_redefined_warn(Node* a, Node* b, int InClass); /* templ.c */ @@ -67,5 +62,14 @@ extern void Swig_cparse_debug_templates(int); } #endif +#define SWIG_WARN_NODE_BEGIN(Node) \ + { \ + String *wrnfilter = Node ? Getattr(Node,"feature:warnfilter") : 0; \ + if (wrnfilter) Swig_warnfilter(wrnfilter,1) + +#define SWIG_WARN_NODE_END(Node) \ + if (wrnfilter) Swig_warnfilter(wrnfilter,0); \ + } + #endif diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index cffd03ef3..5050a2516 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -54,7 +54,6 @@ static char *last_cpptype = 0; static int inherit_list = 0; static Parm *template_parameters = 0; static int extendmode = 0; -static int dirprot_mode = 0; static int compact_default_args = 0; static int template_reduce = 0; static int cparse_externc = 0; @@ -63,14 +62,6 @@ static int cparse_externc = 0; * Assist Functions * ----------------------------------------------------------------------------- */ -#define SWIG_WARN_NODE_BEGIN(Node) \ - { \ - String *wrnfilter = Node ? Getattr(Node,"feature:warnfilter") : 0; \ - if (wrnfilter) Swig_warnfilter(wrnfilter,1) - -#define SWIG_WARN_NODE_END(Node) \ - if (wrnfilter) Swig_warnfilter(wrnfilter,0); \ - } /* Called by the parser (yyparse) when an error is found.*/ @@ -204,41 +195,16 @@ static int promote(int t1, int t2) { static String *yyrename = 0; /* Forward renaming operator */ -static Hash *rename_hash = 0; -static Hash *namewarn_hash = 0; -static Hash *features_hash = 0; - -static List *rename_list = 0; -static List *namewarn_list = 0; static String *resolve_node_scope(String *cname); -Hash *Swig_cparse_namewarn_hash() { - if (!namewarn_hash) namewarn_hash = NewHash(); - return namewarn_hash; -} - -Hash *Swig_cparse_rename_hash() { - if (!rename_hash) rename_hash = NewHash(); - return rename_hash; -} Hash *Swig_cparse_features() { + static Hash *features_hash = 0; if (!features_hash) features_hash = NewHash(); return features_hash; } -List *Swig_cparse_namewarn_list() { - if (!namewarn_list) namewarn_list = NewList(); - return namewarn_list; -} - -List *Swig_cparse_rename_list() { - if (!rename_list) rename_list = NewList(); - return rename_list; -} - - static String *feature_identifier_fix(String *s) { if (SwigType_istemplate(s)) { String *tp, *ts, *ta, *tq; @@ -257,317 +223,20 @@ static String *feature_identifier_fix(String *s) { } } -static void -Swig_cparse_add_name_object(Hash *name_hash, List *name_list, - String *prefix, const char *name, SwigType *decl, Hash *nameobj) { - String *nname = 0; - - if (name && Len(name)) { - String *target_fmt = Getattr(nameobj,"target_fmt"); - nname = prefix ? NewStringf("%s::%s",prefix, name) : NewString(name); - if (target_fmt) { - String *tmp = NewStringf(Getattr(nameobj,"target_fmt"), nname); - Delete(nname); - nname = tmp; - } - } - - if (!nname || !Len(nname) || Getattr(nameobj,"source_fmt")) { - if (decl) Setattr(nameobj,"decl", decl); - if (nname && Len(nname)) Setattr(nameobj,"target_name", nname); - Append(name_list, nameobj); - } else { - Swig_name_object_set(name_hash,nname,decl,nameobj); - } - Delete(nname); -} - - -static void single_rename_add(const char *name, SwigType *decl, Hash *newname) { - Swig_cparse_add_name_object(Swig_cparse_rename_hash(), Swig_cparse_rename_list(), - Namespaceprefix, name, decl, newname); -} - - -static void Swig_name_object_attach_keys(const char *keys[], Hash *nameobj) -{ - Node *kw = nextSibling(nameobj); - while (kw) { - Node *next = nextSibling(kw); - String *kname = Getattr(kw,"name"); - char *ckey = kname ? Char(kname) : 0; - if (ckey) { - const char **rkey; - for (rkey = keys; *rkey != 0; ++rkey) { - if (strcmp(ckey,*rkey) == 0) { - Setattr(nameobj, *rkey, Getattr(kw,"value")); - deleteNode(kw); - } - } - } - kw = next; - } -} - -/* Add a new rename. Works much like new_feature including default argument handling. */ -static void rename_add(const char *name, SwigType *decl, Hash *newname, ParmList *declaratorparms) { - - ParmList *declparms = declaratorparms; - - const char *rename_keys[] = {"fullname", "source_fmt", "target_fmt", 0}; - Swig_name_object_attach_keys(rename_keys, newname); - - /* Add the name */ - single_rename_add(name, decl, newname); - - /* Add extra names if there are default parameters in the parameter list */ - if (decl) { - int constqualifier = SwigType_isconst(decl); - while (declparms) { - if (ParmList_has_defaultargs(declparms)) { - - /* Create a parameter list for the new rename by copying all - but the last (defaulted) parameter */ - ParmList* newparms = ParmList_copy_all_except_last_parm(declparms); - - /* Create new declaration - with the last parameter removed */ - SwigType *newdecl = Copy(decl); - Delete(SwigType_pop_function(newdecl)); /* remove the old parameter list from newdecl */ - SwigType_add_function(newdecl,newparms); - if (constqualifier) - SwigType_add_qualifier(newdecl,"const"); - - single_rename_add(name, newdecl, newname); - declparms = newparms; - Delete(newdecl); - } else { - declparms = 0; - } - } - } -} - -static void namewarn_add(const char *name, SwigType *decl, Hash *namewrn) { - const char *namewrn_keys[] = {"rename", "error", "fullname", "source_fmt", "target_fmt", 0}; - Swig_name_object_attach_keys(namewrn_keys, namewrn); - Swig_cparse_add_name_object(Swig_cparse_namewarn_hash(), Swig_cparse_namewarn_list(), - Namespaceprefix, name, decl, namewrn); -} - -static void rename_inherit(String *base, String *derived) { - /* Printf(stdout,"base = '%s', derived = '%s'\n", base, derived); */ - Swig_name_object_inherit(Swig_cparse_rename_hash(),base,derived); - Swig_name_object_inherit(Swig_cparse_namewarn_hash(),base,derived); - Swig_name_object_inherit(features_hash,base,derived); -} - /* Generate the symbol table name for an object */ /* This is a bit of a mess. Need to clean up */ static String *add_oldname = 0; -DOH *Swig_node_getattr(Node *n, const char *cattr) -{ - const char *rattr = strstr(cattr,"$"); - if (rattr) { - String *nattr = NewStringWithSize(cattr, rattr-cattr); - Node *rn = Getattr(n,nattr); - if (rn) { - DOH *res = Swig_node_getattr(rn, rattr + 1); - Delete(nattr); - return res; - } else { - return 0; - } - } else { - return Getattr(n,cattr); - } -} - -int Swig_cparse_match(Hash *rn, Node *n) { - int match = 1; - Node *kw = nextSibling(rn); - while (match && kw) { - String *key = Getattr(kw,"name"); - char *ckey = key ? Char(key) : 0; - if (ckey && (strncmp(ckey,"match",5) == 0)) { - match = 0; - if (n) { - const char *csep = strstr(ckey,"$"); - const char *cattr = csep ? csep + 1 : "nodeType"; - String *nval = Swig_node_getattr(n,cattr); - String *kwval = Getattr(kw,"value"); - if (nval && Equal(nval, kwval)) { - match = 1; - } - } - } - kw = nextSibling(kw); - } - return match; -} - -Hash *Swig_cparse_name_object(List *namelist, Node *n, String *prefix, String *name, String *decl) { - Hash *res = 0; - if (namelist) { - int len = Len(namelist); - int i; - int match = 0; - for (i = 0; !match && (i < len); i++) { - Hash *rn = Getitem(namelist,i); - String *rdecl = Getattr(rn,"decl"); - if (rdecl && (!decl || !Equal(rdecl,decl))) { - continue; - } else { - String *tname = Getattr(rn,"target_name"); - String *sfmt = Getattr(rn,"source_fmt"); - String *sname = 0; - int fullname = GetFlag(namelist,"fullname"); - if (sfmt) { - if (fullname && prefix) { - sname = NewStringf(sfmt, prefix, name); - } else { - sname = NewStringf(sfmt, name); - } - } else { - if (fullname && prefix) { - sname = NewStringf("%s::%s", prefix, name); - } else { - sname = NewString(name); - } - } - match = (!tname || Equal(sname,tname)) && Swig_cparse_match(rn, n); - Delete(sname); - } - if (match) { - res = rn; - break; - } - } - } - return res; -} - -/* Return the node name when it requires to emit a name warning */ -Hash *Swig_cparse_warning_object(Node *n, String *prefix, String *name,SwigType *decl) { - if (n) { - /* Return in the obvious cases */ - if (!Swig_cparse_namewarn_hash() || !name || !need_name_warning(n)) { - return 0; - } else { - String *access = Getattr(n,"access"); - int is_public = !access || (Strcmp(access,"public") == 0); - if (!is_public && !need_protected(n,dirprot_mode)) { - return 0; - } - } - } - if (name) { - /* Check to see if the name is in the hash */ - Hash *wrn = Swig_name_object_get(Swig_cparse_namewarn_hash(),prefix,name,decl); - if (!wrn || !Swig_cparse_match(wrn, n)) { - wrn = Swig_cparse_name_object(Swig_cparse_namewarn_list(), n, prefix, name, decl); - } - if (wrn && Getattr(wrn,"error")) { - if (n) { - Swig_error(Getfile(n), Getline(n), "%s\n", Getattr(wrn,"name")); - } else { - Swig_error(cparse_file, cparse_line,"%s\n", Getattr(wrn,"name")); - } - } - return wrn; - } else { - return 0; - } -} - -String *Swig_cparse_name_warning(Node *n, String *prefix, String *name,SwigType *decl) { - Hash *wrn = Swig_cparse_warning_object(n, prefix, name,decl); - return (name && wrn) ? Getattr(wrn,"name") : 0; -} -/* Create a name applying rename/namewarn if needed */ -String *apply_rename(String *newname, int fullname, String *prefix, String *name) -{ - String *result = 0; - if (newname) { - if (Strcmp(newname,"$ignore") == 0) { - result = Copy(newname); - } else { - int destructor = name && (*(Char(name)) == '~'); - String *fmt = newname; - String *tmp = 0; - if (destructor && (*(Char(newname)) != '~')) { - fmt = tmp = NewStringf("~%s", newname); - } - /* use name as a fmt, but avoid C++ "%" and "%=" operators */ - if (Len(newname) > 1 && strstr(Char(newname),"%") && !Equal(newname,"%=")) { - if (fullname && prefix) { - result = NewStringf(fmt,prefix,name); - } else { - result = NewStringf(fmt,name); - } - } else { - result = Copy(newname); - } - if (tmp) Delete(tmp); - } - } - return result; -} - -String * -Swig_cparse_symbol_name(Node *n, String *prefix, String *name, SwigType *decl, String *oldname) { - String *nname = 0; - String *result = 0; - Hash *wrn = 0; - - Hash *rn = Swig_name_object_get(Swig_cparse_rename_hash(), prefix, name, decl); - if (!rn || !Swig_cparse_match(rn,n)) { - rn = Swig_cparse_name_object(Swig_cparse_rename_list(), n, prefix, name, decl); - } - if (rn) { - String *newname = Getattr(rn,"name"); - int fullname = GetFlag(rn,"fullname"); - result = apply_rename(newname, fullname, prefix, name); - } - - nname = result ? result : name; - wrn = Swig_cparse_warning_object(n, prefix, nname, decl); - if (wrn) { - String *rename = Getattr(wrn,"rename"); - if (rename) { - String *msg = Getattr(wrn,"name"); - int fullname = GetFlag(wrn,"fullname"); - if (result) Delete(result); - result = apply_rename(rename, fullname, prefix, name); - if ((msg) && (Len(msg))) { - if (n) { - SWIG_WARN_NODE_BEGIN(n); - Swig_warning(0,Getfile(n), Getline(n), "%s\n", msg); - SWIG_WARN_NODE_END(n); - } else { - Swig_warning(0,Getfile(name),Getline(name), "%s\n", msg); - } - } - } - } - - if (!result || !Len(result)) { - if (result) Delete(result); - result = oldname ? Copy(oldname): Copy(name); - } - return result; -} static String *make_name(Node *n, String *name,SwigType *decl) { - String *origname = name; int destructor = name && (*(Char(name)) == '~'); if (yyrename) { String *s = (yyrename); yyrename = 0; - if (destructor) { + if (destructor && (*(Char(s)) != '~')) { Insert(s,0,"~"); } return s; @@ -575,11 +244,7 @@ static String *make_name(Node *n, String *name,SwigType *decl) { if (!name) return 0; /* Check to see if the name is in the hash */ - if (!rename_hash) { - if (add_oldname) return Copy(add_oldname); - return Copy(origname); - } - return Swig_cparse_symbol_name(n,Namespaceprefix,name,decl,add_oldname); + return Swig_name_make(n,Namespaceprefix,name,decl,add_oldname); } /* Generate an unnamed identifier */ @@ -661,13 +326,13 @@ static void add_symbols(Node *n) { int only_csymbol = 1; if (cplus_mode == CPLUS_PROTECTED) { Setattr(n,"access", "protected"); - only_csymbol = !need_protected(n, dirprot_mode); + only_csymbol = !Swig_need_protected(n); } else { /* private are needed only when they are pure virtuals */ Setattr(n,"access", "private"); if ((Cmp(Getattr(n,"storage"),"virtual") == 0) && (Cmp(Getattr(n,"value"),"0") == 0)) { - only_csymbol = !need_protected(n, dirprot_mode); + only_csymbol = !Swig_need_protected(n); } } if (only_csymbol) { @@ -697,17 +362,17 @@ static void add_symbols(Node *n) { symname = Copy(Getattr(n,"unnamed")); } if (symname) { - wrn = Swig_cparse_name_warning(n, Namespaceprefix, symname,0); - Swig_features_get(features_hash, Namespaceprefix, Getattr(n,"name"), 0, n); + wrn = Swig_name_warning(n, Namespaceprefix, symname,0); + Swig_features_get(Swig_cparse_features(), Namespaceprefix, Getattr(n,"name"), 0, n); } } else { SwigType *fdecl = Copy(decl); SwigType *fun = SwigType_pop_function(fdecl); symname = make_name(n, Getattr(n,"name"),fun); - wrn = Swig_cparse_name_warning(n, Namespaceprefix,symname,fun); + wrn = Swig_name_warning(n, Namespaceprefix,symname,fun); - Swig_features_get(features_hash,Namespaceprefix,Getattr(n,"name"),fun,n); + Swig_features_get(Swig_cparse_features(),Namespaceprefix,Getattr(n,"name"),fun,n); Delete(fdecl); Delete(fun); @@ -746,7 +411,7 @@ static void add_symbols(Node *n) { String *e = NewStringEmpty(); String *en = NewStringEmpty(); String *ec = NewStringEmpty(); - int redefined = need_redefined_warn(n,c,inclass); + int redefined = Swig_need_redefined_warn(n,c,inclass); if (redefined) { Printf(en,"Identifier '%s' redefined (ignored)",symname); Printf(ec,"previous definition of '%s'",symname); @@ -1083,7 +748,7 @@ static List *make_inherit_list(String *clsname, List *names) { base = NewString(n); } if (base) { - rename_inherit(base,derived); + Swig_name_inherit(base,derived); Delete(base); } } @@ -1390,7 +1055,6 @@ static void single_new_feature(const char *featurename, String *val, Hash *featu /* Printf(stdout, "single_new_feature: [%s] [%s] [%s] [%s] [%s] [%s]\n", featurename, val, declaratorid, t, ParmList_str_defaultargs(declaratorparms), qualifier); */ - if (!features_hash) features_hash = NewHash(); fname = NewStringf("feature:%s",featurename); if (declaratorid) { fixname = feature_identifier_fix(declaratorid); @@ -1411,20 +1075,20 @@ static void single_new_feature(const char *featurename, String *val, Hash *featu SwigType *decl = SwigType_pop_function(t); if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); - Swig_feature_set(features_hash, nname, decl, fname, val, featureattribs); + Swig_feature_set(Swig_cparse_features(), nname, decl, fname, val, featureattribs); Delete(nname); } else { - Swig_feature_set(features_hash, name, decl, fname, val, featureattribs); + Swig_feature_set(Swig_cparse_features(), name, decl, fname, val, featureattribs); } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); - Swig_feature_set(features_hash,nname,0,fname,val, featureattribs); + Swig_feature_set(Swig_cparse_features(),nname,0,fname,val, featureattribs); Delete(nname); } } else { /* Global feature, that is, feature not associated with any particular symbol */ - Swig_feature_set(features_hash,name,0,fname,val, featureattribs); + Swig_feature_set(Swig_cparse_features(),name,0,fname,val, featureattribs); } Delete(fname); Delete(name); @@ -2271,12 +1935,7 @@ module_directive: MODULE options idstring { if ($2) { Setattr($$,"options",$2); if (Getattr($2,"directors")) { - /* - we set dirprot_mode here to 1, just to save the - symbols. Later, the language module must decide - what to do with them. - */ - dirprot_mode = 1; + /* Wrapper_director_mode_set(1);*/ } if (Getattr($2,"templatereduce")) { template_reduce = 1; @@ -2389,9 +2048,9 @@ rename_directive : rename_namewarn declarator idstring SEMI { if (!Len(t)) t = 0; if ($1) { - rename_add($2.id,t,kws,$2.parms); + Swig_name_rename_add(Namespaceprefix,$2.id,t,kws,$2.parms); } else { - namewarn_add($2.id,t,kws); + Swig_name_namewarn_add(Namespaceprefix,$2.id,t,kws); } $$ = 0; scanner_clear_rename(); @@ -2409,33 +2068,33 @@ rename_directive : rename_namewarn declarator idstring SEMI { if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",fixname); if ($1) { - rename_add(Char(nname),decl,$3,$5.parms); + Swig_name_rename_add(Namespaceprefix, nname,decl,$3,$5.parms); } else { - namewarn_add(Char(nname),decl,$3); + Swig_name_namewarn_add(Namespaceprefix,nname,decl,$3); } Delete(nname); } else { if ($1) { - rename_add(Char(fixname),decl,$3,$5.parms); + Swig_name_rename_add(Namespaceprefix,(fixname),decl,$3,$5.parms); } else { - namewarn_add(Char(fixname),decl,$3); + Swig_name_namewarn_add(Namespaceprefix,(fixname),decl,$3); } } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",fixname); if ($1) { - rename_add(Char(nname),0,$3,$5.parms); + Swig_name_rename_add(Namespaceprefix,(nname),0,$3,$5.parms); } else { - namewarn_add(Char(nname),0,$3); + Swig_name_namewarn_add(Namespaceprefix,(nname),0,$3); } Delete(nname); } } else { if ($1) { - rename_add(Char(fixname),0,$3,$5.parms); + Swig_name_rename_add(Namespaceprefix,(fixname),0,$3,$5.parms); } else { - namewarn_add(Char(fixname),0,$3); + Swig_name_namewarn_add(Namespaceprefix,(fixname),0,$3); } } $$ = 0; @@ -2443,9 +2102,9 @@ rename_directive : rename_namewarn declarator idstring SEMI { } | rename_namewarn LPAREN kwargs RPAREN string SEMI { if ($1) { - rename_add($5,0,$3,0); + Swig_name_rename_add(Namespaceprefix,$5,0,$3,0); } else { - namewarn_add($5,0,$3); + Swig_name_namewarn_add(Namespaceprefix,$5,0,$3); } $$ = 0; scanner_clear_rename(); @@ -2550,7 +2209,6 @@ varargs_directive : VARARGS LPAREN varargs_parms RPAREN declarator cpp_const SEM Parm *val; String *name; SwigType *t; - if (!features_hash) features_hash = NewHash(); if (Namespaceprefix) name = NewStringf("%s::%s", Namespaceprefix, $5.id); else name = NewString($5.id); val = $3; @@ -2565,19 +2223,19 @@ varargs_directive : VARARGS LPAREN varargs_parms RPAREN declarator cpp_const SEM SwigType *decl = SwigType_pop_function(t); if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); - Swig_feature_set(features_hash, nname, decl, "feature:varargs", val, 0); + Swig_feature_set(Swig_cparse_features(), nname, decl, "feature:varargs", val, 0); Delete(nname); } else { - Swig_feature_set(features_hash, name, decl, "feature:varargs", val, 0); + Swig_feature_set(Swig_cparse_features(), name, decl, "feature:varargs", val, 0); } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); - Swig_feature_set(features_hash,nname,0,"feature:varargs",val, 0); + Swig_feature_set(Swig_cparse_features(),nname,0,"feature:varargs",val, 0); Delete(nname); } } else { - Swig_feature_set(features_hash,name,0,"feature:varargs",val, 0); + Swig_feature_set(Swig_cparse_features(),name,0,"feature:varargs",val, 0); } Delete(name); $$ = 0; @@ -3340,12 +2998,17 @@ cpp_class_decl : /* A simple class/struct/union definition */ storage_class cpptype idcolon inherit LBRACE { List *bases = 0; + Node *scope = 0; + $$ = new_node("class"); /* preserve the current scope */ prev_symtab = Swig_symbol_current(); /* If the class name is qualified. We need to create or lookup namespace/scope entries */ - $3 = resolve_node_scope($3); + scope = resolve_node_scope($3); + Setfile(scope,cparse_file); + Setline(scope,cparse_line); + $3 = scope; /* support for old nested classes "pseudo" support, such as: @@ -3367,7 +3030,7 @@ cpp_class_decl : } Delete(class_rename); - class_rename = make_name(0,$3,0); + class_rename = make_name($$,$3,0); Classprefix = NewString($3); /* Deal with inheritance */ if ($4) { @@ -3383,7 +3046,7 @@ cpp_class_decl : fbase = Copy($3); tbase = Copy(prefix); } - rename_inherit(tbase,fbase); + Swig_name_inherit(tbase,fbase); Delete(fbase); Delete(tbase); Delete(prefix); @@ -3551,8 +3214,9 @@ cpp_class_decl : /* An unnamed struct, possibly with a typedef */ | storage_class cpptype LBRACE { + $$ = new_node("class"); Delete(class_rename); - class_rename = make_name(0,0,0); + class_rename = make_name($$,0,0); if (strcmp($2,"class") == 0) { cplus_mode = CPLUS_PRIVATE; } else { @@ -3569,8 +3233,8 @@ cpp_class_decl : Node *n; Classprefix = 0; inclass = 0; - unnamed = make_unnamed(); $$ = new_node("class"); + unnamed = make_unnamed(); Setline($$,cparse_start_line); Setattr($$,"kind",$2); Setattr($$,"storage",$1); @@ -4148,7 +3812,7 @@ cpp_member : c_declaration { $$ = $1; } $$ = $1; if (extendmode) { String *symname; - symname= make_name(0,Getattr($$,"name"), Getattr($$,"decl")); + symname= make_name($$,Getattr($$,"name"), Getattr($$,"decl")); if (Strcmp(symname,Getattr($$,"name")) == 0) { /* No renaming operation. Set name to class name */ Delete(yyrename); @@ -4211,7 +3875,8 @@ 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); + String *name = NewStringf("%s",$2); + if (*(Char(name)) != '~') Insert(name,0,"~"); $$ = new_node("destructor"); Setattr($$,"name",name); Delete(name); @@ -4246,7 +3911,8 @@ cpp_destructor_decl : NOT idtemplate LPAREN parms RPAREN cpp_end { } } Setattr($$,"storage","virtual"); - name = NewStringf("~%s",$3); + name = NewStringf("%s",$3); + if (*(Char(name)) != '~') Insert(name,0,"~"); Setattr($$,"name",name); Delete(name); Setattr($$,"throws",$7.throws); diff --git a/Source/CParse/templ.c b/Source/CParse/templ.c index 7761463fa..fa41362e7 100644 --- a/Source/CParse/templ.c +++ b/Source/CParse/templ.c @@ -12,78 +12,16 @@ char cvsroot_templ_c[] = "$Header$"; #include "swig.h" +#include "swigkeys.h" #include "cparse.h" static int template_debug = 0; -static String *k_baselist = 0; -static String *k_cdecl = 0; -static String *k_class = 0; -static String *k_code = 0; -static String *k_constructor = 0; -static String *k_conversionoperator = 0; -static String *k_decl = 0; -static String *k_destructor = 0; -static String *k_error = 0; -static String *k_kwargs = 0; -static String *k_name = 0; -static String *k_namespace = 0; -static String *k_nodetype = 0; -static String *k_parms = 0; -static String *k_partialargs = 0; -static String *k_partials = 0; -static String *k_pattern = 0; -static String *k_privatebaselist = 0; -static String *k_protectedbaselist = 0; -static String *k_symname = 0; -static String *k_symnextSibling = 0; -static String *k_symsymtab = 0; -static String *k_template = 0; -static String *k_templateparms = 0; -static String *k_templatetype = 0; -static String *k_throws = 0; -static String *k_type = 0; -static String *k_typedef = 0; -static String *k_uname = 0; -static String *k_using = 0; -static String *k_value = 0; String *baselists[3]; void SwigType_template_init() { - k_baselist = NewString("baselist"); - k_cdecl = NewString("cdecl"); - k_class = NewString("class"); - k_code = NewString("code"); - k_constructor = NewString("constructor"); - k_conversionoperator = NewString("conversion_operator"); - k_decl = NewString("decl"); - k_destructor = NewString("destructor"); - k_error = NewString("error"); - k_kwargs = NewString("kwargs"); - k_name = NewString("name"); - k_namespace = NewString("namespace"); - k_nodetype = NewString("nodeType"); - k_parms = NewString("parms"); - k_partialargs = NewString("partialargs"); - k_partials = NewString("partials"); - k_pattern = NewString("pattern"); - k_privatebaselist = NewString("privatebaselist"); - k_protectedbaselist = NewString("protectedbaselist"); - k_symname = NewString("sym:name"); - k_symnextSibling = NewString("sym:nextSibling"); - k_symsymtab = NewString("sym:symtab"); - k_template = NewString("template"); - k_templateparms = NewString("templateparms"); - k_templatetype = NewString("templatetype"); - k_throws = NewString("throws"); - k_type = NewString("type"); - k_typedef = NewString("typedef"); - k_uname = NewString("uname"); - k_using = NewString("using"); - k_value = NewString("value"); - baselists[0] = k_baselist; baselists[1] = k_protectedbaselist; baselists[2] = k_privatebaselist; diff --git a/Source/CParse/util.c b/Source/CParse/util.c index daec85c9d..0bd9b5999 100644 --- a/Source/CParse/util.c +++ b/Source/CParse/util.c @@ -87,151 +87,5 @@ void cparse_normalize_void(Node *n) { } } } - -/* ----------------------------------------------------------------------------- - * int need_protected(Node* n, int dirprot_mode) - * - * Detects when we need to fully register the protected member. - * - * ----------------------------------------------------------------------------- */ - -int need_protected(Node* n, int dirprot_mode) -{ - /* First, 'n' looks like a function */ - if (!dirprot_mode && !Swig_director_mode()) return 0; - if ((Strcmp(nodeType(n),"cdecl") == 0) && - SwigType_isfunction(Getattr(n,"decl"))) { - String *storage = Getattr(n,"storage"); - /* and the function is declared like virtual, or it has no - storage. This eliminates typedef, static and so on. */ - return (!storage || (Strcmp(storage,"virtual") == 0)); - } else if ((Strcmp(nodeType(n),"constructor") == 0)) { - return 1; - } - - return 0; -} - -/* ----------------------------------------------------------------------------- - * int need_name_warning(Node *n) - * - * Detects if a node needs name warnings - * - * ----------------------------------------------------------------------------- */ - -int need_name_warning(Node *n) -{ - int need = 1; - /* - we don't use name warnings for: - - class forwards, no symbol is generated at the target language. - - template declarations, only for real instances using %template(name). - - typedefs, they have no effect at the target language. - */ - if (Strcmp(nodeType(n),"classforward") == 0) { - need = 0; - } else if (Getattr(n,"templatetype")) { - need = 0; - } else { - String *storage = Getattr(n,"storage"); - if (storage && (Strcmp(storage,"typedef") == 0)) { - need = 0; - } - } - return need; -} -int are_equivalent_nodes(Node* a, Node* b, int a_inclass) -{ - /* they must have the same type */ - SwigType *ta = nodeType(a); - SwigType *tb = nodeType(b); - if (Cmp(ta, tb) != 0) return 0; - - /* cdecl case */ - if (Cmp(ta, "cdecl") == 0) { - /* typedef */ - String *a_storage = Getattr(a,"storage"); - String *b_storage = Getattr(b,"storage"); - - if ((Cmp(a_storage,"typedef") == 0) - || (Cmp(b_storage,"typedef") == 0)) { - if (Cmp(a_storage, b_storage) == 0) { - String *a_type = (Getattr(a,"type")); - String *b_type = (Getattr(b,"type")); - if (Cmp(a_type, b_type) == 0) return 1; - } - return 0; - } - - /* static functions */ - if ((Cmp(a_storage, "static") == 0) - || (Cmp(b_storage, "static") == 0)) { - if (Cmp(a_storage, b_storage) != 0) return 0; - } - - /* friend methods */ - - if (!a_inclass || (Cmp(a_storage,"friend") == 0)) { - /* check declaration */ - - String *a_decl = (Getattr(a,"decl")); - String *b_decl = (Getattr(b,"decl")); - if (Cmp(a_decl, b_decl) == 0) { - /* check return type */ - String *a_type = (Getattr(a,"type")); - String *b_type = (Getattr(b,"type")); - if (Cmp(a_type, b_type) == 0) { - /* check parameters */ - Parm *ap = (Getattr(a,"parms")); - Parm *bp = (Getattr(b,"parms")); - while (ap && bp) { - SwigType *at = Getattr(ap,"type"); - SwigType *bt = Getattr(bp,"type"); - if (Cmp(at, bt) != 0) return 0; - ap = nextSibling(ap); - bp = nextSibling(bp); - } - if (ap || bp) { - return 0; - } else { - Node *a_template = Getattr(a,"template"); - Node *b_template = Getattr(b,"template"); - /* Not equivalent if one is a template instantiation (via %template) and the other is a non-templated function */ - if ((a_template && !b_template) || (!a_template && b_template)) return 0; - } - return 1; - } - } - } - } else { - /* %constant case */ - String *a_storage = Getattr(a,"storage"); - String *b_storage = Getattr(b,"storage"); - if ((Cmp(a_storage, "%constant") == 0) - || (Cmp(b_storage, "%constant") == 0)) { - if (Cmp(a_storage, b_storage) == 0) { - String *a_type = (Getattr(a,"type")); - String *b_type = (Getattr(b,"type")); - if ((Cmp(a_type, b_type) == 0) - && (Cmp(Getattr(a,"value"), Getattr(b,"value")) == 0)) - return 1; - } - return 0; - } - } - return 0; -} - -int need_redefined_warn(Node* a, Node* b, int InClass) -{ - String *a_symname = Getattr(a,"sym:name"); - String *b_symname = Getattr(b,"sym:name"); - /* always send a warning if a 'rename' is involved */ - if ((a_symname && Cmp(a_symname,Getattr(a,"name"))) - || (b_symname && Cmp(b_symname,Getattr(b,"name")))) - return 1; - - return !are_equivalent_nodes(a, b, InClass); -} diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx index d4193f43d..4325fab4d 100644 --- a/Source/Modules/csharp.cxx +++ b/Source/Modules/csharp.cxx @@ -2392,7 +2392,7 @@ class CSHARP : public Language { count++; plist = nextSibling(plist); } - String *wrn = pn ? Swig_cparse_name_warning(0,0,pn,0) : 0; + String *wrn = pn ? Swig_name_warning(p,0,pn,0) : 0; arg = (!pn || (count > 1) || wrn) ? NewStringf("arg%d",arg_num) : Copy(pn); } diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 4f829ac5e..8584503e9 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -2546,7 +2546,7 @@ class JAVA : public Language { count++; plist = nextSibling(plist); } - String *wrn = pn ? Swig_cparse_name_warning(0, 0, pn, 0) : 0; + String *wrn = pn ? Swig_name_warning(p, 0, pn, 0) : 0; arg = (!pn || (count > 1) || wrn) ? NewStringf("arg%d",arg_num) : Copy(pn); } diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 73bcdd19a..a70603bf2 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -40,11 +40,6 @@ extern "C" { { return director_mode; } - - int Swig_need_protected() - { - return director_protected_mode; - } } @@ -1973,6 +1968,8 @@ static void addCopyConstructor(Node *n) Node *cn = NewHash(); set_nodeType(cn,"constructor"); Setattr(cn,"access","public"); + Setfile(cn,Getfile(n)); + Setline(cn,Getline(n)); String *cname = Getattr(n,"name"); SwigType *type = Copy(cname); @@ -1981,7 +1978,7 @@ static void addCopyConstructor(Node *n) String *cc = NewStringf("r.q(const).%s", type); String *decl = NewStringf("f(%s).",cc); String *csymname = Getattr(n,"sym:name"); - String *symname = Swig_cparse_symbol_name(cn, cname, last, decl, 0); + String *symname = Swig_name_make(cn, cname, last, decl, 0); if (!symname) { symname = Copy(csymname); } @@ -2023,13 +2020,15 @@ static void addDefaultConstructor(Node *n) Node *cn = NewHash(); set_nodeType(cn,"constructor"); Setattr(cn,"access","public"); + Setfile(cn,Getfile(n)); + Setline(cn,Getline(n)); String *cname = Getattr(n,"name"); String *last = Swig_scopename_last(cname); String *name = NewStringf("%s::%s",cname,last); String *decl = NewString("f()."); String *csymname = Getattr(n,"sym:name"); - String *symname = Swig_cparse_symbol_name(cn, cname, last, decl, 0); + String *symname = Swig_name_make(cn, cname, last, decl, 0); if (!symname) { symname = Copy(csymname); } @@ -2068,13 +2067,15 @@ static void addDestructor(Node *n) Node *cn = NewHash(); set_nodeType(cn,"destructor"); Setattr(cn,"access","public"); + Setfile(cn,Getfile(n)); + Setline(cn,Getline(n)); String *cname = Getattr(n,"name"); String *last = Swig_scopename_last(cname); Insert(last,0,"~"); String *name = NewStringf("%s::%s",cname,last); String *decl = NewString("f()."); - String *symname = Swig_cparse_symbol_name(cn, cname, last, decl, 0); + String *symname = Swig_name_make(cn, cname, last, decl, 0); if (!symname) { symname = NewStringf("~%s",Getattr(n,"sym:name")); } diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx index a4bcdf4bb..34cfda280 100644 --- a/Source/Modules/python.cxx +++ b/Source/Modules/python.cxx @@ -1575,7 +1575,7 @@ public: if (i == num_required) Putc('|', parse_args); /* Optional argument separator */ /* Keyword argument handling */ - String *wrn = (allow_kwargs && pn) ? Swig_cparse_name_warning(0,0,pn,0) : 0; + String *wrn = (allow_kwargs && pn) ? Swig_name_warning(p,0,pn,0) : 0; if (!wrn && Len(pn)) { Printf(kwargs,"(char *) \"%s\",", pn); } else { @@ -1585,7 +1585,7 @@ public: do we need to emit a warning? */ Printf(kwargs,"(char *) \"_%s\",", pn); - Swig_warning(0,Getfile(n),Getline(n), "%s, renaming parameter to _%s\n", wrn, pn); + Swig_warning(0,Getfile(n),Getline(n), "314:, '%s' is a renaming parameter to _%s\n", wrn, pn); } else { Printf(kwargs,"(char *)\"arg%d\",", i+1); } diff --git a/Source/Swig/misc.c b/Source/Swig/misc.c index b75f50757..4ff80beee 100644 --- a/Source/Swig/misc.c +++ b/Source/Swig/misc.c @@ -12,6 +12,7 @@ char cvsroot_misc_c[] = "$Header$"; #include "swig.h" +#include "swigkeys.h" #include #include #include @@ -656,9 +657,11 @@ int Swig_scopename_check(String *s) { #if defined(HAVE_POPEN) extern FILE *popen(const char *command, const char *type); extern int pclose(FILE *stream); +#endif String *Swig_string_command(String *s) { String *res = NewStringEmpty(); +#if defined(HAVE_POPEN) if (Len(s)) { char *command = Char(s); FILE *fp = popen(command,"r"); @@ -669,14 +672,14 @@ String *Swig_string_command(String *s) { } pclose(fp); } - if (!fp || (errno)) { + if (!fp || errno) { Swig_error("SWIG",Getline(s), "Command encoder fails attempting '%s'.\n", s); exit(1); } } +#endif return res; } -#endif /* ----------------------------------------------------------------------------- @@ -695,9 +698,10 @@ Swig_init() { DohEncoding("ctitle", Swig_string_ctitle); DohEncoding("typecode",Swig_string_typecode); DohEncoding("mangle",Swig_string_emangle); -#if defined(HAVE_POPEN) DohEncoding("command",Swig_string_command); -#endif + + /* Initialize the swig keys */ + Swig_keys_init(); /* Initialize typemaps */ Swig_typemap_init(); @@ -705,9 +709,6 @@ Swig_init() { /* Initialize symbol table */ Swig_symbol_init(); - /* Initialize naming system */ - Swig_naming_init(); - /* Initialize type system */ SwigType_typesystem_init(); diff --git a/Source/Swig/naming.c b/Source/Swig/naming.c index edd14ea13..041d80941 100644 --- a/Source/Swig/naming.c +++ b/Source/Swig/naming.c @@ -12,6 +12,8 @@ char cvsroot_naming_c[] = "$Header$"; #include "swig.h" +#include "cparse.h" +#include "swigkeys.h" #include /* Hash table containing naming data */ @@ -20,43 +22,6 @@ static Hash *naming_hash = 0; /* #define SWIG_DEBUG */ -/* ----------------------------------------------------------------------------- - * Swig_naming_init() - * - * Init the naming system - * ----------------------------------------------------------------------------- */ -static String *k_construct = 0; -static String *k_constructor = 0; -static String *k_destroy= 0; -static String *k_destructor = 0; -static String *k_disown = 0; -static String *k_name = 0; -static String *k_start = 0; -static String *k_value = 0; -static String *k_wrapper = 0; -static String *k_nodetype = 0; -static String *k_member = 0; -static String *k_get = 0; -static String *k_set = 0; - -void -Swig_naming_init() { - k_construct = NewString("construct"); - k_constructor = NewString("constructor"); - k_destroy = NewString("destroy"); - k_destructor = NewString("destructor"); - k_disown = NewString("disown"); - k_name = NewString("name"); - k_nodetype = NewString("nodeType"); - k_start = NewString("*"); - k_value = NewString("value"); - k_wrapper = NewString("wrapper"); - k_member = NewString("member"); - k_set = NewString("set"); - k_get = NewString("get"); -} - - /* ----------------------------------------------------------------------------- * Swig_name_register() * @@ -187,7 +152,7 @@ Swig_name_wrapper(const String_or_char *fname) { r = NewStringEmpty(); if (!naming_hash) naming_hash = NewHash(); - f = Getattr(naming_hash,k_wrapper); + f = HashGetAttr(naming_hash,k_wrapper); if (!f) { Append(r,"_wrap_%f"); } else { @@ -215,7 +180,7 @@ Swig_name_member(const String_or_char *classname, const String_or_char *mname) { rclassname = SwigType_namestr(classname); r = NewStringEmpty(); if (!naming_hash) naming_hash = NewHash(); - f = Getattr(naming_hash,k_member); + f = HashGetAttr(naming_hash,k_member); if (!f) { Append(r,"%c_%m"); } else { @@ -251,7 +216,7 @@ Swig_name_get(const String_or_char *vname) { r = NewStringEmpty(); if (!naming_hash) naming_hash = NewHash(); - f = Getattr(naming_hash,k_get); + f = HashGetAttr(naming_hash,k_get); if (!f) { Append(r,"%v_get"); } else { @@ -275,7 +240,7 @@ Swig_name_set(const String_or_char *vname) { r = NewStringEmpty(); if (!naming_hash) naming_hash = NewHash(); - f = Getattr(naming_hash,k_set); + f = HashGetAttr(naming_hash,k_set); if (!f) { Append(r,"%v_set"); } else { @@ -302,7 +267,7 @@ Swig_name_construct(const String_or_char *classname) { rclassname = SwigType_namestr(classname); r = NewStringEmpty(); if (!naming_hash) naming_hash = NewHash(); - f = Getattr(naming_hash,k_construct); + f = HashGetAttr(naming_hash,k_construct); if (!f) { Append(r,"new_%c"); } else { @@ -337,7 +302,7 @@ Swig_name_copyconstructor(const String_or_char *classname) { rclassname = SwigType_namestr(classname); r = NewStringEmpty(); if (!naming_hash) naming_hash = NewHash(); - f = Getattr(naming_hash,k_construct); + f = HashGetAttr(naming_hash,k_construct); if (!f) { Append(r,"copy_%c"); } else { @@ -370,7 +335,7 @@ String *Swig_name_destroy(const String_or_char *classname) { rclassname = SwigType_namestr(classname); r = NewStringEmpty(); if (!naming_hash) naming_hash = NewHash(); - f = Getattr(naming_hash,k_destroy); + f = HashGetAttr(naming_hash,k_destroy); if (!f) { Append(r,"delete_%c"); } else { @@ -403,7 +368,7 @@ String *Swig_name_disown(const String_or_char *classname) { rclassname = SwigType_namestr(classname); r = NewStringEmpty(); if (!naming_hash) naming_hash = NewHash(); - f = Getattr(naming_hash,k_disown); + f = HashGetAttr(naming_hash,k_disown); if (!f) { Append(r,"disown_%c"); } else { @@ -435,7 +400,7 @@ Swig_name_object_set(Hash *namehash, String *name, SwigType *decl, DOH *object) #ifdef SWIG_DEBUG Printf(stdout,"Swig_name_object_set: '%s', '%s'\n", name, decl); #endif - n = Getattr(namehash,name); + n = HashGetAttr(namehash,name); if (!n) { n = NewHash(); Setattr(namehash,name,n); @@ -474,7 +439,7 @@ static DOH * name_object_get(Hash *namehash, String *tname, SwigType *decl, SwigType *ncdecl) { DOH* rn = 0; - Hash *n = Getattr(namehash,tname); + Hash *n = HashGetAttr(namehash,tname); if (n) { rn = get_object(n,decl); if ((!rn) && ncdecl) rn = get_object(n,ncdecl); @@ -585,7 +550,7 @@ Swig_name_object_inherit(Hash *namehash, String *base, String *derived) { Iterator oi; String *nkey = NewStringf("%s%s",dprefix,k+plen); Hash *n = ki.item; - Hash *newh = Getattr(namehash,nkey); + Hash *newh = HashGetAttr(namehash,nkey); if (!newh) { newh = NewHash(); Setattr(namehash,nkey,newh); @@ -812,6 +777,518 @@ Swig_feature_set(Hash *features, const String_or_char *name, SwigType *decl, con } +/* + The rename/namewarn engine +*/ + +static Hash *namewarn_hash = 0; +Hash *Swig_name_namewarn_hash() { + if (!namewarn_hash) namewarn_hash = NewHash(); + return namewarn_hash; +} + +static Hash *rename_hash = 0; +Hash *Swig_name_rename_hash() { + if (!rename_hash) rename_hash = NewHash(); + return rename_hash; +} + +static List *namewarn_list = 0; +List *Swig_name_namewarn_list() { + if (!namewarn_list) namewarn_list = NewList(); + return namewarn_list; +} + +static List *rename_list = 0; +List *Swig_name_rename_list() { + if (!rename_list) rename_list = NewList(); + return rename_list; +} + + +/* ----------------------------------------------------------------------------- + * int Swig_need_name_warning(Node *n) + * + * Detects if a node needs name warnings + * + * ----------------------------------------------------------------------------- */ + +int Swig_need_name_warning(Node *n) +{ + int need = 1; + /* + we don't use name warnings for: + - class forwards, no symbol is generated at the target language. + - template declarations, only for real instances using %template(name). + - typedefs, they have no effect at the target language. + */ + if (checkAttribute(n,k_nodetype,k_classforward)) { + need = 0; + } else if (checkAttribute(n,k_storage,k_typedef)) { + need = 0; + } else if (Getattr(n,k_hidden)) { + need = 0; + } else if (Getattr(n,k_ignore)) { + need = 0; + } else if (Getattr(n,k_templatetype)) { + need = 0; + } + return need; +} + +/* ----------------------------------------------------------------------------- + * Swig_nodes_are_equivalent(Node* a, Node* b, int a_inclass) + * Restores attributes saved by a previous call to Swig_require() or Swig_save(). + * ----------------------------------------------------------------------------- */ + +static int nodes_are_equivalent(Node* a, Node* b, int a_inclass) +{ + /* they must have the same type */ + String *ta = Getattr(a,k_nodetype); + String *tb = Getattr(b,k_nodetype); + if (Cmp(ta, tb) != 0) return 0; + + /* cdecl case */ + if (Cmp(ta, k_cdecl) == 0) { + /* typedef */ + String *a_storage = Getattr(a,k_storage); + String *b_storage = Getattr(b,k_storage); + + if ((Cmp(a_storage,k_typedef) == 0) + || (Cmp(b_storage,k_typedef) == 0)) { + if (Cmp(a_storage, b_storage) == 0) { + String *a_type = (Getattr(a,k_type)); + String *b_type = (Getattr(b,k_type)); + if (Cmp(a_type, b_type) == 0) return 1; + } + return 0; + } + + /* static functions */ + if ((Cmp(a_storage, k_static) == 0) + || (Cmp(b_storage, k_static) == 0)) { + if (Cmp(a_storage, b_storage) != 0) return 0; + } + + /* friend methods */ + + if (!a_inclass || (Cmp(a_storage,k_friend) == 0)) { + /* check declaration */ + + String *a_decl = (Getattr(a,k_decl)); + String *b_decl = (Getattr(b,k_decl)); + if (Cmp(a_decl, b_decl) == 0) { + /* check return type */ + String *a_type = (Getattr(a,k_type)); + String *b_type = (Getattr(b,k_type)); + if (Cmp(a_type, b_type) == 0) { + /* check parameters */ + Parm *ap = (Getattr(a,k_parms)); + Parm *bp = (Getattr(b,k_parms)); + while (ap && bp) { + SwigType *at = Getattr(ap,k_type); + SwigType *bt = Getattr(bp,k_type); + if (Cmp(at, bt) != 0) return 0; + ap = nextSibling(ap); + bp = nextSibling(bp); + } + if (ap || bp) { + return 0; + } else { + Node *a_template = Getattr(a,k_template); + Node *b_template = Getattr(b,k_template); + /* Not equivalent if one is a template instantiation (via %template) and the other is a non-templated function */ + if ((a_template && !b_template) || (!a_template && b_template)) return 0; + } + return 1; + } + } + } + } else { + /* %constant case */ + String *a_storage = Getattr(a,k_storage); + String *b_storage = Getattr(b,k_storage); + if ((Cmp(a_storage, "%constant") == 0) + || (Cmp(b_storage, "%constant") == 0)) { + if (Cmp(a_storage, b_storage) == 0) { + String *a_type = (Getattr(a,k_type)); + String *b_type = (Getattr(b,k_type)); + if ((Cmp(a_type, b_type) == 0) + && (Cmp(Getattr(a,k_value), Getattr(b,k_value)) == 0)) + return 1; + } + return 0; + } + } + return 0; +} + +int Swig_need_redefined_warn(Node* a, Node* b, int InClass) +{ + String *a_symname = Getattr(a,k_symname); + String *b_symname = Getattr(b,k_symname); + /* always send a warning if a 'rename' is involved */ + if ((a_symname && Cmp(a_symname,Getattr(a,k_name))) + || (b_symname && Cmp(b_symname,Getattr(b,k_name)))) + return 1; + + return !nodes_are_equivalent(a, b, InClass); +} + + +/* ----------------------------------------------------------------------------- + * int Swig_need_protected(Node* n) + * + * Detects when we need to fully register the protected member. + * + * ----------------------------------------------------------------------------- */ + +int Swig_need_protected(Node* n) +{ + /* First, 'n' looks like a function */ + /* if (!Swig_director_mode()) return 0; */ + String *nodetype = Getattr(n,k_nodetype); + if ((Equal(nodetype,k_cdecl)) && SwigType_isfunction(Getattr(n,k_decl))) { + String *storage = Getattr(n,k_storage); + /* and the function is declared like virtual, or it has no + storage. This eliminates typedef, static and so on. */ + return !storage || Equal(storage,k_virtual); + } else if (Equal(nodetype,k_constructor) || Equal(nodetype,k_destructor)) { + return 1; + } + + return 0; +} + + +static void Swig_name_object_attach_keys(const char *keys[], Hash *nameobj) +{ + Node *kw = nextSibling(nameobj); + List *matchlist = 0; + while (kw) { + Node *next = nextSibling(kw); + String *kname = Getattr(kw,k_name); + char *ckey = kname ? Char(kname) : 0; + if (ckey) { + const char **rkey; + if (strncmp(ckey,"match",5) == 0) { + if (!matchlist) matchlist = NewList(); + Append(matchlist,kw); + deleteNode(kw); + } else { + for (rkey = keys; *rkey != 0; ++rkey) { + if (strcmp(ckey,*rkey) == 0) { + Setattr(nameobj, *rkey, Getattr(kw,k_value)); + deleteNode(kw); + } + } + } + } + kw = next; + } + if (matchlist) { + Setattr(nameobj,k_matchlist,matchlist); + Delete(matchlist); + } + +} +void +Swig_name_nameobj_add(Hash *name_hash, List *name_list, + String *prefix, const char *name, SwigType *decl, Hash *nameobj) { + String *nname = 0; + + if (name && Len(name)) { + String *target_fmt = Getattr(nameobj,k_targetfmt); + nname = prefix ? NewStringf("%s::%s",prefix, name) : NewString(name); + if (target_fmt) { + String *tmp = NewStringf(Getattr(nameobj,k_targetfmt), nname); + Delete(nname); + nname = tmp; + } + } + + if (!nname || !Len(nname) || Getattr(nameobj,k_sourcefmt) || Getattr(nameobj,k_matchlist)) { + if (decl) Setattr(nameobj,k_decl, decl); + if (nname && Len(nname)) Setattr(nameobj,k_targetname, nname); + Append(name_list, nameobj); + } else { + Swig_name_object_set(name_hash,nname,decl,nameobj); + } + Delete(nname); +} + + +DOH *Swig_node_getattr(Node *n, const char *cattr) +{ + const char *rattr = strstr(cattr,"$"); + if (rattr) { + String *nattr = NewStringWithSize(cattr, rattr-cattr); + Node *rn = Getattr(n,nattr); + if (rn) { + DOH *res = Swig_node_getattr(rn, rattr + 1); + Delete(nattr); + return res; + } else { + return 0; + } + } else { + DOH *res = Getattr(n,cattr); + return res; + } +} + +int Swig_name_match_nameobj(Hash *rn, Node *n) { + int match = 1; + List *matchlist = HashGetAttr(rn,k_matchlist); + if (matchlist) { + int i; + int ilen = Len(matchlist); + for (i = 0; match && (i < ilen); ++i) { + Node *kw = Getitem(matchlist,i); + String *key = Getattr(kw,k_name); + char *ckey = key ? Char(key) : 0; + if (ckey && (strncmp(ckey,"match",5) == 0)) { + match = 0; + if (n) { + const char *csep = strstr(ckey,"$"); + String *nval = csep ? Swig_node_getattr(n,csep + 1) : Getattr(n,k_nodetype); + String *kwval = Getattr(kw,k_value); + if (nval && Equal(nval, kwval)) { + match = 1; + } + } + } + } + } + return match; +} + +Hash *Swig_name_nameobj_lget(List *namelist, Node *n, String *prefix, String *name, String *decl) { + Hash *res = 0; + if (namelist) { + int len = Len(namelist); + int i; + int match = 0; + for (i = 0; !match && (i < len); i++) { + Hash *rn = Getitem(namelist,i); + String *rdecl = HashGetAttr(rn,k_decl); + if (rdecl && (!decl || !Equal(rdecl,decl))) { + continue; + } else if (Swig_name_match_nameobj(rn, n)) { + String *tname = HashGetAttr(rn,k_targetname); + String *sfmt = HashGetAttr(rn,k_sourcefmt); + String *sname = 0; + int fullname = GetFlag(namelist,k_fullname); + if (sfmt) { + if (fullname && prefix) { + sname = NewStringf(sfmt, prefix, name); + } else { + sname = NewStringf(sfmt, name); + } + } else { + if (fullname && prefix) { + sname = NewStringf("%s::%s", prefix, name); + } else { + sname = NewString(name); + } + } + match = !tname || Equal(sname,tname); + Delete(sname); + } + if (match) { + res = rn; + break; + } + } + } + return res; +} + + +void Swig_name_namewarn_add(String *prefix, String *name, SwigType *decl, Hash *namewrn) { + const char *namewrn_keys[] = {"rename", "error", "fullname", "sourcefmt", "targetfmt", 0}; + Swig_name_object_attach_keys(namewrn_keys, namewrn); + Swig_name_nameobj_add(Swig_name_namewarn_hash(), Swig_name_namewarn_list(), + prefix, name, decl, namewrn); +} + +/* Return the node name when it requires to emit a name warning */ +Hash *Swig_name_namewarn_get(Node *n, String *prefix, String *name,SwigType *decl) { + if (!namewarn_hash && !namewarn_list) return 0; + if (n) { + /* Return in the obvious cases */ + if (!name || !Swig_need_name_warning(n)) { + return 0; + } else { + String *access = Getattr(n,k_access); + int is_public = !access || Equal(access,k_public); + if (!is_public && !Swig_need_protected(n)) { + return 0; + } + } + } + if (name) { + /* Check to see if the name is in the hash */ + Hash *wrn = Swig_name_object_get(Swig_name_namewarn_hash(),prefix,name,decl); + if (wrn && !Swig_name_match_nameobj(wrn, n)) wrn = 0; + if (!wrn) { + wrn = Swig_name_nameobj_lget(Swig_name_namewarn_list(), n, prefix, name, decl); + } + if (wrn && HashGetAttr(wrn,k_error)) { + if (n) { + Swig_error(Getfile(n), Getline(n), "%s\n", HashGetAttr(wrn,k_name)); + } else { + Swig_error(cparse_file, cparse_line,"%s\n", HashGetAttr(wrn,k_name)); + } + } + return wrn; + } else { + return 0; + } +} + +String *Swig_name_warning(Node *n, String *prefix, String *name,SwigType *decl) { + Hash *wrn = Swig_name_namewarn_get(n, prefix, name,decl); + return (name && wrn) ? HashGetAttr(wrn,k_name) : 0; +} + + + +static void single_rename_add(String *prefix, String *name, SwigType *decl, Hash *newname) { + Swig_name_nameobj_add(Swig_name_rename_hash(), Swig_name_rename_list(), + prefix, name, decl, newname); +} + +/* Add a new rename. Works much like new_feature including default argument handling. */ +void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *newname, + ParmList *declaratorparms) { + + ParmList *declparms = declaratorparms; + + const char *rename_keys[] = {"fullname", "sourcefmt", "targetfmt", 0}; + Swig_name_object_attach_keys(rename_keys, newname); + + /* Add the name */ + single_rename_add(prefix, name, decl, newname); + + /* Add extra names if there are default parameters in the parameter list */ + if (decl) { + int constqualifier = SwigType_isconst(decl); + while (declparms) { + if (ParmList_has_defaultargs(declparms)) { + + /* Create a parameter list for the new rename by copying all + but the last (defaulted) parameter */ + ParmList* newparms = ParmList_copy_all_except_last_parm(declparms); + + /* Create new declaration - with the last parameter removed */ + SwigType *newdecl = Copy(decl); + Delete(SwigType_pop_function(newdecl)); /* remove the old parameter list from newdecl */ + SwigType_add_function(newdecl,newparms); + if (constqualifier) + SwigType_add_qualifier(newdecl,"const"); + + single_rename_add(prefix, name, newdecl, newname); + declparms = newparms; + Delete(newdecl); + } else { + declparms = 0; + } + } + } +} + + +/* Create a name applying rename/namewarn if needed */ +static String *apply_rename(String *newname, int fullname, String *prefix, String *name) +{ + String *result = 0; + if (newname && Len(newname)) { + if (Strcmp(newname,"$ignore") == 0) { + result = Copy(newname); + } else { + char *cnewname = Char(newname); + if (cnewname) { + int destructor = name && (*(Char(name)) == '~'); + String *fmt = newname; + String *tmp = 0; + if (destructor && (*cnewname != '~')) { + fmt = tmp = NewStringf("~%s", newname); + } + /* use name as a fmt, but avoid C++ "%" and "%=" operators */ + if (Len(newname) > 1 && strstr(cnewname,"%") && !(strcmp(cnewname,"%=") == 0)) { + if (fullname && prefix) { + result = NewStringf(fmt,prefix,name); + } else { + result = NewStringf(fmt,name); + } + } else { + result = Copy(newname); + } + if (tmp) Delete(tmp); + } + } + } + return result; +} + +String * +Swig_name_make(Node *n, String *prefix, String *name, SwigType *decl, String *oldname) { + String *nname = 0; + String *result = 0; + Hash *wrn = 0; + if (namewarn_hash || namewarn_list) { + Hash *rn = Swig_name_object_get(Swig_name_rename_hash(), prefix, name, decl); + if (!rn || !Swig_name_match_nameobj(rn,n)) { + rn = Swig_name_nameobj_lget(Swig_name_rename_list(), n, prefix, name, decl); + } + if (rn) { + String *newname = HashGetAttr(rn,k_name); + int fullname = GetFlag(rn,k_fullname); + result = apply_rename(newname, fullname, prefix, name); + } + + nname = result ? result : name; + wrn = Swig_name_namewarn_get(n, prefix, nname, decl); + if (wrn) { + String *rename = HashGetAttr(wrn,k_rename); + if (rename) { + String *msg = HashGetAttr(wrn,k_name); + int fullname = GetFlag(wrn,k_fullname); + if (result) Delete(result); + result = apply_rename(rename, fullname, prefix, name); + if ((msg) && (Len(msg))) { + if (!Getmeta(nname,"already_warned")) { + if (n) { + SWIG_WARN_NODE_BEGIN(n); + Swig_warning(0,Getfile(n), Getline(n), "%s\n", msg); + SWIG_WARN_NODE_END(n); + } else { + Swig_warning(0,Getfile(name),Getline(name), "%s\n", msg); + } + Setmeta(nname,"already_warned","1"); + } + } + } + } + } + if (!result || !Len(result)) { + if (result) Delete(result); + result = oldname ? Copy(oldname): Copy(name); + } + return result; +} + + + + + +void Swig_name_inherit(String *base, String *derived) { + /* Printf(stdout,"base = '%s', derived = '%s'\n", base, derived); */ + Swig_name_object_inherit(Swig_name_rename_hash(),base,derived); + Swig_name_object_inherit(Swig_name_namewarn_hash(),base,derived); + Swig_name_object_inherit(Swig_cparse_features(),base,derived); +} diff --git a/Source/Swig/parms.c b/Source/Swig/parms.c index 5537d3b0e..ae4e034ac 100644 --- a/Source/Swig/parms.c +++ b/Source/Swig/parms.c @@ -17,8 +17,7 @@ char cvsroot_parms_c[] = "$Header$"; #include "swig.h" - -#define MAXPARMS 16 +#include "swigkeys.h" /* ------------------------------------------------------------------------ * NewParm() @@ -28,13 +27,13 @@ char cvsroot_parms_c[] = "$Header$"; Parm *NewParm(SwigType *type, const String_or_char *name) { Parm *p = NewHash(); - + Setattr(p,k_nodetype,k_parm); if (type) { SwigType *ntype = Copy(type); - Setattr(p,"type",ntype); + Setattr(p,k_type,ntype); Delete(ntype); } - Setattr(p,"name",name); + Setattr(p,k_name,name); return p; } @@ -60,59 +59,59 @@ Parm *NewParmFromNode(SwigType *type, const String_or_char *name, Node *n) { Parm *CopyParm(Parm *p) { Parm *np = NewHash(); - SwigType *t = Getattr(p,"type"); - String *name = Getattr(p,"name"); - String *lname = Getattr(p,"lname"); - String *value = Getattr(p,"value"); - String *ignore = Getattr(p,"ignore"); - String *alttype = Getattr(p,"alttype"); - String *byname = Getattr(p, "arg:byname"); - String *compactdefargs = Getattr(p, "compactdefargs"); - String *self = Getattr(p, "self"); + SwigType *t = HashGetAttr(p,k_type); + String *name = HashGetAttr(p,k_name); + String *lname = HashGetAttr(p,k_lname); + String *value = HashGetAttr(p,k_value); + String *ignore = HashGetAttr(p,k_ignore); + String *alttype = HashGetAttr(p,k_alttype); + String *byname = HashGetAttr(p, k_argbyname); + String *compactdefargs = HashGetAttr(p, k_compactdefargs); + String *self = HashGetAttr(p, k_self); if (t) { SwigType *nt = Copy(t); - Setattr(np,"type",nt); + Setattr(np,k_type,nt); Delete(nt); } if (name) { String *str = Copy(name); - Setattr(np,"name",str); + Setattr(np,k_name,str); Delete(str); } if (lname) { String *str = Copy(lname); - Setattr(np,"lname", str); + Setattr(np,k_lname, str); Delete(str); } if (value) { String *str = Copy(value); - Setattr(np,"value", str); + Setattr(np,k_value, str); Delete(str); } if (ignore) { String *str = Copy(ignore); - Setattr(np,"ignore", str); + Setattr(np,k_ignore, str); Delete(str); } if (alttype) { String *str = Copy(alttype); - Setattr(np,"alttype", str); + Setattr(np,k_alttype, str); Delete(str); } if (byname) { String *str = Copy(byname); - Setattr(np, "arg:byname", str); + Setattr(np, k_argbyname, str); Delete(str); } if (compactdefargs) { String *str = Copy(compactdefargs); - Setattr(np, "compactdefargs", str); + Setattr(np, k_compactdefargs, str); Delete(str); } if (self) { String *str = Copy(self); - Setattr(np, "self", str); + Setattr(np, k_self, str); Delete(str); } @@ -155,7 +154,7 @@ CopyParmList(ParmList *p) { int ParmList_numarg(ParmList *p) { int n = 0; while (p) { - if (!Getattr(p,"ignore")) n++; + if (!HashGetAttr(p,k_ignore)) n++; p = nextSibling(p); } return n; @@ -168,8 +167,8 @@ int ParmList_numarg(ParmList *p) { int ParmList_numrequired(ParmList *p) { int i = 0; while (p) { - SwigType *t = Getattr(p,"type"); - String *value = Getattr(p,"value"); + SwigType *t = HashGetAttr(p,k_type); + String *value = HashGetAttr(p,k_value); if (value) return i; if (!(SwigType_type(t) == T_VOID)) i++; else break; @@ -200,7 +199,7 @@ int ParmList_len(ParmList *p) { String *ParmList_str(ParmList *p) { String *out = NewStringEmpty(); while(p) { - String *pstr = SwigType_str(Getattr(p,"type"), Getattr(p,"name")); + String *pstr = SwigType_str(HashGetAttr(p,k_type), HashGetAttr(p,k_name)); StringAppend(out,pstr); p = nextSibling(p); if (p) { @@ -220,8 +219,8 @@ String *ParmList_str(ParmList *p) { String *ParmList_str_defaultargs(ParmList *p) { String *out = NewStringEmpty(); while(p) { - String *value = Getattr(p,"value"); - String *pstr = SwigType_str(Getattr(p,"type"), Getattr(p,"name")); + String *value = HashGetAttr(p,k_value); + String *pstr = SwigType_str(HashGetAttr(p,k_type), HashGetAttr(p,k_name)); StringAppend(out,pstr); if (value) { Printf(out,"=%s", value); @@ -244,10 +243,10 @@ String *ParmList_str_defaultargs(ParmList *p) { String *ParmList_protostr(ParmList *p) { String *out = NewStringEmpty(); while(p) { - if (Getattr(p,"hidden")) { + if (HashGetAttr(p,k_hidden)) { p = nextSibling(p); } else { - String *pstr = SwigType_str(Getattr(p,"type"), 0); + String *pstr = SwigType_str(HashGetAttr(p,k_type), 0); StringAppend(out,pstr); p = nextSibling(p); if (p) { @@ -270,14 +269,14 @@ int ParmList_is_compactdefargs(ParmList *p) { int compactdefargs = 0; if (p) { - compactdefargs = Getattr(p,"compactdefargs") ? 1 : 0; + compactdefargs = HashGetAttr(p,k_compactdefargs) ? 1 : 0; /* The "compactdefargs" attribute should only be set on the first parameter in the list. * However, sometimes an extra parameter is inserted at the beginning of the parameter list, * so we check the 2nd parameter too. */ if (!compactdefargs) { Parm *nextparm = nextSibling(p); - compactdefargs = (nextparm && Getattr(nextparm,"compactdefargs")) ? 1 : 0; + compactdefargs = (nextparm && HashGetAttr(nextparm,k_compactdefargs)) ? 1 : 0; } } @@ -295,7 +294,7 @@ int ParmList_is_compactdefargs(ParmList *p) { int ParmList_has_defaultargs(ParmList *p) { int default_args = 0; while (p) { - if (Getattr(p, "value")) { + if (HashGetAttr(p, k_value)) { default_args = 1; break; } @@ -330,4 +329,3 @@ ParmList *ParmList_copy_all_except_last_parm(ParmList *p) { newparms = fp; return newparms; } - diff --git a/Source/Swig/swig.h b/Source/Swig/swig.h index f25d732e2..357778e53 100644 --- a/Source/Swig/swig.h +++ b/Source/Swig/swig.h @@ -22,6 +22,9 @@ #ifdef __cplusplus extern "C" { +#if 0 +} /* cc-mode*/ +#endif #endif #ifndef MACSWIG @@ -421,6 +424,18 @@ extern String *Swig_name_copyconstructor(const String_or_char *classname); extern String *Swig_name_destroy(const String_or_char *classname); extern String *Swig_name_disown(const String_or_char *classname); +extern void Swig_naming_init(); +extern void Swig_name_namewarn_add(String *prefix, String *name, SwigType *decl, Hash *namewrn); +extern Hash *Swig_name_namewarn_get(Node *n, String *prefix, String *name,SwigType *decl); +extern void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *namewrn, ParmList *declaratorparms); +extern void Swig_name_inherit(String *base, String *derived); +extern int Swig_need_protected(Node *n); +extern int Swig_need_name_warning(Node *n); +extern int Swig_need_redefined_warn(Node* a, Node* b, int InClass); + +extern String *Swig_name_make(Node *n, String *prefix, String *name, SwigType *decl, String *oldname); +extern String *Swig_name_warning(Node *n, String *prefix, String *name,SwigType *decl); + /* --- parameterized rename functions --- */ extern void Swig_name_object_set(Hash *namehash, String_or_char *name, SwigType *decl, DOH *object); @@ -536,19 +551,18 @@ extern void Swig_fragment_register(Node* fragment); extern void Swig_fragment_emit(String *name); /* hacks defined in C++ ! */ -extern int Swig_need_protected(); -extern int Swig_director_mode(); +extern int Swig_director_mode(); +extern void Wrapper_director_mode_set(int); /* -- template init -- */ extern void SwigType_template_init(); -/* -- naming init -- */ -extern void Swig_naming_init(); - - #ifdef __cplusplus +#if 0 +{ /* cc-mode*/ +#endif } #endif diff --git a/Source/Swig/swigkeys.c b/Source/Swig/swigkeys.c new file mode 100644 index 000000000..7866a92da --- /dev/null +++ b/Source/Swig/swigkeys.c @@ -0,0 +1,176 @@ +#include "swigkeys.h" + +String *empty_string = 0; +String *k_1 = 0; +String *k_SWIGTYPE = 0; +String *k_access = 0; +String *k_allowstypedef = 0; +String *k_alttype = 0; +String *k_argbyname = 0; +String *k_baselist = 0; +String *k_cdecl = 0; +String *k_class = 0; +String *k_classforward = 0; +String *k_code = 0; +String *k_coloncolon = 0; +String *k_compactdefargs = 0; +String *k_construct = 0; +String *k_constructor = 0; +String *k_conversionoperator = 0; +String *k_csymnextSibling = 0; +String *k_csympreviousSibling = 0; +String *k_csymtab = 0; +String *k_decl = 0; +String *k_destroy = 0; +String *k_destructor = 0; +String *k_disown = 0; +String *k_enumitem = 0; +String *k_error = 0; +String *k_extern = 0; +String *k_friend = 0; +String *k_fullname = 0; +String *k_get = 0; +String *k_hidden = 0; +String *k_ignore = 0; +String *k_inherit = 0; +String *k_kwargs = 0; +String *k_lname = 0; +String *k_locals = 0; +String *k_matchlist = 0; +String *k_member = 0; +String *k_name = 0; +String *k_namespace = 0; +String *k_nodetype = 0; +String *k_parent = 0; +String *k_parentnode = 0; +String *k_parm = 0; +String *k_parms = 0; +String *k_partialargs = 0; +String *k_partials = 0; +String *k_pattern = 0; +String *k_privatebaselist = 0; +String *k_protectedbaselist = 0; +String *k_public = 0; +String *k_qname = 0; +String *k_rename = 0; +String *k_scope = 0; +String *k_self = 0; +String *k_set = 0; +String *k_sourcefmt = 0; +String *k_start = 0; +String *k_static = 0; +String *k_storage = 0; +String *k_symboltable = 0; +String *k_symname = 0; +String *k_symnextSibling = 0; +String *k_symoverloaded = 0; +String *k_symovername = 0; +String *k_sympreviousSibling = 0; +String *k_symsymtab = 0; +String *k_symtab = 0; +String *k_symtypename = 0; +String *k_symweak = 0; +String *k_targetfmt = 0; +String *k_targetname = 0; +String *k_template = 0; +String *k_templateparm = 0; +String *k_templateparms = 0; +String *k_templatetype = 0; +String *k_throws = 0; +String *k_tmapmatch = 0; +String *k_type = 0; +String *k_typedef = 0; +String *k_typetab = 0; +String *k_uname = 0; +String *k_using = 0; +String *k_value = 0; +String *k_virtual = 0; +String *k_wrapper = 0; + +void Swig_keys_init() { + empty_string = NewString(""); + k_1 = NewString("1"); + k_SWIGTYPE = NewString("SWIGTYPE"); + k_access = NewString("access"); + k_allowstypedef = NewString("allows_typedef"); + k_alttype = NewString("alttype"); + k_argbyname = NewString("arg:byname"); + k_baselist = NewString("baselist"); + k_cdecl = NewString("cdecl"); + k_class = NewString("class"); + k_classforward = NewString("classforward"); + k_code = NewString("code"); + k_coloncolon = NewString("::"); + k_compactdefargs = NewString("compactdefargs"); + k_construct = NewString("construct"); + k_constructor = NewString("constructor"); + k_conversionoperator = NewString("conversion_operator"); + k_csymnextSibling = NewString("csym:nextSibling"); + k_csympreviousSibling = NewString("csym:previousSibling"); + k_csymtab = NewString("csymtab"); + k_decl = NewString("decl"); + k_destroy = NewString("destroy"); + k_destructor = NewString("destructor"); + k_disown = NewString("disown"); + k_enumitem = NewString("enumitem"); + k_error = NewString("error"); + k_friend = NewString("friend"); + k_fullname = NewString("fullname"); + k_get = NewString("get"); + k_hidden = NewString("hidden"); + k_ignore = NewString("ignore"); + k_inherit = NewString("inherit"); + k_kwargs = NewString("kwargs"); + k_lname = NewString("lname"); + k_locals = NewString("locals"); + k_matchlist = NewString("matchlist"); + k_member = NewString("member"); + k_name = NewString("name"); + k_namespace = NewString("namespace"); + k_nodetype = NewString("nodeType"); + k_parent = NewString("parent"); + k_parentnode = NewString("parentNode"); + k_parm = NewString("parm"); + k_parms = NewString("parms"); + k_partialargs = NewString("partialargs"); + k_partials = NewString("partials"); + k_pattern = NewString("pattern"); + k_privatebaselist = NewString("privatebaselist"); + k_protectedbaselist = NewString("protectedbaselist"); + k_public = NewString("public"); + k_qname = NewString("qname"); + k_rename = NewString("rename"); + k_scope = NewString("scope"); + k_self = NewString("self"); + k_set = NewString("set"); + k_sourcefmt = NewString("sourcefmt"); + k_start = NewString("*"); + k_static = NewString("static"); + k_storage = NewString("storage"); + k_symboltable = NewString("symboltable"); + k_symname = NewString("sym:name"); + k_symnextSibling = NewString("sym:nextSibling"); + k_symoverloaded = NewString("sym:overloaded"); + k_symovername = NewString("sym:overname"); + k_sympreviousSibling = NewString("sym:previousSibling"); + k_symsymtab = NewString("sym:symtab"); + k_symtab = NewString("symtab"); + k_symtypename = NewString("sym:typename"); + k_symweak = NewString("sym:weak"); + k_targetfmt = NewString("targetfmt"); + k_targetname = NewString("targetname"); + k_template = NewString("template"); + k_templateparm = NewString("templateparm"); + k_templateparms = NewString("templateparms"); + k_templatetype = NewString("templatetype"); + k_throws = NewString("throws"); + k_tmapmatch = NewString("tmap:match"); + k_type = NewString("type"); + k_typedef = NewString("typedef"); + k_typetab = NewString("typetab"); + k_uname = NewString("uname"); + k_using = NewString("using"); + k_value = NewString("value"); + k_virtual = NewString("virtual"); + k_wrapper = NewString("wrapper"); +} diff --git a/Source/Swig/swigkeys.h b/Source/Swig/swigkeys.h new file mode 100644 index 000000000..b6bb9bc65 --- /dev/null +++ b/Source/Swig/swigkeys.h @@ -0,0 +1,94 @@ +#ifndef __Swig_swigkeys_h__ +#define __Swig_swigkeys_h__ + +#include "swig.h" + +extern void Swig_keys_init(); + +extern String *empty_string; +extern String *k_1; +extern String *k_SWIGTYPE; +extern String *k_access; +extern String *k_allowstypedef; +extern String *k_alttype; +extern String *k_argbyname; +extern String *k_baselist; +extern String *k_cdecl; +extern String *k_class; +extern String *k_classforward; +extern String *k_code; +extern String *k_coloncolon; +extern String *k_compactdefargs; +extern String *k_construct; +extern String *k_constructor; +extern String *k_conversionoperator; +extern String *k_csymnextSibling; +extern String *k_csympreviousSibling; +extern String *k_csymtab; +extern String *k_decl; +extern String *k_destroy; +extern String *k_destructor; +extern String *k_disown; +extern String *k_enumitem; +extern String *k_error; +extern String *k_extern; +extern String *k_friend; +extern String *k_fullname; +extern String *k_get; +extern String *k_hidden; +extern String *k_ignore; +extern String *k_inherit; +extern String *k_kwargs; +extern String *k_lname; +extern String *k_locals; +extern String *k_matchlist; +extern String *k_member; +extern String *k_name; +extern String *k_namespace; +extern String *k_nodetype; +extern String *k_parent; +extern String *k_parentnode; +extern String *k_parm; +extern String *k_parms; +extern String *k_partialargs; +extern String *k_partials; +extern String *k_pattern; +extern String *k_privatebaselist; +extern String *k_protectedbaselist; +extern String *k_public; +extern String *k_qname; +extern String *k_rename; +extern String *k_scope; +extern String *k_self; +extern String *k_set; +extern String *k_sourcefmt; +extern String *k_start; +extern String *k_static; +extern String *k_storage; +extern String *k_symboltable; +extern String *k_symname; +extern String *k_symnextSibling; +extern String *k_symoverloaded; +extern String *k_symovername; +extern String *k_sympreviousSibling; +extern String *k_symsymtab; +extern String *k_symtab; +extern String *k_symtypename; +extern String *k_symweak; +extern String *k_targetfmt; +extern String *k_targetname; +extern String *k_template; +extern String *k_templateparm; +extern String *k_templateparms; +extern String *k_templatetype; +extern String *k_throws; +extern String *k_tmapmatch; +extern String *k_type; +extern String *k_typedef; +extern String *k_typetab; +extern String *k_uname; +extern String *k_using; +extern String *k_value; +extern String *k_virtual; +extern String *k_wrapper; +#endif /* __Swig_swigkeys_h__ */ diff --git a/Source/Swig/symbol.c b/Source/Swig/symbol.c index e64b5c990..8d7a63800 100644 --- a/Source/Swig/symbol.c +++ b/Source/Swig/symbol.c @@ -13,6 +13,7 @@ char cvsroot_symbol_c[] = "$Header$"; #include "swig.h" #include "swigwarn.h" +#include "swigkeys.h" #include /* #define SWIG_DEBUG*/ @@ -176,41 +177,6 @@ static Hash *global_scope = 0; /* Global scope */ /* common attribute keys, to avoid calling find_key all the times */ -static String *empty_string = 0; -static String *k_allowstypedef = 0; -static String *k_cdecl = 0; -static String *k_coloncolon = 0; -static String *k_constructor = 0; -static String *k_csymnextSibling = 0; -static String *k_csympreviousSibling = 0; -static String *k_csymtab = 0; -static String *k_decl = 0; -static String *k_enumitem = 0; -static String *k_inherit = 0; -static String *k_name = 0; -static String *k_namespace = 0; -static String *k_nodetype = 0; -static String *k_parentnode = 0; -static String *k_storage = 0; -static String *k_symboltable = 0; -static String *k_symname = 0; -static String *k_symnextSibling = 0; -static String *k_symoverloaded = 0; -static String *k_symovername = 0; -static String *k_sympreviousSibling = 0; -static String *k_symsymtab = 0; -static String *k_symtab = 0; -static String *k_symtypename = 0; -static String *k_symweak = 0; -static String *k_template = 0; -static String *k_templateparm = 0; -static String *k_templateparms = 0; -static String *k_templatetype = 0; -static String *k_type = 0; -static String *k_typedef = 0; -static String *k_uname = 0; -static String *k_using = 0; -static String *k_value = 0; #if 0 @@ -236,41 +202,6 @@ Swig_symbol_dump_symtable() { void Swig_symbol_init() { - empty_string = NewString(""); - k_allowstypedef = NewString("allows_typedef"); - k_cdecl = NewString("cdecl"); - k_coloncolon = NewString("::"); - k_constructor = NewString("constructor"); - k_csymnextSibling = NewString("csym:nextSibling"); - k_csympreviousSibling = NewString("csym:previousSibling"); - k_csymtab = NewString("csymtab"); - k_decl = NewString("decl"); - k_enumitem = NewString("enumitem"); - k_inherit = NewString("inherit"); - k_name = NewString("name"); - k_namespace = NewString("namespace"); - k_nodetype = NewString("nodeType"); - k_parentnode = NewString("parentNode"); - k_storage = NewString("storage"); - k_symboltable = NewString("symboltable"); - k_symname = NewString("sym:name"); - k_symnextSibling = NewString("sym:nextSibling"); - k_symoverloaded = NewString("sym:overloaded"); - k_symovername = NewString("sym:overname"); - k_sympreviousSibling = NewString("sym:previousSibling"); - k_symsymtab = NewString("sym:symtab"); - k_symtab = NewString("symtab"); - k_symtypename = NewString("sym:typename"); - k_symweak = NewString("sym:weak"); - k_template = NewString("template"); - k_templateparm = NewString("templateparm"); - k_templateparms = NewString("templateparms"); - k_templatetype = NewString("templatetype"); - k_type = NewString("type"); - k_typedef = NewString("typedef"); - k_uname = NewString("uname"); - k_using = NewString("using"); - k_value = NewString("value"); current = NewHash(); current_symtab = NewHash(); @@ -1947,3 +1878,6 @@ SwigType *Swig_symbol_template_param_eval(const SwigType *p, Symtab *symtab) } return value; } + + + diff --git a/Source/Swig/tree.c b/Source/Swig/tree.c index e88ae5e60..4b3837d7a 100644 --- a/Source/Swig/tree.c +++ b/Source/Swig/tree.c @@ -247,9 +247,7 @@ Swig_tag_nodes(Node *n, const String_or_char *attrname, DOH *value) { int checkAttribute(Node *n, const String_or_char *name, const String_or_char *value) { String *v = Getattr(n,name); - if (!v) return 0; - if (Equal(v,value)) return 1; - return 0; + return v ? Equal(v,value) : 0; } /* ----------------------------------------------------------------------------- @@ -410,3 +408,5 @@ Swig_restore(Node *n) { } Delete(l); } + + diff --git a/Source/Swig/typemap.c b/Source/Swig/typemap.c index 8740f9c24..05515c23a 100644 --- a/Source/Swig/typemap.c +++ b/Source/Swig/typemap.c @@ -12,6 +12,7 @@ char cvsroot_typemap_c[] = "$Header$"; #include "swig.h" +#include "swigkeys.h" #include "cparse.h" #include @@ -85,16 +86,6 @@ static void set_typemap(int tm_scope, SwigType* type, Hash* tm) * * Initialize the typemap system * ----------------------------------------------------------------------------- */ -static String *k_type = 0; -static String *k_code = 0; -static String *k_name = 0; -static String *k_lname = 0; -static String *k_locals = 0; -static String *k_value = 0; -static String *k_tmapmatch = 0; -static String *k_kwargs = 0; -static String *k_SWIGTYPE = 0; -static String *k_one = 0; void Swig_typemap_init() { int i; @@ -103,17 +94,6 @@ void Swig_typemap_init() { } typemaps[0] = NewHash(); tm_scope = 0; - - k_type = NewString("type"); - k_code = NewString("code"); - k_name = NewString("name"); - k_lname = NewString("lname"); - k_locals = NewString("locals"); - k_value = NewString("value"); - k_tmapmatch = NewString("tmap:match"); - k_SWIGTYPE = NewString("SWIGTYPE"); - k_kwargs = NewString("kwargs"); - k_one = NewString("1"); } static String *tmop_name(const String_or_char *op) { @@ -1338,7 +1318,7 @@ Printf(stdout, "Swig_typemap_lookup %s [%s %s]\n", op, type, pname ? pname : "NO if (HashCheckAttr(tm,k_type,k_SWIGTYPE)) { sprintf(temp,"%s:SWIGTYPE", cop); - Setattr(node,tmop_name(temp),k_one); + Setattr(node,tmop_name(temp),k_1); } /* Attach kwargs */ @@ -1565,7 +1545,7 @@ Swig_typemap_attach_parms(const String_or_char *op, ParmList *parms, Wrapper *f) if (HashCheckAttr(tm,k_type,k_SWIGTYPE)) { sprintf(temp,"%s:SWIGTYPE", cop); - Setattr(p,tmop_name(temp),k_one); + Setattr(p,tmop_name(temp),k_1); } p = nextSibling(p); } diff --git a/Source/Swig/typesys.c b/Source/Swig/typesys.c index 7a2b0ec53..6dedc911b 100644 --- a/Source/Swig/typesys.c +++ b/Source/Swig/typesys.c @@ -15,6 +15,7 @@ char cvsroot_typesys_c[] = "$Header$"; #include "swig.h" +#include "swigkeys.h" #include "cparse.h" /* ----------------------------------------------------------------------------- @@ -111,17 +112,6 @@ static Hash *typedef_all_cache = 0; static Hash *typedef_qualified_cache = 0; /* common attribute keys, to avoid calling find_key all the times */ -static String *k_name = 0; -static String *k_qname = 0; -static String *k_symtab = 0; -static String *k_using = 0; -static String *k_scope = 0; -static String *k_typetab = 0; -static String *k_inherit = 0; -static String *k_parent = 0; -static String *k_value = 0; -static String *k_nodetype = 0; -static String *k_class = 0; /* Enable this one if your language fully support SwigValueWrapper. @@ -150,18 +140,6 @@ static void flush_cache() { /* Initialize the scoping system */ void SwigType_typesystem_init() { - k_name = NewString("name"); - k_qname = NewString("qname"); - k_symtab = NewString("symtab"); - k_using = NewString("using"); - k_scope = NewString("scope"); - k_typetab = NewString("typetab"); - k_inherit = NewString("inherit"); - k_parent = NewString("parent"); - k_value = NewString("value"); - k_nodetype = NewString("nodeType"); - k_class = NewString("class"); - if (global_scope) Delete(global_scope); if (scopes) Delete(scopes);