mirror of https://github.com/swig/swig
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 ;
This commit is contained in:
parent
5c2e83dd1a
commit
40b6cc684f
|
@ -240,27 +240,13 @@ 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);
|
||||
|
@ -268,27 +254,13 @@ int Swig_cargs(Wrapper *w, ParmList *p) {
|
|||
}
|
||||
} 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);
|
||||
|
|
Loading…
Reference in New Issue