Skip to content

Commit

Permalink
Auto merge of #58953 - jethrogb:jb/unify-ffi, r=alexcrichton
Browse files Browse the repository at this point in the history
Unify OsString/OsStr for byte-based implementations

As requested in #57860

r? @joshtriplett
  • Loading branch information
bors committed Mar 22, 2019
2 parents ed19622 + 2079df1 commit cb2f34d
Show file tree
Hide file tree
Showing 13 changed files with 186 additions and 809 deletions.
4 changes: 2 additions & 2 deletions src/libstd/sys/cloudabi/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ pub mod io;
pub mod memchr;
pub mod mutex;
pub mod os;
#[path = "../unix/os_str.rs"]
pub mod os_str;
pub mod rwlock;
pub mod stack_overflow;
pub mod stdio;
Expand All @@ -24,6 +22,8 @@ pub mod thread;
pub mod thread_local;
pub mod time;

pub use crate::sys_common::os_str_bytes as os_str;

mod abi;

mod shims;
Expand Down
83 changes: 33 additions & 50 deletions src/libstd/sys/redox/ext/ffi.rs
Original file line number Diff line number Diff line change
@@ -1,55 +1,38 @@
//! Redox-specific extension to the primitives in the `std::ffi` module.
//!
//! # Examples
//!
//! ```
//! use std::ffi::OsString;
//! use std::os::redox::ffi::OsStringExt;
//!
//! let bytes = b"foo".to_vec();
//!
//! // OsStringExt::from_vec
//! let os_string = OsString::from_vec(bytes);
//! assert_eq!(os_string.to_str(), Some("foo"));
//!
//! // OsStringExt::into_vec
//! let bytes = os_string.into_vec();
//! assert_eq!(bytes, b"foo");
//! ```
//!
//! ```
//! use std::ffi::OsStr;
//! use std::os::redox::ffi::OsStrExt;
//!
//! let bytes = b"foo";
//!
//! // OsStrExt::from_bytes
//! let os_str = OsStr::from_bytes(bytes);
//! assert_eq!(os_str.to_str(), Some("foo"));
//!
//! // OsStrExt::as_bytes
//! let bytes = os_str.as_bytes();
//! assert_eq!(bytes, b"foo");
//! ```

#![stable(feature = "rust1", since = "1.0.0")]

use crate::ffi::{OsStr, OsString};
use crate::mem;
use crate::sys::os_str::Buf;
use crate::sys_common::{FromInner, IntoInner, AsInner};

/// Redox-specific extensions to [`OsString`].
///
/// [`OsString`]: ../../../../std/ffi/struct.OsString.html
#[stable(feature = "rust1", since = "1.0.0")]
pub trait OsStringExt {
/// Creates an `OsString` from a byte vector.
#[stable(feature = "rust1", since = "1.0.0")]
fn from_vec(vec: Vec<u8>) -> Self;

/// Yields the underlying byte vector of this `OsString`.
#[stable(feature = "rust1", since = "1.0.0")]
fn into_vec(self) -> Vec<u8>;
}

#[stable(feature = "rust1", since = "1.0.0")]
impl OsStringExt for OsString {
fn from_vec(vec: Vec<u8>) -> OsString {
FromInner::from_inner(Buf { inner: vec })
}
fn into_vec(self) -> Vec<u8> {
self.into_inner().inner
}
}

/// Redox-specific extensions to [`OsStr`].
///
/// [`OsStr`]: ../../../../std/ffi/struct.OsStr.html
#[stable(feature = "rust1", since = "1.0.0")]
pub trait OsStrExt {
#[stable(feature = "rust1", since = "1.0.0")]
fn from_bytes(slice: &[u8]) -> &Self;

/// Gets the underlying byte view of the `OsStr` slice.
#[stable(feature = "rust1", since = "1.0.0")]
fn as_bytes(&self) -> &[u8];
}

#[stable(feature = "rust1", since = "1.0.0")]
impl OsStrExt for OsStr {
fn from_bytes(slice: &[u8]) -> &OsStr {
unsafe { mem::transmute(slice) }
}
fn as_bytes(&self) -> &[u8] {
&self.as_inner().inner
}
}
pub use crate::sys_common::os_str_bytes::*;
3 changes: 2 additions & 1 deletion src/libstd/sys/redox/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ pub mod memchr;
pub mod mutex;
pub mod net;
pub mod os;
pub mod os_str;
pub mod path;
pub mod pipe;
pub mod process;
Expand All @@ -35,6 +34,8 @@ pub mod thread;
pub mod thread_local;
pub mod time;

pub use crate::sys_common::os_str_bytes as os_str;

#[cfg(not(test))]
pub fn init() {}

