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:
parent
f4b9fd381d
commit
38f6ca7f15
2 changed files with 59 additions and 20 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue