From 3f7917309bf5a025a643ea6e617ad7f90386bedf Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Fri, 2 Jul 2021 11:31:50 +0200 Subject: [PATCH] set utf8 flag as needed when serializing strings Signed-off-by: Wolfgang Bumiller --- perlmod/src/ffi.rs | 1 + perlmod/src/glue.c | 4 ++++ perlmod/src/scalar.rs | 11 ++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/perlmod/src/ffi.rs b/perlmod/src/ffi.rs index 1eeb29c..f8fa611 100644 --- a/perlmod/src/ffi.rs +++ b/perlmod/src/ffi.rs @@ -60,6 +60,7 @@ extern "C" { pub fn RSPL_newSVuv(v: usize) -> *mut SV; pub fn RSPL_newSVnv(v: f64) -> *mut SV; pub fn RSPL_newSVpvn(v: *const libc::c_char, len: libc::size_t) -> *mut SV; + pub fn RSPL_newSVpvn_utf8(v: *const libc::c_char, len: libc::size_t) -> *mut SV; pub fn RSPL_SvREFCNT_inc(sv: *mut SV) -> *mut SV; pub fn RSPL_SvREFCNT_dec(sv: *mut SV); pub fn RSPL_is_reference(sv: *mut SV) -> bool; diff --git a/perlmod/src/glue.c b/perlmod/src/glue.c index 01267d7..f1e87da 100644 --- a/perlmod/src/glue.c +++ b/perlmod/src/glue.c @@ -127,6 +127,10 @@ extern SV* RSPL_newSVpvn(const char *v, size_t len) { return newSVpvn(v, len); } +extern SV* RSPL_newSVpvn_utf8(const char *v, size_t len) { + return newSVpvn_utf8(v, len, 1); +} + extern SV* RSPL_SvREFCNT_inc(SV *sv) { return SvREFCNT_inc(sv); } diff --git a/perlmod/src/scalar.rs b/perlmod/src/scalar.rs index 870940f..cedd8c4 100644 --- a/perlmod/src/scalar.rs +++ b/perlmod/src/scalar.rs @@ -88,7 +88,16 @@ impl Scalar { /// Create a new string value. pub fn new_string(s: &str) -> Self { - Self::new_bytes(s.as_bytes()) + if s.as_bytes().iter().any(|&b| b >= 0x80) { + unsafe { + Self::from_raw_move(ffi::RSPL_newSVpvn_utf8( + s.as_bytes().as_ptr() as *const libc::c_char, + s.as_bytes().len() as libc::size_t, + )) + } + } else { + Self::new_bytes(s.as_bytes()) + } } /// Create a new byte string.