diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ee95eb05..43145e80 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -31,6 +31,8 @@ jobs: exclude: - os: macos-latest rustup-toolchain: "1.51" + - os: windows-latest + ruby-version: head steps: - uses: actions/checkout@v3 diff --git a/src/r_string.rs b/src/r_string.rs index 230fdfb8..94d71f48 100644 --- a/src/r_string.rs +++ b/src/r_string.rs @@ -448,9 +448,9 @@ impl RString { let f = r_basic.as_ref().flags; if (f & ruby_rstring_flags::RSTRING_NOEMBED as VALUE) != 0 { let h = self.as_internal().as_ref().as_.heap; - slice::from_raw_parts(h.ptr as *const u8, h.len as usize) + slice::from_raw_parts(h.ptr as *const u8, self.len()) } else { - slice::from_raw_parts(embedded_ary_ptr(self), embed_len(self, f) as usize) + slice::from_raw_parts(embedded_ary_ptr(self), self.len()) } } @@ -1277,6 +1277,26 @@ impl RString { /// let s = RString::new("🦀 Hello, Ferris"); /// assert_eq!(s.len(), 18); /// ``` + #[cfg(ruby_gte_3_3)] + pub fn len(self) -> usize { + debug_assert_value!(self); + unsafe { self.as_internal().as_ref().len as usize } + } + + /// Returns the number of bytes in `self`. + /// + /// See also [`length`](RString::length). + /// + /// # Examples + /// + /// ``` + /// use magnus::{eval, RString}; + /// # let _cleanup = unsafe { magnus::embed::init() }; + /// + /// let s = RString::new("🦀 Hello, Ferris"); + /// assert_eq!(s.len(), 18); + /// ``` + #[cfg(ruby_lte_3_2)] pub fn len(self) -> usize { debug_assert_value!(self); unsafe { @@ -1421,7 +1441,7 @@ impl RString { } } -#[cfg(ruby_gte_3_2)] +#[cfg(ruby_3_2)] unsafe fn embed_len(value: RString, _: VALUE) -> c_long { value.as_internal().as_ref().as_.embed.len }