Skip to content

Commit 9a4609c

Browse files
committed
Use exact type for temporary variable wrapping parameters with default 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 ;
1 parent 4a8b246 commit 9a4609c

File tree

1 file changed

+12
-40
lines changed

1 file changed

+12
-40
lines changed

Source/Swig/cwrap.c

+12-40
Original file line numberDiff line numberDiff line change
@@ -240,55 +240,27 @@ int Swig_cargs(Wrapper *w, ParmList *p) {
240240
int tycode = SwigType_type(type);
241241
if (tycode == T_REFERENCE) {
242242
if (pvalue) {
243-
SwigType *tvalue;
244-
String *defname, *defvalue, *rvalue, *qvalue;
245-
rvalue = SwigType_typedef_resolve_all(pvalue);
246-
qvalue = SwigType_typedef_qualified(rvalue);
247-
defname = NewStringf("%s_defvalue", lname);
248-
tvalue = Copy(type);
249-
SwigType_del_reference(tvalue);
250-
tycode = SwigType_type(tvalue);
251-
if (tycode != T_USER) {
252-
/* plain primitive type, we copy the def value */
253-
String *lstr = SwigType_lstr(tvalue, defname);
254-
defvalue = NewStringf("%s = %s", lstr, qvalue);
255-
Delete(lstr);
256-
} else {
257-
/* user type, we copy the reference value */
258-
String *str = SwigType_str(type, defname);
259-
defvalue = NewStringf("%s = %s", str, qvalue);
260-
Delete(str);
261-
}
243+
String *rvalue = SwigType_typedef_resolve_all(pvalue);
244+
String *qvalue = SwigType_typedef_qualified(rvalue);
245+
String *defname = NewStringf("%s_defvalue", lname);
246+
String *str = SwigType_str(pt, defname);
247+
String *defvalue = NewStringf("%s = %s", str, qvalue);
262248
Wrapper_add_localv(w, defname, defvalue, NIL);
263-
Delete(tvalue);
249+
Delete(str);
264250
Delete(rvalue);
265251
Delete(qvalue);
266252
Delete(defname);
267253
Delete(defvalue);
268254
}
269255
} else if (tycode == T_RVALUE_REFERENCE) {
270256
if (pvalue) {
271-
SwigType *tvalue;
272-
String *defname, *defvalue, *rvalue, *qvalue;
273-
rvalue = SwigType_typedef_resolve_all(pvalue);
274-
qvalue = SwigType_typedef_qualified(rvalue);
275-
defname = NewStringf("%s_defrvalue", lname);
276-
tvalue = Copy(type);
277-
SwigType_del_rvalue_reference(tvalue);
278-
tycode = SwigType_type(tvalue);
279-
if (tycode != T_USER) {
280-
/* plain primitive type, we copy the def value */
281-
String *lstr = SwigType_lstr(tvalue, defname);
282-
defvalue = NewStringf("%s = %s", lstr, qvalue);
283-
Delete(lstr);
284-
} else {
285-
/* user type, we copy the reference value */
286-
String *str = SwigType_str(type, defname);
287-
defvalue = NewStringf("%s = %s", str, qvalue);
288-
Delete(str);
289-
}
257+
String *rvalue = SwigType_typedef_resolve_all(pvalue);
258+
String *qvalue = SwigType_typedef_qualified(rvalue);
259+
String *defname = NewStringf("%s_defrvalue", lname);
260+
String *str = SwigType_str(pt, defname);
261+
String *defvalue = NewStringf("%s = %s", str, qvalue);
290262
Wrapper_add_localv(w, defname, defvalue, NIL);
291-
Delete(tvalue);
263+
Delete(str);
292264
Delete(rvalue);
293265
Delete(qvalue);
294266
Delete(defname);

0 commit comments

Comments
 (0)