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:
parent
06989d7a7b
commit
60d5d3c855
1 changed files with 24 additions and 24 deletions
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue