rust_uno/src/core/oustring.rs |   61 ++++++++++++++++++++++--------------------
 1 file changed, 33 insertions(+), 28 deletions(-)

New commits:
commit 4158f6ca7572e9397681bf859662f4b4a93da384
Author:     Arnaud VERSINI <[email protected]>
AuthorDate: Sun Sep 14 18:17:26 2025 +0200
Commit:     Arnaud Versini <[email protected]>
CommitDate: Mon Oct 13 08:37:37 2025 +0200

    rust_uno : compare rtl_uString pointers and use less unsafe code
    
    Change-Id: I29f573f290d925c5c86cde890af6a7abdb278685
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190932
    Reviewed-by: Arnaud Versini <[email protected]>
    Tested-by: Jenkins

diff --git a/rust_uno/src/core/oustring.rs b/rust_uno/src/core/oustring.rs
index 8be5188168e1..23433330490e 100644
--- a/rust_uno/src/core/oustring.rs
+++ b/rust_uno/src/core/oustring.rs
@@ -57,6 +57,17 @@ impl OUString {
         }
     }
 
+    /// Utility function to create a slice for the string.
+    ///
+    /// Take len as parameter to avoid double call in PartialEq impl.
+    fn get_ustring_slice(data: &NonNull<rtl_uString>, len: usize) -> &[u16] {
+        unsafe {
+            let data_ptr = rtl_uString_getStr(data.as_ptr());
+            std::slice::from_raw_parts(data_ptr, len)
+        }
+    }
+
+
     /// Create a UNO string from UTF-8 text
     ///
     /// This uses LibreOffice's direct UTF-8 to UString conversion function,
@@ -190,29 +201,28 @@ impl<T: AsRef<str>> From<T> for OUString {
 /// Comparison with other OUString
 impl PartialEq for OUString {
     fn eq(&self, other: &Self) -> bool {
-        unsafe {
-            // Compare lengths first (fast check)
-            let self_len = rtl_uString_getLength(self.inner.as_ptr());
-            let other_len = rtl_uString_getLength(other.inner.as_ptr());
-
-            if self_len != other_len {
-                return false;
-            }
-
-            // If lengths are equal, compare UTF-16 data directly
-            if self_len == 0 {
-                return true; // Both empty strings
-            }
+        // Compare pointers first (fast check)
+        if self.inner == other.inner {
+            return true;
+        }
 
-            let self_ptr = rtl_uString_getStr(self.inner.as_ptr());
-            let other_ptr = rtl_uString_getStr(other.inner.as_ptr());
+        // Compare lengths (fast check)
+        let self_len = self.len();
+        let other_len = other.len();
 
-            // Compare UTF-16 data byte by byte
-            let self_slice = std::slice::from_raw_parts(self_ptr, self_len as 
usize);
-            let other_slice = std::slice::from_raw_parts(other_ptr, other_len 
as usize);
+        if self_len != other_len {
+            return false;
+        }
 
-            self_slice == other_slice
+        // If lengths are equal, compare UTF-16 data directly
+        if self_len == 0 {
+            return true; // Both empty strings
         }
+        // Compare UTF-16 data byte by byte
+        let self_slice = Self::get_ustring_slice(&self.inner, self_len);
+        let other_slice = Self::get_ustring_slice(&other.inner, other_len);
+
+        self_slice == other_slice
     }
 }
 
@@ -225,15 +235,10 @@ impl std::fmt::Display for OUString {
             return Ok(());
         }
 
-        unsafe {
-            let ptr = rtl_uString_getStr(self.inner.as_ptr());
-            let len = rtl_uString_getLength(self.inner.as_ptr()) as usize;
-
-            // Convert from UTF-16 to UTF-8
-            let utf16_slice = std::slice::from_raw_parts(ptr, len);
-            let string = String::from_utf16_lossy(utf16_slice);
-            write!(f, "{string}")
-        }
+        // Convert from UTF-16 to UTF-8
+        let utf16_slice = Self::get_ustring_slice(&self.inner, self.len());
+        let string = String::from_utf16_lossy(utf16_slice);
+        write!(f, "{string}")
     }
 }
 

Reply via email to