From 6a9be797e127d83c1f1de77270bb8b93110dd495 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Sat, 12 Nov 2022 06:42:36 +0000 Subject: [PATCH] SwigType * handling corrections - mangling Further corrections to pass SwigType * to methods expecting types instead of passing readable type strings. Swig_string_mangle() takes a generic String *, but it was calling functions that require SwigType *. Swig_string_mangle_type() is now provided for SwigType *r. The special template handling on types now occurs in this function. --- Source/Modules/go.cxx | 12 ++++----- Source/Modules/lang.cxx | 4 ++- Source/Modules/octave.cxx | 2 +- Source/Modules/tcl8.cxx | 8 +++--- Source/Swig/fragment.c | 6 ++--- Source/Swig/misc.c | 51 +++++++++++++++++++++------------------ Source/Swig/naming.c | 5 +++- Source/Swig/swig.h | 1 + Source/Swig/typemap.c | 4 +-- 9 files changed, 51 insertions(+), 42 deletions(-) diff --git a/Source/Modules/go.cxx b/Source/Modules/go.cxx index bf63bec63..0d6ee958b 100644 --- a/Source/Modules/go.cxx +++ b/Source/Modules/go.cxx @@ -4656,8 +4656,8 @@ private: * 'X'. * ---------------------------------------------------------------------- */ - String *exportedName(String *name) { - String *copy = Copy(name); + String *exportedName(SwigType *name) { + SwigType *copy = Copy(name); char c = *Char(copy); if (islower(c)) { char l[2]; @@ -4677,7 +4677,7 @@ private: u[2] = '\0'; Replace(copy, l, u, DOH_REPLACE_FIRST); } - String *ret = Swig_name_mangle(copy); + String *ret = Swig_string_mangle_type(copy); Delete(copy); return ret; } @@ -5556,11 +5556,11 @@ private: return NewString("int"); } - String *type = Getattr(n, "enumtype"); + SwigType *type = Getattr(n, "enumtype"); assert(type); char *p = Char(type); int len = Len(type); - String *s = NewString(""); + SwigType *s = NewString(""); bool capitalize = true; for (int i = 0; i < len; ++i, ++p) { if (*p == ':') { @@ -5576,7 +5576,7 @@ private: } } - ret = Swig_name_mangle(s); + ret = Swig_string_mangle_type(s); Delete(s); return ret; } diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 1e10e51d6..b88f66549 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -1310,9 +1310,11 @@ int Language::staticmemberfunctionHandler(Node *n) { else cname = NewStringf("%s::%s", sname, name); } else { - String *mname = Swig_name_mangle(ClassName); + String *classname_str = SwigType_namestr(ClassName); + String *mname = Swig_name_mangle(classname_str); cname = Swig_name_member(NSpace, mname, name); Delete(mname); + Delete(classname_str); } mrename = Swig_name_member(NSpace, ClassPrefix, symname); diff --git a/Source/Modules/octave.cxx b/Source/Modules/octave.cxx index 352105b9b..aba76624d 100644 --- a/Source/Modules/octave.cxx +++ b/Source/Modules/octave.cxx @@ -946,7 +946,7 @@ public: // This is a bug, due to the fact that swig_type -> octave_class mapping // is 1-to-n. static Hash *emitted = NewHash(); - String *mangled_classname = Swig_name_mangle(Getattr(n, "name")); + String *mangled_classname = Swig_string_mangle_type(Getattr(n, "name")); if (Getattr(emitted, mangled_classname)) { Delete(mangled_classname); return SWIG_NOWRAP; diff --git a/Source/Modules/tcl8.cxx b/Source/Modules/tcl8.cxx index 975230e84..12a65e9b6 100644 --- a/Source/Modules/tcl8.cxx +++ b/Source/Modules/tcl8.cxx @@ -712,7 +712,7 @@ public: virtual int classHandler(Node *n) { static Hash *emitted = NewHash(); String *mangled_classname = 0; - String *real_classname = 0; + SwigType *real_classname = 0; have_constructor = 0; have_destructor = 0; @@ -740,7 +740,7 @@ public: return SWIG_ERROR; real_classname = Getattr(n, "name"); - mangled_classname = Swig_name_mangle(real_classname); + mangled_classname = Swig_string_mangle_type(real_classname); if (Getattr(emitted, mangled_classname)) return SWIG_NOWRAP; @@ -806,7 +806,7 @@ public: int index = 0; b = First(baselist); while (b.item) { - String *bname = Getattr(b.item, "name"); + SwigType *bname = Getattr(b.item, "name"); if ((!bname) || GetFlag(b.item, "feature:ignore") || (!Getattr(b.item, "module"))) { b = Next(b); continue; @@ -816,7 +816,7 @@ public: Printv(base_classes, bname, " ", NIL); Printv(base_class_init, " ", bname, "Ptr::constructor $ptr\n", NIL); } - String *bmangle = Swig_name_mangle(bname); + String *bmangle = Swig_string_mangle_type(bname); // Printv(f_wrappers,"extern swig_class _wrap_class_", bmangle, ";\n", NIL); // Printf(base_class,"&_wrap_class_%s",bmangle); Printf(base_class, "0"); diff --git a/Source/Swig/fragment.c b/Source/Swig/fragment.c index 03b231fa1..099eb0ef7 100644 --- a/Source/Swig/fragment.c +++ b/Source/Swig/fragment.c @@ -41,7 +41,7 @@ void Swig_fragment_register(Node *fragment) { String *type = Getattr(fragment, "type"); if (type) { SwigType *rtype = SwigType_typedef_resolve_all(type); - String *mangle = Swig_string_mangle(type); + String *mangle = Swig_string_mangle_type(type); Append(name, mangle); Delete(mangle); Delete(rtype); @@ -106,7 +106,7 @@ void Swig_fragment_emit(Node *n) { type = Getattr(n, "type"); if (type) { - mangle = Swig_string_mangle(type); + mangle = Swig_string_mangle_type(type); } if (debug) @@ -162,7 +162,7 @@ void Swig_fragment_emit(Node *n) { SwigType *rtype = SwigType_typedef_resolve_all(type); if (!Equal(type, rtype)) { String *name = Copy(Getattr(n, "value")); - String *mangle = Swig_string_mangle(type); + String *mangle = Swig_string_mangle_type(type); Append(name, mangle); Setfile(name, Getfile(n)); Setline(name, Getline(n)); diff --git a/Source/Swig/misc.c b/Source/Swig/misc.c index 7d1119c5e..af0b24951 100644 --- a/Source/Swig/misc.c +++ b/Source/Swig/misc.c @@ -702,6 +702,31 @@ String *Swig_string_typecode(String *s) { return ns; } +/* ----------------------------------------------------------------------------- + * Swig_string_mangle_type() + * + * Same as Swig_string_mangle, but converting internal SwigType * to a human + * readable string of the type (for templates). Simplifies a type that is a + * template to the default template if possible. + * ----------------------------------------------------------------------------- */ + +String *Swig_string_mangle_type(const SwigType *s) { + String *mangled = 0; + String *b = Copy(s); + if (SwigType_istemplate(b)) { + String *st = Swig_symbol_template_deftype(b, 0); + String *sq = Swig_symbol_type_qualify(st, 0); + String *t = SwigType_namestr(sq); + Delete(st); + Delete(sq); + Delete(b); + b = t; + } + mangled = Swig_string_mangle(b); + Delete(b); + return mangled; +} + /* ----------------------------------------------------------------------------- * Swig_string_mangle() * @@ -725,32 +750,12 @@ String *Swig_string_typecode(String *s) { * ----------------------------------------------------------------------------- */ String *Swig_string_mangle(const String *s) { -#if 0 - /* old mangling, not suitable for using in macros */ - String *t = Copy(s); - char *c = Char(t); - while (*c) { - if (!isalnum(*c)) - *c = '_'; - c++; - } - return t; -#else String *result = NewStringEmpty(); int space = 0; int state = 0; char *pc, *cb; - String *b = Copy(s); - if (SwigType_istemplate(b)) { - String *st = Swig_symbol_template_deftype(b, 0); - String *sq = Swig_symbol_type_qualify(st, 0); - String *t = SwigType_namestr(sq); - Delete(st); - Delete(sq); - Delete(b); - b = t; - } - pc = cb = Char(b); + + pc = cb = Char(s); while (*pc) { char c = *pc; if (isalnum((int) c) || (c == '_')) { @@ -856,9 +861,7 @@ String *Swig_string_mangle(const String *s) { } ++pc; } - Delete(b); return result; -#endif } String *Swig_string_emangle(String *s) { diff --git a/Source/Swig/naming.c b/Source/Swig/naming.c index c4613f6c6..da70b21dd 100644 --- a/Source/Swig/naming.c +++ b/Source/Swig/naming.c @@ -196,9 +196,11 @@ String *Swig_name_wrapper(const_String_or_char_ptr fname) { String *Swig_name_member(const_String_or_char_ptr nspace, const_String_or_char_ptr classname, const_String_or_char_ptr membername) { String *r; String *rclassname; + String *rmembername; char *cname; rclassname = SwigType_namestr(classname); + rmembername = SwigType_namestr(membername); r = get_naming_format_for("member", "%n%c_%m"); cname = Char(rclassname); if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) { @@ -206,9 +208,10 @@ String *Swig_name_member(const_String_or_char_ptr nspace, const_String_or_char_p } replace_nspace(r, nspace); Replace(r, "%c", cname, DOH_REPLACE_ANY); - Replace(r, "%m", membername, DOH_REPLACE_ANY); + Replace(r, "%m", rmembername, DOH_REPLACE_ANY); /* name_mangle(r); */ Delete(rclassname); + Delete(rmembername); return r; } diff --git a/Source/Swig/swig.h b/Source/Swig/swig.h index 19e61b455..d0156e53f 100644 --- a/Source/Swig/swig.h +++ b/Source/Swig/swig.h @@ -324,6 +324,7 @@ extern int ParmList_is_compactdefargs(ParmList *p); extern int Swig_storage_isstatic(Node *n); extern String *Swig_string_escape(String *s); extern String *Swig_string_mangle(const String *s); + extern String *Swig_string_mangle_type(const SwigType *s); extern void Swig_scopename_split(const String *s, String **prefix, String **last); extern String *Swig_scopename_prefix(const String *s); extern String *Swig_scopename_last(const String *s); diff --git a/Source/Swig/typemap.c b/Source/Swig/typemap.c index 28e87702c..7132ab700 100644 --- a/Source/Swig/typemap.c +++ b/Source/Swig/typemap.c @@ -1293,7 +1293,7 @@ static void typemap_merge_fragment_kwargs(Parm *kw) { reattach_kw = prev_kw; } if (kwtype) { - String *mangle = Swig_string_mangle(kwtype); + String *mangle = Swig_string_mangle_type(kwtype); Append(fragment, mangle); Delete(mangle); /* Remove 'type' from kwargs so it's not duplicated later */ @@ -1541,7 +1541,7 @@ static String *Swig_typemap_lookup_impl(const_String_or_char_ptr tmap_method, No Delete(parm_sublist); } if (kwtype) { - String *mangle = Swig_string_mangle(kwtype); + String *mangle = Swig_string_mangle_type(kwtype); Append(value, mangle); Delete(mangle); }