diff --git a/CHANGES.current b/CHANGES.current index 18f5df2e5..9424a3abf 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +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 diff --git a/Examples/test-suite/li_cdata_carrays.i b/Examples/test-suite/li_cdata_carrays.i new file mode 100644 index 000000000..7b000c1d1 --- /dev/null +++ b/Examples/test-suite/li_cdata_carrays.i @@ -0,0 +1,8 @@ +%module li_cdata_carrays + +%include +%array_class(int, intArray); + +%include + +%cdata(int); diff --git a/Examples/test-suite/perl5/Makefile.in b/Examples/test-suite/perl5/Makefile.in index f6b20ade8..77a12d0e1 100644 --- a/Examples/test-suite/perl5/Makefile.in +++ b/Examples/test-suite/perl5/Makefile.in @@ -16,11 +16,12 @@ CPP_TEST_CASES += \ primitive_types \ li_cdata \ li_cstring \ + li_cdata_carrays \ C_TEST_CASES += \ li_cdata \ li_cstring \ - + li_cdata_carrays \ include $(srcdir)/../common.mk diff --git a/Examples/test-suite/perl5/li_cdata_carrays_runme.pl b/Examples/test-suite/perl5/li_cdata_carrays_runme.pl new file mode 100644 index 000000000..eaeb00a6b --- /dev/null +++ b/Examples/test-suite/perl5/li_cdata_carrays_runme.pl @@ -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"; +} diff --git a/Lib/perl5/jstring.i b/Lib/perl5/jstring.i index c4ee203df..1c179b754 100644 --- a/Lib/perl5/jstring.i +++ b/Lib/perl5/jstring.i @@ -28,10 +28,9 @@ SWIG_From_dec(jstring)(jstring val) 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); } diff --git a/Lib/perl5/perlstrings.swg b/Lib/perl5/perlstrings.swg index 2d51317ff..2083f0bba 100644 --- a/Lib/perl5/perlstrings.swg +++ b/Lib/perl5/perlstrings.swg @@ -44,15 +44,7 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size) { 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); }