Use SWIG-specific for non-overloaded synthesized functions too

This avoids conflicts between such functions, which are generated when
using %extend to add static methods to an existing class, and the actual
wrapper functions generated by the backend.

This shouldn't result in any user-visible changes.
This commit is contained in:
Vadim Zeitlin 2021-11-09 23:33:31 +01:00
commit 26bf86322b
2 changed files with 15 additions and 3 deletions

View file

@ -1321,8 +1321,11 @@ int Language::staticmemberfunctionHandler(Node *n) {
mrename = mangled; mrename = mangled;
if (code) { if (code) {
// See Swig_MethodToFunction() for the explanation of this code.
if (Getattr(n, "sym:overloaded")) { if (Getattr(n, "sym:overloaded")) {
Append(cname, Getattr(defaultargs ? defaultargs : n, "sym:overname")); Append(cname, Getattr(defaultargs ? defaultargs : n, "sym:overname"));
} else {
Append(cname, "__SWIG");
} }
if (!defaultargs) { if (!defaultargs) {

View file

@ -1076,9 +1076,18 @@ int Swig_MethodToFunction(Node *n, const_String_or_char_ptr nspace, String *clas
/* Check if the method is overloaded. If so, and it has code attached, we append an extra suffix /* Check if the method is overloaded. If so, and it has code attached, we append an extra suffix
to avoid a name-clash in the generated wrappers. This allows overloaded methods to be defined to avoid a name-clash in the generated wrappers. This allows overloaded methods to be defined
in C. */ in C.
if (Getattr(n, "sym:overloaded") && code) {
Append(mangled, Getattr(defaultargs ? defaultargs : n, "sym:overname")); But when not using the suffix used for overloaded functions, we still need to ensure that the
wrapper name doesn't conflict with any wrapper functions, so make it sufficiently unique by
appending a suffix similar to the one used for overloaded functions to it.
*/
if (code) {
if (Getattr(n, "sym:overloaded")) {
Append(mangled, Getattr(defaultargs ? defaultargs : n, "sym:overname"));
} else {
Append(mangled, "__SWIG");
}
} }
/* See if there is any code that we need to emit */ /* See if there is any code that we need to emit */