Modify r_ltype in typesys.c to store a hashtable instead of a single value

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9933 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
John Lenz 2007-09-05 05:40:35 +00:00
commit 38f6ca7f15
2 changed files with 59 additions and 20 deletions

View file

@ -1,5 +1,11 @@
Version 1.3.32 (in progress) Version 1.3.32 (in progress)
============================ ============================
09/05/2007: wuzzeb (John Lenz)
- Change r_ltype in typesys.c to store a hashtable instead of a single value.
several very subtle bugs were being caused by multiple ltypes being mapped
to a single mangled type, mostly when using typedefed template parameters.
Now, r_ltype stores a hashtable of possible ltypes, and when generating the
type table, all the ltypes are added into the swig_type_info structure.
08/31/2007: wsfulton 08/31/2007: wsfulton
SF #1754967 from James Bigler. SF #1754967 from James Bigler.

View file

@ -1428,6 +1428,7 @@ void SwigType_remember_clientdata(SwigType *t, const String_or_char *clientdata)
SwigType *qr; SwigType *qr;
String *tkey; String *tkey;
String *cd; String *cd;
Hash *lthash;
if (!r_mangled) { if (!r_mangled) {
r_mangled = NewHash(); r_mangled = NewHash();
@ -1461,8 +1462,15 @@ void SwigType_remember_clientdata(SwigType *t, const String_or_char *clientdata)
} else { } else {
lt = SwigType_ltype(t); lt = SwigType_ltype(t);
} }
Setattr(r_ltype, mt, lt);
lthash = Getattr(r_ltype, mt);
if (!lthash) {
lthash = NewHash();
Setattr(r_ltype, mt, lthash);
}
Setattr(lthash, lt, "1");
Delete(lt); Delete(lt);
fr = SwigType_typedef_resolve_all(t); /* Create fully resolved type */ fr = SwigType_typedef_resolve_all(t); /* Create fully resolved type */
qr = SwigType_typedef_qualified(fr); qr = SwigType_typedef_qualified(fr);
Delete(fr); Delete(fr);
@ -1866,7 +1874,7 @@ void SwigType_emit_type_table(File *f_forward, File *f_table) {
SwigType_inherit_equiv(f_table); SwigType_inherit_equiv(f_table);
/* #define DEBUG 1 */ /*#define DEBUG 1*/
#ifdef DEBUG #ifdef DEBUG
Printf(stdout, "---r_mangled---\n"); Printf(stdout, "---r_mangled---\n");
Printf(stdout, "%s\n", r_mangled); Printf(stdout, "%s\n", r_mangled);
@ -1903,11 +1911,14 @@ void SwigType_emit_type_table(File *f_forward, File *f_table) {
List *el; List *el;
Iterator ei; Iterator ei;
SwigType *lt; SwigType *lt;
SwigType *rt; SwigType *rt = 0;
String *nt; String *nt;
String *ln; String *ln;
String *rn; String *rn;
const String *cd; const String *cd;
Hash *lthash;
Iterator ltiter;
Hash *nthash;
cast_temp = NewStringEmpty(); cast_temp = NewStringEmpty();
@ -1920,26 +1931,48 @@ void SwigType_emit_type_table(File *f_forward, File *f_table) {
if (!cd) if (!cd)
cd = "0"; cd = "0";
lt = Getattr(r_ltype, ki.item); lthash = Getattr(r_ltype, ki.item);
rt = SwigType_typedef_resolve_all(lt); nt = 0;
/* we save the original type and the fully resolved version */ nthash = NewHash();
ln = SwigType_lstr(lt, 0); ltiter = First(lthash);
rn = SwigType_lstr(rt, 0); while (ltiter.key) {
if (Equal(ln, rn)) { lt = ltiter.key;
nt = NewString(ln); rt = SwigType_typedef_resolve_all(lt);
} else { /* we save the original type and the fully resolved version */
nt = NewStringf("%s|%s", rn, ln); ln = SwigType_lstr(lt, 0);
} rn = SwigType_lstr(rt, 0);
if (SwigType_istemplate(rt)) { if (Equal(ln, rn)) {
String *dt = Swig_symbol_template_deftype(rt, 0); Setattr(nthash, ln, "1");
String *dn = SwigType_lstr(dt, 0); } else {
if (!Equal(dn, rn) && !Equal(dn, ln)) { Setattr(nthash, rn, "1");
Printf(nt, "|%s", dn); Setattr(nthash, ln, "1");
} }
Delete(dt); if (SwigType_istemplate(rt)) {
Delete(dn); String *dt = Swig_symbol_template_deftype(rt, 0);
String *dn = SwigType_lstr(dt, 0);
if (!Equal(dn, rn) && !Equal(dn, ln)) {
Setattr(nthash, dn, "1");
}
Delete(dt);
Delete(dn);
}
ltiter = Next(ltiter);
} }
/* now build nt */
ltiter = First(nthash);
nt = 0;
while (ltiter.key) {
if (nt) {
Printf(nt, "|%s", ltiter.key);
} else {
nt = NewString(ltiter.key);
}
ltiter = Next(ltiter);
}
Delete(nthash);
Printf(types, "\"%s\", \"%s\", 0, 0, (void*)%s, 0};\n", ki.item, nt, cd); Printf(types, "\"%s\", \"%s\", 0, 0, (void*)%s, 0};\n", ki.item, nt, cd);
el = SwigType_equivalent_mangle(ki.item, 0, 0); el = SwigType_equivalent_mangle(ki.item, 0, 0);