From 2a573e9a0875c669879a7a5fe7240aebfb6c4df0 Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Tue, 10 Feb 2004 08:37:30 +0000 Subject: [PATCH] Keep the old non-resolved type str and add the fully resolved one if is needed. Add examples showing the problem with SWIG_TypeQuery and template+typedef and the old type str, and how it works now. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5704 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- .../python/template_typedef_runme.py | 12 ++++++ Examples/test-suite/template_typedef.i | 1 + Lib/common.swg | 38 +++++++++++++------ Source/Swig/typesys.c | 22 +++++++++-- 4 files changed, 58 insertions(+), 15 deletions(-) diff --git a/Examples/test-suite/python/template_typedef_runme.py b/Examples/test-suite/python/template_typedef_runme.py index cf73d5919..f4491a7b7 100644 --- a/Examples/test-suite/python/template_typedef_runme.py +++ b/Examples/test-suite/python/template_typedef_runme.py @@ -31,3 +31,15 @@ except: print g, "is not an instance" raise RuntimeError + +# the old large format +if not SWIG_TypeQuery("vfncs::ArithUnaryFunction::argument_type,vfncs::arith_traits::result_type > *"): + raise RuntimeError + +# the reduced format +if not SWIG_TypeQuery("vfncs::ArithUnaryFunction *"): + raise RuntimeError + +# this is a bad name +if SWIG_TypeQuery("vfncs::ArithUnaryFunction *"): + raise RuntimeError diff --git a/Examples/test-suite/template_typedef.i b/Examples/test-suite/template_typedef.i index 1891e711b..f84693faa 100644 --- a/Examples/test-suite/template_typedef.i +++ b/Examples/test-suite/template_typedef.i @@ -171,3 +171,4 @@ namespace vfncs { } +swig_type_info *SWIG_TypeQuery(const char* name); diff --git a/Lib/common.swg b/Lib/common.swg index 8f5c1c5fa..9a4a7495d 100644 --- a/Lib/common.swg +++ b/Lib/common.swg @@ -175,25 +175,41 @@ SWIG_TypeName(const swig_type_info *ty) { strncmp, but skipping ' '. */ static int -SWIG_TypeNameComp(const char *name1, const char *name2) { - register size_t s1 = strlen(name1); - register size_t s2 = strlen(name2); - register size_t i1 = 0; - register size_t i2 = 0; - for( ; (i1 < s1) && (i2 < s2); ++i1, ++i2) { - while ((name1[i1] == ' ') && (i1 < s1)) ++i1; - while ((name2[i2] == ' ') && (i2 < s2)) ++i2; - if (name1[i1] != name2[i2]) return name1[i1] - name2[i2]; +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return *f1 - *f2; } - return (s1 - i1) - (s2 - i2); + return (l1 - f1) - (l2 - f2); } +/* + Check type equivalence in a name list like ||... +*/ +static int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = SWIG_TypeNameComp(nb, ne, tb, te) == 0; + if (*ne) ++ne; + } + return equiv; +} + + /* Search for a swig_type_info structure */ SWIGRUNTIME(swig_type_info *) SWIG_TypeQuery(const char *name) { swig_type_info *ty = swig_type_list; while (ty) { - if (ty->str && (SWIG_TypeNameComp(name,ty->str) == 0)) return ty; + if (ty->str && (SWIG_TypeEquiv(ty->str,name))) return ty; if (ty->name && (strcmp(name,ty->name) == 0)) return ty; ty = ty->prev; } diff --git a/Source/Swig/typesys.c b/Source/Swig/typesys.c index 781e4fcd9..11aee46c4 100644 --- a/Source/Swig/typesys.c +++ b/Source/Swig/typesys.c @@ -1674,7 +1674,11 @@ SwigType_emit_type_table(File *f_forward, File *f_table) { while (ki.key) { List *el; Iterator ei; - SwigType *ft; + SwigType *lt; + SwigType *rt; + String *nt; + String *ln; + String *rn; const String *cd; Printf(f_forward,"#define SWIGTYPE%s swig_types[%d] \n", ki.key, i); @@ -1682,8 +1686,17 @@ SwigType_emit_type_table(File *f_forward, File *f_table) { cd = SwigType_clientdata_collect(ki.key,0); if (!cd) cd = "0"; - ft = SwigType_typedef_resolve_all(Getattr(r_ltype,ki.key)); - Printv(types,"{\"", ki.key, "\", 0, \"",SwigType_str(ft,0),"\", ", cd, ", 0, 0, 0},", NIL); + lt = Getattr(r_ltype,ki.key); + rt = SwigType_typedef_resolve_all(lt); + /* we save the original type and the fully resolved version */ + ln = SwigType_str(lt,0); + rn = SwigType_str(rt,0); + if (Strcmp(ln,rn) == 0) { + nt = NewStringf("%s", ln); + } else { + nt = NewStringf("%s|%s", rn, ln); + } + Printv(types,"{\"", ki.key, "\", 0, \"",nt,"\", ", cd, ", 0, 0, 0},", NIL); el = SwigType_equivalent_mangle(ki.key,0,0); for (ei = First(el); ei.item; ei = Next(ei)) { String *ckey; @@ -1698,7 +1711,8 @@ SwigType_emit_type_table(File *f_forward, File *f_table) { Delete(ckey); } Delete(el); - Delete(ft); + Delete(nt); + Delete(rt); Printf(types,"{0, 0, 0, 0, 0, 0, 0}};\n"); Printv(table, "_swigt_", ki.key, ", \n", NIL); ki = Next(ki);