diff --git a/SWIG/Examples/test-suite/overload_simple.i b/SWIG/Examples/test-suite/overload_simple.i index d9d1e5e4f..3e3b322b0 100644 --- a/SWIG/Examples/test-suite/overload_simple.i +++ b/SWIG/Examples/test-suite/overload_simple.i @@ -108,6 +108,14 @@ static char *bar(void *) { }; +bool fbool(bool b) { + return b; +} + +int fbool(int b) { + return b; +} + char *fint(int) { return (char*) "fint:int"; } diff --git a/SWIG/Examples/test-suite/perl5/overload_simple_runme.pl b/SWIG/Examples/test-suite/perl5/overload_simple_runme.pl index 0335124f4..a2c50b8d2 100644 --- a/SWIG/Examples/test-suite/perl5/overload_simple_runme.pl +++ b/SWIG/Examples/test-suite/perl5/overload_simple_runme.pl @@ -286,3 +286,12 @@ if (!(overload_simple::fid("3.0", "3.0") eq "fid:doubledouble")) { if (!(overload_simple::fid("3", 3) eq "fid:intint")) { die("fid(int,int)"); } + + +if (!(overload_simple::fbool(0)) != overload_simple::fbool(1)) { + die("fbool(bool)"); +} + +if (2 != overload_simple::fbool(2)) { + die("fbool(int)"); +} diff --git a/SWIG/Lib/perl5/perlprimtypes.swg b/SWIG/Lib/perl5/perlprimtypes.swg index 7ab8a1be7..d59cdb590 100644 --- a/SWIG/Lib/perl5/perlprimtypes.swg +++ b/SWIG/Lib/perl5/perlprimtypes.swg @@ -2,6 +2,42 @@ * Primitive Types * ------------------------------------------------------------ */ +/* bool */ + +%fragment(SWIG_From_frag(bool),"header") { +SWIGINTERNINLINE SV * +SWIG_From_dec(bool)(bool value) +{ + SV *obj = sv_newmortal(); + if (value) { + sv_setsv(obj, &PL_sv_yes); + } else { + sv_setsv(obj, &PL_sv_no); + } + return obj; +} +} + +%fragment(SWIG_AsVal_frag(bool),"header", + fragment="SWIG_CanCastAsInteger") { +SWIGINTERN int +SWIG_AsVal_dec(bool)(SV *obj, bool* val) +{ + if (obj == &PL_sv_yes) { + if (val) *val = true; + return SWIG_OK; + } else if (obj == &PL_sv_no) { + if (val) *val = false; + return SWIG_OK; + } else { + if (val) *val = SvTRUE(obj) ? true: false; + return SWIG_AddCast(SWIG_OK); + } + return SWIG_TypeError; +} +} + + /* long */ %fragment(SWIG_From_frag(long),"header") {