Expand Down
137 changes: 33 additions & 104 deletions src/libstd/sys/sgx/ext/ffi.rs
Original file line number Diff line number Diff line change
@@ -1,109 +1,38 @@
//! SGX-specific extension to the primitives in the `std::ffi` module
//!
//! # Examples
//!
//! ```
//! use std::ffi::OsString;
//! use std::os::fortanix_sgx::ffi::OsStringExt;
//!
//! let bytes = b"foo".to_vec();
//!
//! // OsStringExt::from_vec
//! let os_string = OsString::from_vec(bytes);
//! assert_eq!(os_string.to_str(), Some("foo"));
//!
//! // OsStringExt::into_vec
//! let bytes = os_string.into_vec();
//! assert_eq!(bytes, b"foo");
//! ```
//!
//! ```
//! use std::ffi::OsStr;
//! use std::os::fortanix_sgx::ffi::OsStrExt;
//!
//! let bytes = b"foo";
//!
//! // OsStrExt::from_bytes
//! let os_str = OsStr::from_bytes(bytes);
//! assert_eq!(os_str.to_str(), Some("foo"));
//!
//! // OsStrExt::as_bytes
//! let bytes = os_str.as_bytes();
//! assert_eq!(bytes, b"foo");
//! ```

#![unstable(feature = "sgx_platform", issue = "56975")]

use crate::ffi::{OsStr, OsString};
use crate::mem;
use crate::sys::os_str::Buf;
use crate::sys_common::{FromInner, IntoInner, AsInner};

/// SGX-specific extensions to [`OsString`].
///
/// [`OsString`]: ../../../../std/ffi/struct.OsString.html
#[unstable(feature = "sgx_platform", issue = "56975")]
pub trait OsStringExt {
/// Creates an [`OsString`] from a byte vector.
///
/// # Examples
///
/// ```
/// use std::ffi::OsString;
/// use std::os::unix::ffi::OsStringExt;
///
/// let bytes = b"foo".to_vec();
/// let os_string = OsString::from_vec(bytes);
/// assert_eq!(os_string.to_str(), Some("foo"));
/// ```
///
/// [`OsString`]: ../../../ffi/struct.OsString.html
#[unstable(feature = "sgx_platform", issue = "56975")]
fn from_vec(vec: Vec<u8>) -> Self;

/// Yields the underlying byte vector of this [`OsString`].
///
/// # Examples
///
/// ```
/// use std::ffi::OsString;
/// use std::os::unix::ffi::OsStringExt;
///
/// let mut os_string = OsString::new();
/// os_string.push("foo");
/// let bytes = os_string.into_vec();
/// assert_eq!(bytes, b"foo");
/// ```
///
/// [`OsString`]: ../../../ffi/struct.OsString.html
#[unstable(feature = "sgx_platform", issue = "56975")]
fn into_vec(self) -> Vec<u8>;
}

#[unstable(feature = "sgx_platform", issue = "56975")]
impl OsStringExt for OsString {
fn from_vec(vec: Vec<u8>) -> OsString {
FromInner::from_inner(Buf { inner: vec })
}
fn into_vec(self) -> Vec<u8> {
self.into_inner().inner
}
}

/// SGX-specific extensions to [`OsStr`].
///
/// [`OsStr`]: ../../../../std/ffi/struct.OsStr.html
#[unstable(feature = "sgx_platform", issue = "56975")]
pub trait OsStrExt {
#[unstable(feature = "sgx_platform", issue = "56975")]
/// Creates an [`OsStr`] from a byte slice.
///
/// # Examples
///
/// ```
/// use std::ffi::OsStr;
/// use std::os::unix::ffi::OsStrExt;
///
/// let bytes = b"foo";
/// let os_str = OsStr::from_bytes(bytes);
/// assert_eq!(os_str.to_str(), Some("foo"));
/// ```
///
/// [`OsStr`]: ../../../ffi/struct.OsStr.html
fn from_bytes(slice: &[u8]) -> &Self;

/// Gets the underlying byte view of the [`OsStr`] slice.
///
/// # Examples
///
/// ```
/// use std::ffi::OsStr;
/// use std::os::unix::ffi::OsStrExt;
///
/// let mut os_str = OsStr::new("foo");
/// let bytes = os_str.as_bytes();
/// assert_eq!(bytes, b"foo");
/// ```
///
/// [`OsStr`]: ../../../ffi/struct.OsStr.html
#[unstable(feature = "sgx_platform", issue = "56975")]
fn as_bytes(&self) -> &[u8];
}

#[unstable(feature = "sgx_platform", issue = "56975")]
impl OsStrExt for OsStr {
fn from_bytes(slice: &[u8]) -> &OsStr {
unsafe { mem::transmute(slice) }
}
fn as_bytes(&self) -> &[u8] {
&self.as_inner().inner
}
}
pub use crate::sys_common::os_str_bytes::*;
3 changes: 2 additions & 1 deletion src/libstd/sys/sgx/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ pub mod memchr;
pub mod mutex;
pub mod net;
pub mod os;
pub mod os_str;
pub mod path;
pub mod pipe;
pub mod process;
Expand All @@ -36,6 +35,8 @@ pub mod thread_local;
pub mod time;
pub mod stdio;

pub use crate::sys_common::os_str_bytes as os_str;

#[cfg(not(test))]
pub fn init() {
}
Expand Down
Loading

0 comments on commit cb2f34d

Please sign in to comment.