remove symbol fix for when the symbol/function is overloaded. Fixes some obscure %extend bugs when the methods are overloaded or have default arguments.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6329 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2004-10-05 22:18:13 +00:00
commit 60d5d3c855

View file

@ -1059,7 +1059,9 @@ Swig_symbol_cscope(String_or_char *name, Symtab *symtab) {
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* Swig_symbol_remove() * Swig_symbol_remove()
* *
* Remove a symbol * Remove a symbol. If the symbol is an overloaded function and the symbol removed
* is not the last in the list of overloaded functions, then the overloaded
* names (sym:overname attribute) are changed to start from zero, eg __SWIG_0.
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
void void
@ -1068,6 +1070,7 @@ Swig_symbol_remove(Node *n) {
String *symname; String *symname;
Node *symprev; Node *symprev;
Node *symnext; Node *symnext;
Node *fixovername = 0;
symtab = Getattr(n,"sym:symtab"); /* Get symbol table object */ symtab = Getattr(n,"sym:symtab"); /* Get symbol table object */
symtab = Getattr(symtab,"symtab"); /* Get actual hash table of symbols */ symtab = Getattr(symtab,"symtab"); /* Get actual hash table of symbols */
symname = Getattr(n,"sym:name"); symname = Getattr(n,"sym:name");
@ -1078,6 +1081,7 @@ Swig_symbol_remove(Node *n) {
if (symprev) { if (symprev) {
if (symnext) { if (symnext) {
Setattr(symprev,"sym:nextSibling",symnext); Setattr(symprev,"sym:nextSibling",symnext);
fixovername = symprev; /* fix as symbol to remove is somewhere in the middle of the linked list */
} else { } else {
Delattr(symprev,"sym:nextSibling"); Delattr(symprev,"sym:nextSibling");
} }
@ -1085,6 +1089,7 @@ Swig_symbol_remove(Node *n) {
/* If no previous symbol, see if there is a next symbol */ /* If no previous symbol, see if there is a next symbol */
if (symnext) { if (symnext) {
Setattr(symtab,symname,symnext); Setattr(symtab,symname,symnext);
fixovername = symnext; /* fix as symbol to remove is at head of linked list */
} else { } else {
Delattr(symtab,symname); Delattr(symtab,symname);
} }
@ -1103,34 +1108,29 @@ Swig_symbol_remove(Node *n) {
Delattr(n,"sym:overname"); Delattr(n,"sym:overname");
Delattr(n,"csym:previousSibling"); Delattr(n,"csym:previousSibling");
Delattr(n,"sym:overloaded"); Delattr(n,"sym:overloaded");
return; n = 0;
#if 0 if (fixovername) {
symtab = Getattr(n,"sym:symtab"); /* Get symbol table object */ Node *nn = fixovername;
symtab = Getattr(symtab,"csymtab"); /* Get actual hash table of symbols */ Node *head = fixovername;
symprev = Getattr(n,"csym:previousSibling"); int pn = 0;
symnext = Getattr(n,"csym:nextSibling");
/* If previous symbol, just fix the links */ /* find head of linked list */
if (symprev) { while (nn) {
if (symnext) { head = nn;
Setattr(symprev,"csym:nextSibling",symnext); nn = Getattr(nn, "sym:previousSibling");
} else {
Delattr(symprev,"csym:nextSibling");
} }
} else {
/* If no previous symbol, see if there is a next symbol */ /* adjust all the sym:overname strings to start from 0 and increment by one */
if (symnext) { nn = head;
Setattr(symtab,Getattr(n,"name"),symnext); while (nn) {
} else { assert(Getattr(nn,"sym:overname"));
Delattr(symtab,Getattr(n,"name")); Delattr(nn,"sym:overname");
Setattr(nn,"sym:overname", NewStringf("__SWIG_%d", pn));
pn++;
nn = Getattr(nn,"sym:nextSibling");
} }
} }
Delattr(n,"sym:symtab");
Delattr(n,"csym:previousSibling");
Delattr(n,"csym:nextSibling");
#endif
} }
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------