From: <ol...@us...> - 2007-09-17 23:24:15
|
Revision: 9937 http://swig.svn.sourceforge.net/swig/?rev=9937&view=rev Author: olly Date: 2007-09-17 16:24:11 -0700 (Mon, 17 Sep 2007) Log Message: ----------- [perl5] Use sv_setpvn() to set a scalar from a pointer and length - patch from SF#174460 by "matsubaray". Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/perl5/Makefile.in trunk/Lib/perl5/jstring.i trunk/Lib/perl5/perlstrings.swg Added Paths: ----------- trunk/Examples/test-suite/li_cdata_carrays.i trunk/Examples/test-suite/perl5/li_cdata_carrays_runme.pl Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-09-17 20:10:57 UTC (rev 9936) +++ trunk/CHANGES.current 2007-09-17 23:24:11 UTC (rev 9937) @@ -2,6 +2,10 @@ ============================ 09/17/2007: olly + [perl5] Use sv_setpvn() to set a scalar from a pointer and length + - patch from SF#174460 by "matsubaray". + +09/17/2007: olly When wrapping C++ code, generate code which uses std::string::assign(PTR, LEN) rather than assigning std::string(PTR, LEN). Using assign generates more efficient code Added: trunk/Examples/test-suite/li_cdata_carrays.i =================================================================== --- trunk/Examples/test-suite/li_cdata_carrays.i (rev 0) +++ trunk/Examples/test-suite/li_cdata_carrays.i 2007-09-17 23:24:11 UTC (rev 9937) @@ -0,0 +1,8 @@ +%module li_cdata_carrays + +%include <carrays.i> +%array_class(int, intArray); + +%include <cdata.i> + +%cdata(int); Modified: trunk/Examples/test-suite/perl5/Makefile.in =================================================================== --- trunk/Examples/test-suite/perl5/Makefile.in 2007-09-17 20:10:57 UTC (rev 9936) +++ trunk/Examples/test-suite/perl5/Makefile.in 2007-09-17 23:24:11 UTC (rev 9937) @@ -16,12 +16,13 @@ primitive_types \ li_cdata \ li_cstring \ + li_cdata_carrays \ C_TEST_CASES += \ li_cdata \ li_cstring \ + li_cdata_carrays \ - include $(srcdir)/../common.mk # Overridden variables here Added: trunk/Examples/test-suite/perl5/li_cdata_carrays_runme.pl =================================================================== --- trunk/Examples/test-suite/perl5/li_cdata_carrays_runme.pl (rev 0) +++ trunk/Examples/test-suite/perl5/li_cdata_carrays_runme.pl 2007-09-17 23:24:11 UTC (rev 9937) @@ -0,0 +1,11 @@ +use li_cdata_carrays; + +$a = li_cdata_carrays::intArray->new(5); +for (0..4) { + $a->setitem($_, $_**2); +} +$x = pack q{I5}, map $_**2, (0..4); +$y = li_cdata_carrays::cdata_int($a->cast, 5); +if ( $x ne $y ) { + die "$x vs $y"; +} Modified: trunk/Lib/perl5/jstring.i =================================================================== --- trunk/Lib/perl5/jstring.i 2007-09-17 20:10:57 UTC (rev 9936) +++ trunk/Lib/perl5/jstring.i 2007-09-17 23:24:11 UTC (rev 9937) @@ -28,10 +28,9 @@ if (!len) { sv_setsv(obj, &PL_sv_undef); } else { - char *tmp = %new_array(len + 1, char); + char *tmp = %new_array(len, char); JvGetStringUTFRegion(val, 0, len, tmp); - tmp[len] = 0; - sv_setpv(obj, tmp); + sv_setpvn(obj, tmp, len); SvUTF8_on(obj); %delete_array(tmp); } Modified: trunk/Lib/perl5/perlstrings.swg =================================================================== --- trunk/Lib/perl5/perlstrings.swg 2007-09-17 20:10:57 UTC (rev 9936) +++ trunk/Lib/perl5/perlstrings.swg 2007-09-17 23:24:11 UTC (rev 9937) @@ -44,15 +44,7 @@ { SV *obj = sv_newmortal(); if (carray) { - if (size && (carray[size - 1] == 0)) { - sv_setpv(obj, carray); - } else { - char *tmp = %new_array(size + 1, char); - memcpy(tmp, carray, size); - tmp[size] = 0; - sv_setpv(obj, tmp); - %delete_array(tmp); - } + sv_setpvn(obj, carray, size); } else { sv_setsv(obj, &PL_sv_undef); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |