Hi!
On 2024-08-01T16:56:44+0200, Arthur Cohen <[email protected]> wrote:
> --- a/libgrust/libformat_parser/src/lib.rs
> +++ b/libgrust/libformat_parser/src/lib.rs
> [...]
> + let rust_string = RustString {
> + len: str.len(),
> + cap: str.capacity(),
> + ptr: str.leak().as_ptr(),
> + };
> [...]
> [...]
> + let RustString { ptr, len, cap } = *s;
> + let s = unsafe { String::from_raw_parts(ptr as *mut u8, len, cap) };
> + let cloned_s = s.clone();
> +
> + // FIXME: Documentation
> + s.leak();
> +
> + let rust_string = RustString {
> + len: cloned_s.len(),
> + cap: cloned_s.capacity(),
> + ptr: cloned_s.leak().as_ptr(),
> + };
> [...]
OK to push the attached
"Rust: Work around 'error[E0599]: no method named `leak` found for struct
`std::string::String` in the current scope'"?
Builds and tests fine, but I don't know if this code path is actually
exercised at this time, so please check carefully; as you know I'm not
actually a Rust programmer (yet). ;-)
Grüße
Thomas
>From 8d4821dabcf4663e51c7db859801837710038821 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <[email protected]>
Date: Sat, 3 Aug 2024 16:39:17 +0200
Subject: [PATCH] Rust: Work around 'error[E0599]: no method named `leak` found
for struct `std::string::String` in the current scope'
Compiling with Debian GNU/Linux 12 (bookworm) packages:
$ apt-cache madison cargo rustc
cargo | 0.66.0+ds1-1 | http://deb.debian.org/debian bookworm/main ppc64el Packages
cargo | 0.66.0+ds1-1 | http://deb.debian.org/debian bookworm/main Sources
rustc | 1.63.0+dfsg1-2 | http://deb.debian.org/debian bookworm/main ppc64el Packages
rustc | 1.63.0+dfsg1-2 | http://deb.debian.org/debian bookworm/main Sources
..., we run into:
Compiling libformat_parser v0.1.0 ([...]/source-gcc/libgrust/libformat_parser)
error[E0599]: no method named `leak` found for struct `std::string::String` in the current scope
--> src/lib.rs:396:18
|
396 | ptr: str.leak().as_ptr(),
| ^^^^ method not found in `std::string::String`
error[E0599]: no method named `leak` found for struct `std::string::String` in the current scope
--> src/lib.rs:434:7
|
434 | s.leak();
| ^^^^ method not found in `std::string::String`
error[E0599]: no method named `leak` found for struct `std::string::String` in the current scope
--> src/lib.rs:439:23
|
439 | ptr: cloned_s.leak().as_ptr(),
| ^^^^ method not found in `std::string::String`
Locally replace 1.72.0+ method 'leak' for struct 'std::string::String'.
libgrust/
* libformat_parser/src/lib.rs: Work around 'error[E0599]:
no method named `leak` found for struct `std::string::String` in the current scope'.
---
libgrust/libformat_parser/src/lib.rs | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/libgrust/libformat_parser/src/lib.rs b/libgrust/libformat_parser/src/lib.rs
index 84fac38e224d..28f6a6a62b62 100644
--- a/libgrust/libformat_parser/src/lib.rs
+++ b/libgrust/libformat_parser/src/lib.rs
@@ -5,6 +5,13 @@
use std::ffi::CStr;
+// Local replacement for 1.72.0+ method 'leak' for struct 'std::string::String',
+// <https://doc.rust-lang.org/1.72.0/src/alloc/string.rs.html#1853>
+fn leak_string<'a>(s: String) -> &'a mut str {
+ let slice = s.into_bytes().leak();
+ unsafe { std::str::from_utf8_unchecked_mut(slice) }
+}
+
trait IntoFFI<T> {
fn into_ffi(self) -> T;
}
@@ -393,7 +400,7 @@ pub extern "C" fn collect_pieces(
let rust_string = RustString {
len: str.len(),
cap: str.capacity(),
- ptr: str.leak().as_ptr(),
+ ptr: leak_string(str).as_ptr(),
};
FormatArgsHandle(piece_slice, rust_string)
@@ -431,12 +438,12 @@ pub extern "C" fn clone_pieces(
let cloned_s = s.clone();
// FIXME: Documentation
- s.leak();
+ leak_string(s);
let rust_string = RustString {
len: cloned_s.len(),
cap: cloned_s.capacity(),
- ptr: cloned_s.leak().as_ptr(),
+ ptr: leak_string(cloned_s).as_ptr(),
};
FormatArgsHandle(piece_slice, rust_string)
--
2.34.1