Generate C++ wrappers for the global functions too

This ensures that global functions can also use C++ classes, enums etc
for their parameters and return types.

C++ wrappers for a couple of tests had to be disabled, but this is not
really a regression as wrapping global functions just made apparent
problems that were not visible before because the corresponding wrappers
were not created at all.
This commit is contained in:
Vadim Zeitlin 2021-12-07 20:49:15 +01:00
commit 86dbf6bcb5
2 changed files with 27 additions and 0 deletions

View file

@ -112,6 +112,8 @@ director_frob.cpptest: SWIG_NOCXX = -nocxx # Conversion operator return type.
extend_template_method.cpptest: SWIG_NOCXX = -nocxx # Wrong form of template function name.
features.cpptest: SWIG_NOCXX = -nocxx # Conversion operator return type not handled specially.
global_namespace.cpptest: SWIG_NOCXX = -nocxx # Const const reference type.
li_carrays_cpp.cpptest: SWIG_NOCXX = -nocxx # Arrays not really supported currently.
li_cdata_cpp.cpptest: SWIG_NOCXX = -nocxx # No support for multiarg typemaps required here.
member_template.cpptest: SWIG_NOCXX = -nocxx # Wrong form of template function name.
multiple_inheritance_abstract.cpptest: SWIG_NOCXX = -nocxx # Multiple inheritance not supported.
multiple_inheritance_interfaces.cpptest: SWIG_NOCXX = -nocxx
@ -133,6 +135,7 @@ return_const_value.cpptest: SWIG_NOCXX = -nocxx
smart_pointer_member.cpptest: SWIG_NOCXX = -nocxx
smart_pointer_template_const_overload.cpptest: SWIG_NOCXX = -nocxx
smart_pointer_templatemethods.cpptest: SWIG_NOCXX = -nocxx # Wrong form of template function name.
struct_initialization_cpp.cpptest: SWIG_NOCXX = -nocxx # Arrays in initialization not supported.
template_const_ref.cpptest: SWIG_NOCXX = -nocxx
template_default_arg_overloaded.cpptest: SWIG_NOCXX = -nocxx
template_inherit_abstract.cpptest: SWIG_NOCXX = -nocxx
@ -141,6 +144,7 @@ template_nested.cpptest: SWIG_NOCXX = -nocxx
template_nested_flat.cpptest: SWIG_NOCXX = -nocxx
template_qualifier.cpptest: SWIG_NOCXX = -nocxx
template_static.cpptest: SWIG_NOCXX = -nocxx
typemap_array_qualifiers.cpptest: SWIG_NOCXX = -nocxx # Arrays not supported.
valuewrapper_const.cpptest: SWIG_NOCXX = -nocxx # Misplaced const.
# Avoid conflict with the C++ keyword for some tests.

View file

@ -920,6 +920,8 @@ public:
bool can_wrap() const { return func_node != NULL; }
// Emit just the function body, including the braces around it.
//
// This helper is used both by our emit() and emit_member_function().
void emit_body(String* wparms) {
String* const wname = Getattr(func_node, "wrap:name");
@ -947,6 +949,23 @@ public:
Append(cxx_wrappers_.sect_impls, "}\n");
}
// Do emit the function wrapper.
void emit() {
// The wrapper function name should be sym:name, but we change it to include the namespace prefix in our own globalvariableHandler(), so now we have to undo
// this by using the value saved there, if available. This is definitely clumsy and it would be better to avoid it, but this would probably need to be done
// by separating C and C++ wrapper generation in two different passes and so would require significantly more changes than this hack.
String* name = Getattr(func_node, "c:globalvariableHandler:sym:name");
if (!name)
name = Getattr(func_node, "sym:name");
Printv(cxx_wrappers_.sect_impls,
"inline ", rtype_desc.type(), " ", name, "(", parms_cxx.get(), ") ",
NIL
);
emit_body(parms_call);
}
cxx_wrappers& cxx_wrappers_;
Node* func_node;
@ -2496,6 +2515,10 @@ public:
if (cxx_class_wrapper_) {
cxx_class_wrapper_->emit_member_function(n);
} else {
cxx_function_wrapper w(cxx_wrappers_, n, Getattr(n, "parms"));
if (w.can_wrap())
w.emit();
}
}