diff options
| author | bors <bors@rust-lang.org> | 2014-05-08 23:01:40 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-05-08 23:01:40 -0700 |
| commit | fcf25ae83d1f6bd7232d74ec5c1f4f1c642ec5b2 (patch) | |
| tree | d68d09fde5ff5d9e9875d23506c682ab88579fc9 | |
| parent | a990920c6fff9b762c3d0968ff0a5fdcce6d2b39 (diff) | |
| parent | 2aa42533772a6b3cd406c34f0de12327320cb875 (diff) | |
| download | rust-fcf25ae83d1f6bd7232d74ec5c1f4f1c642ec5b2.tar.gz rust-fcf25ae83d1f6bd7232d74ec5c1f4f1c642ec5b2.zip | |
auto merge of #14019 : brson/rust/docs, r=alexcrichton
Just small bits of polish.
| -rw-r--r-- | src/libcore/cast.rs | 64 | ||||
| -rw-r--r-- | src/libcore/cell.rs | 2 | ||||
| -rw-r--r-- | src/libcore/ptr.rs | 2 | ||||
| -rw-r--r-- | src/libstd/lib.rs | 7 |
4 files changed, 28 insertions, 47 deletions
diff --git a/src/libcore/cast.rs b/src/libcore/cast.rs index 8cea197fbfa..cf99fdbd5d4 100644 --- a/src/libcore/cast.rs +++ b/src/libcore/cast.rs @@ -14,32 +14,6 @@ use mem; use intrinsics; use ptr::copy_nonoverlapping_memory; -/// Casts the value at `src` to U. The two types must have the same length. -#[inline] -pub unsafe fn transmute_copy<T, U>(src: &T) -> U { - let mut dest: U = mem::uninit(); - let dest_ptr: *mut u8 = transmute(&mut dest); - let src_ptr: *u8 = transmute(src); - copy_nonoverlapping_memory(dest_ptr, src_ptr, mem::size_of::<U>()); - dest -} - -/** - * Move a thing into the void - * - * The forget function will take ownership of the provided value but neglect - * to run any required cleanup or memory-management operations on it. - */ -#[inline] -pub unsafe fn forget<T>(thing: T) { intrinsics::forget(thing); } - -/** - * Force-increment the reference count on a shared box. If used - * carelessly, this can leak the box. - */ -#[inline] -pub unsafe fn bump_box_refcount<T>(t: @T) { forget(t); } - /** * Transform a value of one type into a value of another type. * Both types must have the same size and alignment. @@ -54,10 +28,29 @@ pub unsafe fn bump_box_refcount<T>(t: @T) { forget(t); } * ``` */ #[inline] -pub unsafe fn transmute<L, G>(thing: L) -> G { +pub unsafe fn transmute<T, U>(thing: T) -> U { intrinsics::transmute(thing) } +/** + * Move a thing into the void + * + * The forget function will take ownership of the provided value but neglect + * to run any required cleanup or memory-management operations on it. + */ +#[inline] +pub unsafe fn forget<T>(thing: T) { intrinsics::forget(thing); } + +/// Casts the value at `src` to U. The two types must have the same length. +#[inline] +pub unsafe fn transmute_copy<T, U>(src: &T) -> U { + let mut dest: U = mem::uninit(); + let dest_ptr: *mut u8 = transmute(&mut dest); + let src_ptr: *u8 = transmute(src); + copy_nonoverlapping_memory(dest_ptr, src_ptr, mem::size_of::<U>()); + dest +} + /// Coerce an immutable reference to be mutable. #[inline] #[deprecated="casting &T to &mut T is undefined behaviour: use Cell<T>, RefCell<T> or Unsafe<T>"] @@ -106,7 +99,7 @@ pub unsafe fn copy_lifetime_vec<'a,S,T>(_ptr: &'a [S], ptr: &T) -> &'a T { #[cfg(test)] mod tests { - use cast::{bump_box_refcount, transmute}; + use cast::transmute; use raw; use realstd::str::StrAllocating; @@ -116,21 +109,6 @@ mod tests { } #[test] - fn test_bump_managed_refcount() { - unsafe { - let managed = @"box box box".to_owned(); // refcount 1 - bump_box_refcount(managed); // refcount 2 - let ptr: *int = transmute(managed); // refcount 2 - let _box1: @~str = ::cast::transmute_copy(&ptr); - let _box2: @~str = ::cast::transmute_copy(&ptr); - assert!(*_box1 == "box box box".to_owned()); - assert!(*_box2 == "box box box".to_owned()); - // Will destroy _box1 and _box2. Without the bump, this would - // use-after-free. With too many bumps, it would leak. - } - } - - #[test] fn test_transmute() { unsafe { let x = @100u8; diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs index 8951c7d806a..0413b31e8b7 100644 --- a/src/libcore/cell.rs +++ b/src/libcore/cell.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -//! Types dealing with dynamic mutability +//! Types that provide interior mutability. use clone::Clone; use cmp::Eq; diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index e3a3f78dcb9..bb587c0e42d 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// FIXME: talk about offset, copy_memory, copy_nonoverlapping_memory + //! Conveniences for working with unsafe pointers, the `*T`, and `*mut T` types. //! //! Working with unsafe pointers in Rust is fairly uncommon, diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 8a783b6f378..dae28777867 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -81,7 +81,7 @@ //! memory types, including [`atomics`](sync/atomics/index.html). //! //! Common types of I/O, including files, TCP, UPD, pipes, Unix domain sockets, -//! timers, and process spawning, are defined in the [`io`](io/index.html). +//! timers, and process spawning, are defined in the [`io`](io/index.html) module. //! //! Rust's I/O and concurrency depends on a small runtime interface //! that lives, along with its support code, in mod [`rt`](rt/index.html). @@ -90,10 +90,11 @@ //! //! ## The Rust prelude and macros //! -//! Finally, the [`prelude`](prelude/index.html) defines a set of +//! Finally, the [`prelude`](prelude/index.html) defines a //! common set of traits, types, and functions that are made available //! to all code by default. [`macros`](macros/index.html) contains -//! all the standard macros, such as `assert!`, `fail!`, `println!`. +//! all the standard macros, such as `assert!`, `fail!`, `println!`, +//! and `format!`, also available to all Rust code. #![crate_id = "std#0.11-pre"] #![comment = "The Rust standard library"] |
