From 7cb488e0579782c070a43ebcb5653c0897b052eb Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Sat, 18 Dec 2004 05:57:08 +0000 Subject: [PATCH] avoid using of temporal value for wrapping type user + const reference argument git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6895 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Examples/test-suite/python/kwargs.i | 20 ++++++++++++++++++++ Source/Swig/cwrap.c | 13 +++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Examples/test-suite/python/kwargs.i b/Examples/test-suite/python/kwargs.i index b1ae1545f..09f62ab19 100644 --- a/Examples/test-suite/python/kwargs.i +++ b/Examples/test-suite/python/kwargs.i @@ -52,3 +52,23 @@ %template(templatedfunction) templatedfunction; + +// Deafult args with references +%inline +%{ + + typedef int size_type; + + struct Hello + { + static const size_type hello = 3; + }; + + + + int rfoo( const size_type& x = Hello::hello, const Hello& y = Hello() ) + { + return x; + } + +%} diff --git a/Source/Swig/cwrap.c b/Source/Swig/cwrap.c index 3a309643d..036502eb3 100644 --- a/Source/Swig/cwrap.c +++ b/Source/Swig/cwrap.c @@ -173,15 +173,24 @@ int Swig_cargs(Wrapper *w, ParmList *p) { if (tycode == T_REFERENCE) { if (pvalue) { SwigType *tvalue; - String *defname, *defvalue, *rvalue; + 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); - defvalue = NewStringf("%s = %s", SwigType_lstr(tvalue,defname), rvalue); + tycode = SwigType_type(tvalue); + if (tycode != T_USER) { + /* plain primitive type, we copy the the def value */ + defvalue = NewStringf("%s = %s", SwigType_lstr(tvalue,defname),qvalue); + } else { + /* user type, we copy the reference value */ + defvalue = NewStringf("%s = %s",SwigType_str(type,defname),qvalue); + } Wrapper_add_localv(w,defname, defvalue, NIL); Delete(tvalue); Delete(rvalue); + Delete(qvalue); Delete(defname); Delete(defvalue); }