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()
|
||||
*
|
||||
* 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
|
||||
|
|
@ -1068,6 +1070,7 @@ Swig_symbol_remove(Node *n) {
|
|||
String *symname;
|
||||
Node *symprev;
|
||||
Node *symnext;
|
||||
Node *fixovername = 0;
|
||||
symtab = Getattr(n,"sym:symtab"); /* Get symbol table object */
|
||||
symtab = Getattr(symtab,"symtab"); /* Get actual hash table of symbols */
|
||||
symname = Getattr(n,"sym:name");
|
||||
|
|
@ -1078,6 +1081,7 @@ Swig_symbol_remove(Node *n) {
|
|||
if (symprev) {
|
||||
if (symnext) {
|
||||
Setattr(symprev,"sym:nextSibling",symnext);
|
||||
fixovername = symprev; /* fix as symbol to remove is somewhere in the middle of the linked list */
|
||||
} else {
|
||||
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 (symnext) {
|
||||
Setattr(symtab,symname,symnext);
|
||||
fixovername = symnext; /* fix as symbol to remove is at head of linked list */
|
||||
} else {
|
||||
Delattr(symtab,symname);
|
||||
}
|
||||
|
|
@ -1103,34 +1108,29 @@ Swig_symbol_remove(Node *n) {
|
|||
Delattr(n,"sym:overname");
|
||||
Delattr(n,"csym:previousSibling");
|
||||
Delattr(n,"sym:overloaded");
|
||||
return;
|
||||
n = 0;
|
||||
|
||||
#if 0
|
||||
symtab = Getattr(n,"sym:symtab"); /* Get symbol table object */
|
||||
symtab = Getattr(symtab,"csymtab"); /* Get actual hash table of symbols */
|
||||
symprev = Getattr(n,"csym:previousSibling");
|
||||
symnext = Getattr(n,"csym:nextSibling");
|
||||
if (fixovername) {
|
||||
Node *nn = fixovername;
|
||||
Node *head = fixovername;
|
||||
int pn = 0;
|
||||
|
||||
/* If previous symbol, just fix the links */
|
||||
if (symprev) {
|
||||
if (symnext) {
|
||||
Setattr(symprev,"csym:nextSibling",symnext);
|
||||
} else {
|
||||
Delattr(symprev,"csym:nextSibling");
|
||||
/* find head of linked list */
|
||||
while (nn) {
|
||||
head = nn;
|
||||
nn = Getattr(nn, "sym:previousSibling");
|
||||
}
|
||||
} else {
|
||||
/* If no previous symbol, see if there is a next symbol */
|
||||
if (symnext) {
|
||||
Setattr(symtab,Getattr(n,"name"),symnext);
|
||||
} else {
|
||||
Delattr(symtab,Getattr(n,"name"));
|
||||
|
||||
/* adjust all the sym:overname strings to start from 0 and increment by one */
|
||||
nn = head;
|
||||
while (nn) {
|
||||
assert(Getattr(nn,"sym:overname"));
|
||||
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