Skip to content

Commit

Permalink
Use exact type for temporary variable wrapping parameters with defaul…
Browse files Browse the repository at this point in the history
…t args and compactdefaultargs

When wrapping a default argument such as 'const bool& x = true'
a variable with the exact same type, such as:

  bool const &arg2_defvalue = true;

is now used in the generated code instead of a dereferenced type:

  bool arg2_defvalue = true;

This can still be used for the wrapped argument without any other
changes:

  bool *arg2 = (bool *) &arg2_defrvalue;

and the lifetimes are still the same for the temporary variable.

Works around some typedef issues for enum classes introduced in the
previous commit in the cpp11_strongly_typed_enumerations testcase,
when wrapping a parameter 'const PRINT_SETUP& e = PRINT_SETUP::TO_CONSOLE'
The temporary variable being generated became:

  enum MyClass::PRINT_SETUP arg2_defvalue = MyClass::PRINT_SETUP::TO_CONSOLE ;

The enum in the type is wrong for an enum class. Now the original type
is used:

  MyClass::PRINT_SETUP const &arg2_defvalue = MyClass::PRINT_SETUP::TO_CONSOLE ;
  • Loading branch information
wsfulton committed Nov 4, 2024
1 parent 4a8b246 commit 9a4609c
Showing 1 changed file with 12 additions and 40 deletions.
52 changes: 12 additions & 40 deletions Source/Swig/cwrap.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,55 +240,27 @@ int Swig_cargs(Wrapper *w, ParmList *p) {
int tycode = SwigType_type(type);
if (tycode == T_REFERENCE) {
if (pvalue) {
SwigType *tvalue;
String *defname, *defvalue, *rvalue, *qvalue;
rvalue = SwigType_typedef_resolve_all(pvalue);
qvalue = SwigType_typedef_qualified(rvalue);
defname = NewStringf("%s_defvalue", lname);
tvalue = Copy(type);
SwigType_del_reference(tvalue);
tycode = SwigType_type(tvalue);
if (tycode != T_USER) {
/* plain primitive type, we copy the def value */
String *lstr = SwigType_lstr(tvalue, defname);
defvalue = NewStringf("%s = %s", lstr, qvalue);
Delete(lstr);
} else {
/* user type, we copy the reference value */
String *str = SwigType_str(type, defname);
defvalue = NewStringf("%s = %s", str, qvalue);
Delete(str);
}
String *rvalue = SwigType_typedef_resolve_all(pvalue);
String *qvalue = SwigType_typedef_qualified(rvalue);
String *defname = NewStringf("%s_defvalue", lname);
String *str = SwigType_str(pt, defname);
String *defvalue = NewStringf("%s = %s", str, qvalue);
Wrapper_add_localv(w, defname, defvalue, NIL);
Delete(tvalue);
Delete(str);
Delete(rvalue);
Delete(qvalue);
Delete(defname);
Delete(defvalue);
}
} else if (tycode == T_RVALUE_REFERENCE) {
if (pvalue) {
SwigType *tvalue;
String *defname, *defvalue, *rvalue, *qvalue;
rvalue = SwigType_typedef_resolve_all(pvalue);
qvalue = SwigType_typedef_qualified(rvalue);
defname = NewStringf("%s_defrvalue", lname);
tvalue = Copy(type);
SwigType_del_rvalue_reference(tvalue);
tycode = SwigType_type(tvalue);
if (tycode != T_USER) {
/* plain primitive type, we copy the def value */
String *lstr = SwigType_lstr(tvalue, defname);
defvalue = NewStringf("%s = %s", lstr, qvalue);
Delete(lstr);
} else {
/* user type, we copy the reference value */
String *str = SwigType_str(type, defname);
defvalue = NewStringf("%s = %s", str, qvalue);
Delete(str);
}
String *rvalue = SwigType_typedef_resolve_all(pvalue);
String *qvalue = SwigType_typedef_qualified(rvalue);
String *defname = NewStringf("%s_defrvalue", lname);
String *str = SwigType_str(pt, defname);
String *defvalue = NewStringf("%s = %s", str, qvalue);
Wrapper_add_localv(w, defname, defvalue, NIL);
Delete(tvalue);
Delete(str);
Delete(rvalue);
Delete(qvalue);
Delete(defname);
Expand Down

0 comments on commit 9a4609c

Please sign in to comment.