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:
parent
2acdfd77e9
commit
6a9be797e1
9 changed files with 51 additions and 42 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue