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.
This commit is contained in:
William S Fulton 2022-11-12 06:42:36 +00:00
commit 6a9be797e1
9 changed files with 51 additions and 42 deletions

View file

@ -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));

View file

@ -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) {

View file

@ -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;
}

View file

@ -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);

View file

@ -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);
}