auto merge of #7986 : alexcrichton/rust/raw-repr, r=brson
This moves the raw struct layout of closures, vectors, boxes, and strings into a new `unstable::raw` module. This is meant to be a centralized location to find information for the layout of these values. As safe method, `unwrap`, is provided to convert a rust value to its raw representation. Unsafe methods to convert back are not provided because they are rarely used and too numerous to write an implementation for each (not much of a common pattern). This is progress on #6790. I tried to get a nice interface for a trait to implement in the raw module, but I was unable to come up with one. The hard part is that there are so many different directions to go from one way to another that it's difficult to find a pattern to follow to implement a trait with. Someone else might have some better luck though.
This commit is contained in:
commit
4989799799
19 changed files with 254 additions and 255 deletions
|
|
@ -26,6 +26,7 @@ pub mod extfmt;
|
|||
pub mod lang;
|
||||
pub mod sync;
|
||||
pub mod atomics;
|
||||
pub mod raw;
|
||||
|
||||
/**
|
||||
|
||||
|
|
|
|||
61
src/libstd/unstable/raw.rs
Normal file
61
src/libstd/unstable/raw.rs
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use cast;
|
||||
use unstable::intrinsics::TyDesc;
|
||||
|
||||
/// The representation of a Rust managed box
|
||||
pub struct Box<T> {
|
||||
ref_count: uint,
|
||||
type_desc: *TyDesc,
|
||||
prev: *Box<T>,
|
||||
next: *Box<T>,
|
||||
data: T
|
||||
}
|
||||
|
||||
/// The representation of a Rust vector
|
||||
pub struct Vec<T> {
|
||||
fill: uint,
|
||||
alloc: uint,
|
||||
data: T
|
||||
}
|
||||
|
||||
/// The representation of a Rust string
|
||||
pub type String = Vec<u8>;
|
||||
|
||||
/// The representation of a Rust slice
|
||||
pub struct Slice<T> {
|
||||
data: *T,
|
||||
len: uint
|
||||
}
|
||||
|
||||
/// The representation of a Rust closure
|
||||
pub struct Closure {
|
||||
code: *(),
|
||||
env: *(),
|
||||
}
|
||||
|
||||
/// This trait is meant to map equivalences between raw structs and their
|
||||
/// corresponding rust values.
|
||||
pub trait Repr<T> {
|
||||
/// This function "unwraps" a rust value (without consuming it) into its raw
|
||||
/// struct representation. This can be used to read/write different values
|
||||
/// for the struct. This is a safe method because by default it does not
|
||||
/// give write-access to the struct returned.
|
||||
fn repr(&self) -> T { unsafe { cast::transmute_copy(self) } }
|
||||
}
|
||||
|
||||
impl<'self, T> Repr<Slice<T>> for &'self [T] {}
|
||||
impl<'self> Repr<Slice<u8>> for &'self str {}
|
||||
impl<T> Repr<*Box<T>> for @T {}
|
||||
impl<T> Repr<*Box<Vec<T>>> for @[T] {}
|
||||
|
||||
// sure would be nice to have this
|
||||
// impl<T> Repr<*Vec<T>> for ~[T] {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue