Skip to content

Commit

Permalink
DSTify ToCStr
Browse files Browse the repository at this point in the history
  • Loading branch information
Jorge Aparicio committed Oct 31, 2014
1 parent 82045ca commit dd9dda7
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 39 deletions.
44 changes: 29 additions & 15 deletions src/librustrt/c_str.rs
Expand Up @@ -74,7 +74,7 @@ fn main() {
use collections::string::String;
use collections::hash;
use core::fmt;
use core::kinds::marker;
use core::kinds::{Sized, marker};
use core::mem;
use core::prelude::{Clone, Collection, Drop, Eq, ImmutableSlice, Iterator};
use core::prelude::{MutableSlice, None, Option, Ordering, PartialEq};
Expand Down Expand Up @@ -286,7 +286,7 @@ impl fmt::Show for CString {
}

/// A generic trait for converting a value to a CString.
pub trait ToCStr {
pub trait ToCStr for Sized? {
/// Copy the receiver into a CString.
///
/// # Failure
Expand Down Expand Up @@ -329,15 +329,7 @@ pub trait ToCStr {
}
}

// FIXME (#12938): Until DST lands, we cannot decompose &str into &
// and str, so we cannot usefully take ToCStr arguments by reference
// (without forcing an additional & around &str). So we are instead
// temporarily adding an instance for ~str and String, so that we can
// take ToCStr as owned. When DST lands, the string instances should
// be revisited, and arguments bound by ToCStr should be passed by
// reference.

impl<'a> ToCStr for &'a str {
impl ToCStr for str {
#[inline]
fn to_c_str(&self) -> CString {
self.as_bytes().to_c_str()
Expand Down Expand Up @@ -384,10 +376,10 @@ impl ToCStr for String {
// The length of the stack allocated buffer for `vec.with_c_str()`
const BUF_LEN: uint = 128;

impl<'a> ToCStr for &'a [u8] {
impl ToCStr for [u8] {
fn to_c_str(&self) -> CString {
let mut cs = unsafe { self.to_c_str_unchecked() };
check_for_null(*self, cs.as_mut_ptr());
check_for_null(self, cs.as_mut_ptr());
cs
}

Expand All @@ -403,11 +395,33 @@ impl<'a> ToCStr for &'a [u8] {
}

fn with_c_str<T>(&self, f: |*const libc::c_char| -> T) -> T {
unsafe { with_c_str(*self, true, f) }
unsafe { with_c_str(self, true, f) }
}

unsafe fn with_c_str_unchecked<T>(&self, f: |*const libc::c_char| -> T) -> T {
with_c_str(self, false, f)
}
}

impl<'a, Sized? T: ToCStr> ToCStr for &'a T {
#[inline]
fn to_c_str(&self) -> CString {
(**self).to_c_str()
}

#[inline]
unsafe fn to_c_str_unchecked(&self) -> CString {
(**self).to_c_str_unchecked()
}

#[inline]
fn with_c_str<T>(&self, f: |*const libc::c_char| -> T) -> T {
(**self).with_c_str(f)
}

#[inline]
unsafe fn with_c_str_unchecked<T>(&self, f: |*const libc::c_char| -> T) -> T {
with_c_str(*self, false, f)
(**self).with_c_str_unchecked(f)
}
}

Expand Down
12 changes: 0 additions & 12 deletions src/libstd/path/posix.rs
Expand Up @@ -106,18 +106,6 @@ impl ToCStr for Path {
}
}

impl<'a> ToCStr for &'a Path {
#[inline]
fn to_c_str(&self) -> CString {
(*self).to_c_str()
}

#[inline]
unsafe fn to_c_str_unchecked(&self) -> CString {
(*self).to_c_str_unchecked()
}
}

impl<S: hash::Writer> hash::Hash<S> for Path {
#[inline]
fn hash(&self, state: &mut S) {
Expand Down
12 changes: 0 additions & 12 deletions src/libstd/path/windows.rs
Expand Up @@ -130,18 +130,6 @@ impl ToCStr for Path {
}
}

impl<'a> ToCStr for &'a Path {
#[inline]
fn to_c_str(&self) -> CString {
(*self).to_c_str()
}

#[inline]
unsafe fn to_c_str_unchecked(&self) -> CString {
(*self).to_c_str_unchecked()
}
}

impl<S: hash::Writer> hash::Hash<S> for Path {
#[cfg(not(test))]
#[inline]
Expand Down

5 comments on commit dd9dda7

@bors
Copy link
Contributor

@bors bors commented on dd9dda7 Nov 1, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from alexcrichton
at japaric@dd9dda7

@bors
Copy link
Contributor

@bors bors commented on dd9dda7 Nov 1, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging japaric/rust/tocstr = dd9dda7 into auto

@bors
Copy link
Contributor

@bors bors commented on dd9dda7 Nov 1, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

japaric/rust/tocstr = dd9dda7 merged ok, testing candidate = 0547a40

@bors
Copy link
Contributor

@bors bors commented on dd9dda7 Nov 1, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors
Copy link
Contributor

@bors bors commented on dd9dda7 Nov 1, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding master to auto = 0547a40

Please sign in to comment.