-
Notifications
You must be signed in to change notification settings - Fork 13.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
std: Implement CString-related RFCs #22482
Conversation
r? @huonw (rust_highfive has picked a reviewer for you, use r? to override) |
r? @aturon |
Hm, I see you decided against introducing additional constructors. It seems like |
Likewise |
Also, did we want to consider #16035 here? |
I suppose that, since this doesn't stabilize the module now, we can do these other changes later on. Other than those, the PR LGTM (and I actually quite like how this played out in io). |
I'm a little worried about adding a large number of I did in general yeah feel a little uncomfortable marking these changes as To make progress on #16035 I think that we would need to let ptr = opt_cstr.map(|s| s.as_ptr()).unwrap_or(0 as *const _); In general I'm pretty wary about #16035 due to our forays to "make unsafe APIs a little safer" largely being unsuccessful. I do agree, though, that if we do it now is the time. I would probably personally vote to not do it myself. |
11b1916
to
9f414ea
Compare
9f414ea
to
1860ee5
Compare
This commit is an implementation of [RFC 592][r592] and [RFC 840][r840]. These two RFCs tweak the behavior of `CString` and add a new `CStr` unsized slice type to the module. [r592]: https://github.com/rust-lang/rfcs/blob/master/text/0592-c-str-deref.md [r840]: https://github.com/rust-lang/rfcs/blob/master/text/0840-no-panic-in-c-string.md The new `CStr` type is only constructable via two methods: 1. By `deref`'ing from a `CString` 2. Unsafely via `CStr::from_ptr` The purpose of `CStr` is to be an unsized type which is a thin pointer to a `libc::c_char` (currently it is a fat pointer slice due to implementation limitations). Strings from C can be safely represented with a `CStr` and an appropriate lifetime as well. Consumers of `&CString` should now consume `&CStr` instead to allow producers to pass in C-originating strings instead of just Rust-allocated strings. A new constructor was added to `CString`, `new`, which takes `T: IntoBytes` instead of separate `from_slice` and `from_vec` methods (both have been deprecated in favor of `new`). The `new` method returns a `Result` instead of panicking. The error variant contains the relevant information about where the error happened and bytes (if present). Conversions are provided to the `io::Error` and `old_io::IoError` types via the `FromError` trait which translate to `InvalidInput`. This is a breaking change due to the modification of existing `#[unstable]` APIs and new deprecation, and more detailed information can be found in the two RFCs. Notable breakage includes: * All construction of `CString` now needs to use `new` and handle the outgoing `Result`. * Usage of `CString` as a byte slice now explicitly needs a `.as_bytes()` call. * The `as_slice*` methods have been removed in favor of just having the `as_bytes*` methods. Closes rust-lang#22469 Closes rust-lang#22470 [breaking-change]
This commit is an implementation of [RFC 592][r592] and [RFC 840][r840]. These two RFCs tweak the behavior of `CString` and add a new `CStr` unsized slice type to the module. [r592]: https://github.com/rust-lang/rfcs/blob/master/text/0592-c-str-deref.md [r840]: https://github.com/rust-lang/rfcs/blob/master/text/0840-no-panic-in-c-string.md The new `CStr` type is only constructable via two methods: 1. By `deref`'ing from a `CString` 2. Unsafely via `CStr::from_ptr` The purpose of `CStr` is to be an unsized type which is a thin pointer to a `libc::c_char` (currently it is a fat pointer slice due to implementation limitations). Strings from C can be safely represented with a `CStr` and an appropriate lifetime as well. Consumers of `&CString` should now consume `&CStr` instead to allow producers to pass in C-originating strings instead of just Rust-allocated strings. A new constructor was added to `CString`, `new`, which takes `T: IntoBytes` instead of separate `from_slice` and `from_vec` methods (both have been deprecated in favor of `new`). The `new` method returns a `Result` instead of panicking. The error variant contains the relevant information about where the error happened and bytes (if present). Conversions are provided to the `io::Error` and `old_io::IoError` types via the `FromError` trait which translate to `InvalidInput`. This is a breaking change due to the modification of existing `#[unstable]` APIs and new deprecation, and more detailed information can be found in the two RFCs. Notable breakage includes: * All construction of `CString` now needs to use `new` and handle the outgoing `Result`. * Usage of `CString` as a byte slice now explicitly needs a `.as_bytes()` call. * The `as_slice*` methods have been removed in favor of just having the `as_bytes*` methods. Closes rust-lang#22469 Closes rust-lang#22470 [breaking-change]
This commit is an implementation of RFC 592 and RFC 840. These
two RFCs tweak the behavior of
CString
and add a newCStr
unsized slice typeto the module.
The new
CStr
type is only constructable via two methods:deref
'ing from aCString
CStr::from_ptr
The purpose of
CStr
is to be an unsized type which is a thin pointer to alibc::c_char
(currently it is a fat pointer slice due to implementationlimitations). Strings from C can be safely represented with a
CStr
and anappropriate lifetime as well. Consumers of
&CString
should now consume&CStr
instead to allow producers to pass in C-originating strings instead of just
Rust-allocated strings.
A new constructor was added to
CString
,new
, which takesT: IntoBytes
instead of separate
from_slice
andfrom_vec
methods (both have beendeprecated in favor of
new
). Thenew
method returns aResult
instead ofpanicking. The error variant contains the relevant information about where the
error happened and bytes (if present). Conversions are provided to the
io::Error
andold_io::IoError
types via theFromError
trait whichtranslate to
InvalidInput
.This is a breaking change due to the modification of existing
#[unstable]
APIsand new deprecation, and more detailed information can be found in the two RFCs.
Notable breakage includes:
CString
now needs to usenew
and handle the outgoingResult
.CString
as a byte slice now explicitly needs a.as_bytes()
call.as_slice*
methods have been removed in favor of just having theas_bytes*
methods.Closes #22469
Closes #22470
[breaking-change]