librustc: Disallow trait bounds in types, enumerations, and structure definitions. r=tjc
This commit is contained in:
parent
eb4d39e1fe
commit
6ce74460e6
44 changed files with 424 additions and 107 deletions
|
@ -35,13 +35,13 @@ pub mod linear {
|
||||||
|
|
||||||
const INITIAL_CAPACITY: uint = 32u; // 2^5
|
const INITIAL_CAPACITY: uint = 32u; // 2^5
|
||||||
|
|
||||||
struct Bucket<K: Eq Hash, V> {
|
struct Bucket<K,V> {
|
||||||
hash: uint,
|
hash: uint,
|
||||||
key: K,
|
key: K,
|
||||||
value: V,
|
value: V,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct LinearMap<K: Eq Hash, V> {
|
pub struct LinearMap<K,V> {
|
||||||
k0: u64,
|
k0: u64,
|
||||||
k1: u64,
|
k1: u64,
|
||||||
resize_at: uint,
|
resize_at: uint,
|
||||||
|
@ -408,7 +408,7 @@ pub mod linear {
|
||||||
pure fn ne(&self, other: &LinearMap<K, V>) -> bool { !self.eq(other) }
|
pure fn ne(&self, other: &LinearMap<K, V>) -> bool { !self.eq(other) }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct LinearSet<T: Hash IterBytes Eq> {
|
pub struct LinearSet<T> {
|
||||||
priv map: LinearMap<T, ()>
|
priv map: LinearMap<T, ()>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1111,7 +1111,7 @@ pub mod fsync {
|
||||||
|
|
||||||
|
|
||||||
// Artifacts that need to fsync on destruction
|
// Artifacts that need to fsync on destruction
|
||||||
pub struct Res<t: Copy> {
|
pub struct Res<t> {
|
||||||
arg: Arg<t>,
|
arg: Arg<t>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ use vec;
|
||||||
* transmitted. If a port value is copied, both copies refer to the same
|
* transmitted. If a port value is copied, both copies refer to the same
|
||||||
* port. Ports may be associated with multiple `chan`s.
|
* port. Ports may be associated with multiple `chan`s.
|
||||||
*/
|
*/
|
||||||
pub enum Port<T: Owned> {
|
pub enum Port<T> {
|
||||||
Port_(@PortPtr<T>)
|
Port_(@PortPtr<T>)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ pub enum Port<T: Owned> {
|
||||||
* data will be silently dropped. Channels may be duplicated and
|
* data will be silently dropped. Channels may be duplicated and
|
||||||
* themselves transmitted over other channels.
|
* themselves transmitted over other channels.
|
||||||
*/
|
*/
|
||||||
pub enum Chan<T: Owned> {
|
pub enum Chan<T> {
|
||||||
Chan_(port_id)
|
Chan_(port_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ pub fn listen<T: Owned, U>(f: fn(Chan<T>) -> U) -> U {
|
||||||
f(po.chan())
|
f(po.chan())
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PortPtr<T:Owned> {
|
struct PortPtr<T> {
|
||||||
po: *rust_port,
|
po: *rust_port,
|
||||||
drop {
|
drop {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -238,7 +238,7 @@ fn peek_chan<T: Owned>(ch: Chan<T>) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Receive on a raw port pointer
|
/// Receive on a raw port pointer
|
||||||
fn recv_<T: Owned>(p: *rust_port) -> T {
|
fn recv_<T>(p: *rust_port) -> T {
|
||||||
unsafe {
|
unsafe {
|
||||||
let yield = 0;
|
let yield = 0;
|
||||||
let yieldp = ptr::addr_of(&yield);
|
let yieldp = ptr::addr_of(&yield);
|
||||||
|
|
|
@ -151,7 +151,7 @@ type Buffer<T: Owned> = {
|
||||||
#[cfg(stage1)]
|
#[cfg(stage1)]
|
||||||
#[cfg(stage2)]
|
#[cfg(stage2)]
|
||||||
#[cfg(stage3)]
|
#[cfg(stage3)]
|
||||||
pub struct Buffer<T: Owned> {
|
pub struct Buffer<T> {
|
||||||
header: BufferHeader,
|
header: BufferHeader,
|
||||||
data: T,
|
data: T,
|
||||||
}
|
}
|
||||||
|
@ -212,10 +212,18 @@ impl PacketHeader {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage0)]
|
||||||
pub struct Packet<T: Owned> {
|
pub struct Packet<T: Owned> {
|
||||||
header: PacketHeader,
|
header: PacketHeader,
|
||||||
mut payload: Option<T>,
|
mut payload: Option<T>,
|
||||||
}
|
}
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub struct Packet<T> {
|
||||||
|
header: PacketHeader,
|
||||||
|
mut payload: Option<T>,
|
||||||
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub trait HasBuffer {
|
pub trait HasBuffer {
|
||||||
|
@ -256,12 +264,11 @@ fn unibuffer<T: Owned>() -> ~Buffer<Packet<T>> {
|
||||||
}
|
}
|
||||||
move b
|
move b
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[cfg(stage1)]
|
#[cfg(stage1)]
|
||||||
#[cfg(stage2)]
|
#[cfg(stage2)]
|
||||||
#[cfg(stage3)]
|
#[cfg(stage3)]
|
||||||
fn unibuffer<T: Owned>() -> ~Buffer<Packet<T>> {
|
fn unibuffer<T>() -> ~Buffer<Packet<T>> {
|
||||||
let b = ~Buffer {
|
let b = ~Buffer {
|
||||||
header: BufferHeader(),
|
header: BufferHeader(),
|
||||||
data: Packet {
|
data: Packet {
|
||||||
|
@ -277,6 +284,7 @@ fn unibuffer<T: Owned>() -> ~Buffer<Packet<T>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage0)]
|
||||||
pub fn packet<T: Owned>() -> *Packet<T> {
|
pub fn packet<T: Owned>() -> *Packet<T> {
|
||||||
let b = unibuffer();
|
let b = unibuffer();
|
||||||
let p = ptr::addr_of(&(b.data));
|
let p = ptr::addr_of(&(b.data));
|
||||||
|
@ -284,6 +292,16 @@ pub fn packet<T: Owned>() -> *Packet<T> {
|
||||||
unsafe { forget(move b) }
|
unsafe { forget(move b) }
|
||||||
p
|
p
|
||||||
}
|
}
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub fn packet<T>() -> *Packet<T> {
|
||||||
|
let b = unibuffer();
|
||||||
|
let p = ptr::addr_of(&(b.data));
|
||||||
|
// We'll take over memory management from here.
|
||||||
|
unsafe { forget(move b) }
|
||||||
|
p
|
||||||
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub fn entangle_buffer<T: Owned, Tstart: Owned>(
|
pub fn entangle_buffer<T: Owned, Tstart: Owned>(
|
||||||
|
@ -387,11 +405,19 @@ fn swap_state_rel(dst: &mut State, src: State) -> State {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage0)]
|
||||||
pub unsafe fn get_buffer<T: Owned>(p: *PacketHeader) -> ~Buffer<T> {
|
pub unsafe fn get_buffer<T: Owned>(p: *PacketHeader) -> ~Buffer<T> {
|
||||||
transmute((*p).buf_header())
|
transmute((*p).buf_header())
|
||||||
}
|
}
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub unsafe fn get_buffer<T>(p: *PacketHeader) -> ~Buffer<T> {
|
||||||
|
transmute((*p).buf_header())
|
||||||
|
}
|
||||||
|
|
||||||
// This could probably be done with SharedMutableState to avoid move_it!().
|
// This could probably be done with SharedMutableState to avoid move_it!().
|
||||||
|
#[cfg(stage0)]
|
||||||
struct BufferResource<T: Owned> {
|
struct BufferResource<T: Owned> {
|
||||||
buffer: ~Buffer<T>,
|
buffer: ~Buffer<T>,
|
||||||
|
|
||||||
|
@ -413,7 +439,31 @@ struct BufferResource<T: Owned> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
struct BufferResource<T> {
|
||||||
|
buffer: ~Buffer<T>,
|
||||||
|
|
||||||
|
drop {
|
||||||
|
unsafe {
|
||||||
|
let b = move_it!(self.buffer);
|
||||||
|
//let p = ptr::addr_of(*b);
|
||||||
|
//error!("drop %?", p);
|
||||||
|
let old_count = atomic_sub_rel(&mut b.header.ref_count, 1);
|
||||||
|
//let old_count = atomic_xchng_rel(b.header.ref_count, 0);
|
||||||
|
if old_count == 1 {
|
||||||
|
// The new count is 0.
|
||||||
|
|
||||||
|
// go go gadget drop glue
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
forget(move b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(stage0)]
|
||||||
fn BufferResource<T: Owned>(b: ~Buffer<T>) -> BufferResource<T> {
|
fn BufferResource<T: Owned>(b: ~Buffer<T>) -> BufferResource<T> {
|
||||||
//let p = ptr::addr_of(*b);
|
//let p = ptr::addr_of(*b);
|
||||||
//error!("take %?", p);
|
//error!("take %?", p);
|
||||||
|
@ -424,8 +474,21 @@ fn BufferResource<T: Owned>(b: ~Buffer<T>) -> BufferResource<T> {
|
||||||
buffer: move b
|
buffer: move b
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
fn BufferResource<T>(b: ~Buffer<T>) -> BufferResource<T> {
|
||||||
|
//let p = ptr::addr_of(*b);
|
||||||
|
//error!("take %?", p);
|
||||||
|
atomic_add_acq(&mut b.header.ref_count, 1);
|
||||||
|
|
||||||
|
BufferResource {
|
||||||
|
// tjc: ????
|
||||||
|
buffer: move b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage0)]
|
||||||
pub fn send<T: Owned, Tbuffer: Owned>(p: SendPacketBuffered<T, Tbuffer>,
|
pub fn send<T: Owned, Tbuffer: Owned>(p: SendPacketBuffered<T, Tbuffer>,
|
||||||
payload: T) -> bool {
|
payload: T) -> bool {
|
||||||
let header = p.header();
|
let header = p.header();
|
||||||
|
@ -467,6 +530,49 @@ pub fn send<T: Owned, Tbuffer: Owned>(p: SendPacketBuffered<T, Tbuffer>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub fn send<T,Tbuffer>(p: SendPacketBuffered<T,Tbuffer>, payload: T) -> bool {
|
||||||
|
let header = p.header();
|
||||||
|
let p_ = p.unwrap();
|
||||||
|
let p = unsafe { &*p_ };
|
||||||
|
assert ptr::addr_of(&(p.header)) == header;
|
||||||
|
assert p.payload.is_none();
|
||||||
|
p.payload = move Some(move payload);
|
||||||
|
let old_state = swap_state_rel(&mut p.header.state, Full);
|
||||||
|
match old_state {
|
||||||
|
Empty => {
|
||||||
|
// Yay, fastpath.
|
||||||
|
|
||||||
|
// The receiver will eventually clean this up.
|
||||||
|
//unsafe { forget(p); }
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Full => fail ~"duplicate send",
|
||||||
|
Blocked => {
|
||||||
|
debug!("waking up task for %?", p_);
|
||||||
|
let old_task = swap_task(&mut p.header.blocked_task, ptr::null());
|
||||||
|
if !old_task.is_null() {
|
||||||
|
unsafe {
|
||||||
|
rustrt::task_signal_event(
|
||||||
|
old_task,
|
||||||
|
ptr::addr_of(&(p.header)) as *libc::c_void);
|
||||||
|
rustrt::rust_task_deref(old_task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The receiver will eventually clean this up.
|
||||||
|
//unsafe { forget(p); }
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Terminated => {
|
||||||
|
// The receiver will never receive this. Rely on drop_glue
|
||||||
|
// to clean everything up.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Receives a message from a pipe.
|
/** Receives a message from a pipe.
|
||||||
|
|
||||||
|
@ -812,13 +918,24 @@ pub fn select<T: Owned, Tb: Owned>(endpoints: ~[RecvPacketBuffered<T, Tb>])
|
||||||
message.
|
message.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
#[cfg(stage0)]
|
||||||
pub type SendPacket<T: Owned> = SendPacketBuffered<T, Packet<T>>;
|
pub type SendPacket<T: Owned> = SendPacketBuffered<T, Packet<T>>;
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub type SendPacket<T> = SendPacketBuffered<T, Packet<T>>;
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage0)]
|
||||||
pub fn SendPacket<T: Owned>(p: *Packet<T>) -> SendPacket<T> {
|
pub fn SendPacket<T: Owned>(p: *Packet<T>) -> SendPacket<T> {
|
||||||
SendPacketBuffered(p)
|
SendPacketBuffered(p)
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub fn SendPacket<T>(p: *Packet<T>) -> SendPacket<T> {
|
||||||
|
SendPacketBuffered(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(stage0)]
|
||||||
pub struct SendPacketBuffered<T: Owned, Tbuffer: Owned> {
|
pub struct SendPacketBuffered<T: Owned, Tbuffer: Owned> {
|
||||||
mut p: Option<*Packet<T>>,
|
mut p: Option<*Packet<T>>,
|
||||||
mut buffer: Option<BufferResource<Tbuffer>>,
|
mut buffer: Option<BufferResource<Tbuffer>>,
|
||||||
|
@ -837,7 +954,31 @@ pub struct SendPacketBuffered<T: Owned, Tbuffer: Owned> {
|
||||||
// } else { "some" }); }
|
// } else { "some" }); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub struct SendPacketBuffered<T, Tbuffer> {
|
||||||
|
mut p: Option<*Packet<T>>,
|
||||||
|
mut buffer: Option<BufferResource<Tbuffer>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T:Owned,Tbuffer:Owned> SendPacketBuffered<T,Tbuffer> : ::ops::Drop {
|
||||||
|
fn finalize(&self) {
|
||||||
|
//if self.p != none {
|
||||||
|
// debug!("drop send %?", option::get(self.p));
|
||||||
|
//}
|
||||||
|
if self.p != None {
|
||||||
|
let mut p = None;
|
||||||
|
p <-> self.p;
|
||||||
|
sender_terminate(option::unwrap(move p))
|
||||||
|
}
|
||||||
|
//unsafe { error!("send_drop: %?",
|
||||||
|
// if self.buffer == none {
|
||||||
|
// "none"
|
||||||
|
// } else { "some" }); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(stage0)]
|
||||||
pub fn SendPacketBuffered<T: Owned, Tbuffer: Owned>(p: *Packet<T>)
|
pub fn SendPacketBuffered<T: Owned, Tbuffer: Owned>(p: *Packet<T>)
|
||||||
-> SendPacketBuffered<T, Tbuffer> {
|
-> SendPacketBuffered<T, Tbuffer> {
|
||||||
//debug!("take send %?", p);
|
//debug!("take send %?", p);
|
||||||
|
@ -849,8 +990,50 @@ pub fn SendPacketBuffered<T: Owned, Tbuffer: Owned>(p: *Packet<T>)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub fn SendPacketBuffered<T,Tbuffer>(p: *Packet<T>)
|
||||||
|
-> SendPacketBuffered<T, Tbuffer> {
|
||||||
|
//debug!("take send %?", p);
|
||||||
|
SendPacketBuffered {
|
||||||
|
p: Some(p),
|
||||||
|
buffer: unsafe {
|
||||||
|
Some(BufferResource(
|
||||||
|
get_buffer(ptr::addr_of(&((*p).header)))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: Owned, Tbuffer: Owned> SendPacketBuffered<T, Tbuffer> {
|
#[cfg(stage0)]
|
||||||
|
impl<T:Owned,Tbuffer:Owned> SendPacketBuffered<T,Tbuffer> {
|
||||||
|
fn unwrap() -> *Packet<T> {
|
||||||
|
let mut p = None;
|
||||||
|
p <-> self.p;
|
||||||
|
option::unwrap(move p)
|
||||||
|
}
|
||||||
|
|
||||||
|
pure fn header() -> *PacketHeader {
|
||||||
|
match self.p {
|
||||||
|
Some(packet) => unsafe {
|
||||||
|
let packet = &*packet;
|
||||||
|
let header = ptr::addr_of(&(packet.header));
|
||||||
|
//forget(packet);
|
||||||
|
header
|
||||||
|
},
|
||||||
|
None => fail ~"packet already consumed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reuse_buffer() -> BufferResource<Tbuffer> {
|
||||||
|
//error!("send reuse_buffer");
|
||||||
|
let mut tmp = None;
|
||||||
|
tmp <-> self.buffer;
|
||||||
|
option::unwrap(move tmp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
impl<T,Tbuffer> SendPacketBuffered<T,Tbuffer> {
|
||||||
fn unwrap() -> *Packet<T> {
|
fn unwrap() -> *Packet<T> {
|
||||||
let mut p = None;
|
let mut p = None;
|
||||||
p <-> self.p;
|
p <-> self.p;
|
||||||
|
@ -879,13 +1062,25 @@ impl<T: Owned, Tbuffer: Owned> SendPacketBuffered<T, Tbuffer> {
|
||||||
|
|
||||||
/// Represents the receive end of a pipe. It can receive exactly one
|
/// Represents the receive end of a pipe. It can receive exactly one
|
||||||
/// message.
|
/// message.
|
||||||
|
#[cfg(stage0)]
|
||||||
pub type RecvPacket<T: Owned> = RecvPacketBuffered<T, Packet<T>>;
|
pub type RecvPacket<T: Owned> = RecvPacketBuffered<T, Packet<T>>;
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub type RecvPacket<T> = RecvPacketBuffered<T, Packet<T>>;
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage0)]
|
||||||
pub fn RecvPacket<T: Owned>(p: *Packet<T>) -> RecvPacket<T> {
|
pub fn RecvPacket<T: Owned>(p: *Packet<T>) -> RecvPacket<T> {
|
||||||
RecvPacketBuffered(p)
|
RecvPacketBuffered(p)
|
||||||
}
|
}
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub fn RecvPacket<T>(p: *Packet<T>) -> RecvPacket<T> {
|
||||||
|
RecvPacketBuffered(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(stage0)]
|
||||||
pub struct RecvPacketBuffered<T: Owned, Tbuffer: Owned> {
|
pub struct RecvPacketBuffered<T: Owned, Tbuffer: Owned> {
|
||||||
mut p: Option<*Packet<T>>,
|
mut p: Option<*Packet<T>>,
|
||||||
mut buffer: Option<BufferResource<Tbuffer>>,
|
mut buffer: Option<BufferResource<Tbuffer>>,
|
||||||
|
@ -904,6 +1099,29 @@ pub struct RecvPacketBuffered<T: Owned, Tbuffer: Owned> {
|
||||||
// } else { "some" }); }
|
// } else { "some" }); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub struct RecvPacketBuffered<T, Tbuffer> {
|
||||||
|
mut p: Option<*Packet<T>>,
|
||||||
|
mut buffer: Option<BufferResource<Tbuffer>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T:Owned, Tbuffer:Owned> RecvPacketBuffered<T,Tbuffer> : ::ops::Drop {
|
||||||
|
fn finalize(&self) {
|
||||||
|
//if self.p != none {
|
||||||
|
// debug!("drop recv %?", option::get(self.p));
|
||||||
|
//}
|
||||||
|
if self.p != None {
|
||||||
|
let mut p = None;
|
||||||
|
p <-> self.p;
|
||||||
|
receiver_terminate(option::unwrap(move p))
|
||||||
|
}
|
||||||
|
//unsafe { error!("recv_drop: %?",
|
||||||
|
// if self.buffer == none {
|
||||||
|
// "none"
|
||||||
|
// } else { "some" }); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: Owned, Tbuffer: Owned> RecvPacketBuffered<T, Tbuffer> {
|
impl<T: Owned, Tbuffer: Owned> RecvPacketBuffered<T, Tbuffer> {
|
||||||
fn unwrap() -> *Packet<T> {
|
fn unwrap() -> *Packet<T> {
|
||||||
|
@ -934,6 +1152,7 @@ impl<T: Owned, Tbuffer: Owned> RecvPacketBuffered<T, Tbuffer> : Selectable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(stage0)]
|
||||||
pub fn RecvPacketBuffered<T: Owned, Tbuffer: Owned>(p: *Packet<T>)
|
pub fn RecvPacketBuffered<T: Owned, Tbuffer: Owned>(p: *Packet<T>)
|
||||||
-> RecvPacketBuffered<T, Tbuffer> {
|
-> RecvPacketBuffered<T, Tbuffer> {
|
||||||
//debug!("take recv %?", p);
|
//debug!("take recv %?", p);
|
||||||
|
@ -945,12 +1164,33 @@ pub fn RecvPacketBuffered<T: Owned, Tbuffer: Owned>(p: *Packet<T>)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub fn RecvPacketBuffered<T,Tbuffer>(p: *Packet<T>)
|
||||||
|
-> RecvPacketBuffered<T,Tbuffer> {
|
||||||
|
//debug!("take recv %?", p);
|
||||||
|
RecvPacketBuffered {
|
||||||
|
p: Some(p),
|
||||||
|
buffer: unsafe {
|
||||||
|
Some(BufferResource(
|
||||||
|
get_buffer(ptr::addr_of(&((*p).header)))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage0)]
|
||||||
pub fn entangle<T: Owned>() -> (SendPacket<T>, RecvPacket<T>) {
|
pub fn entangle<T: Owned>() -> (SendPacket<T>, RecvPacket<T>) {
|
||||||
let p = packet();
|
let p = packet();
|
||||||
(SendPacket(p), RecvPacket(p))
|
(SendPacket(p), RecvPacket(p))
|
||||||
}
|
}
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub fn entangle<T>() -> (SendPacket<T>, RecvPacket<T>) {
|
||||||
|
let p = packet();
|
||||||
|
(SendPacket(p), RecvPacket(p))
|
||||||
|
}
|
||||||
|
|
||||||
/** Spawn a task to provide a service.
|
/** Spawn a task to provide a service.
|
||||||
|
|
||||||
|
@ -1042,24 +1282,50 @@ pub trait Peekable<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage0)]
|
||||||
struct Chan_<T:Owned> {
|
struct Chan_<T:Owned> {
|
||||||
mut endp: Option<streamp::client::Open<T>>,
|
mut endp: Option<streamp::client::Open<T>>
|
||||||
|
}
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
struct Chan_<T> {
|
||||||
|
mut endp: Option<streamp::client::Open<T>>
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An endpoint that can send many messages.
|
/// An endpoint that can send many messages.
|
||||||
|
#[cfg(stage0)]
|
||||||
pub enum Chan<T:Owned> {
|
pub enum Chan<T:Owned> {
|
||||||
Chan_(Chan_<T>)
|
Chan_(Chan_<T>)
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub enum Chan<T> {
|
||||||
|
Chan_(Chan_<T>)
|
||||||
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage0)]
|
||||||
struct Port_<T:Owned> {
|
struct Port_<T:Owned> {
|
||||||
mut endp: Option<streamp::server::Open<T>>,
|
mut endp: Option<streamp::server::Open<T>>,
|
||||||
}
|
}
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
struct Port_<T> {
|
||||||
|
mut endp: Option<streamp::server::Open<T>>,
|
||||||
|
}
|
||||||
|
|
||||||
/// An endpoint that can receive many messages.
|
/// An endpoint that can receive many messages.
|
||||||
|
#[cfg(stage0)]
|
||||||
pub enum Port<T:Owned> {
|
pub enum Port<T:Owned> {
|
||||||
Port_(Port_<T>)
|
Port_(Port_<T>)
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub enum Port<T> {
|
||||||
|
Port_(Port_<T>)
|
||||||
|
}
|
||||||
|
|
||||||
/** Creates a `(chan, port)` pair.
|
/** Creates a `(chan, port)` pair.
|
||||||
|
|
||||||
|
@ -1145,9 +1411,15 @@ impl<T: Owned> Port<T>: Selectable {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Treat many ports as one.
|
/// Treat many ports as one.
|
||||||
|
#[cfg(stage0)]
|
||||||
pub struct PortSet<T: Owned> {
|
pub struct PortSet<T: Owned> {
|
||||||
mut ports: ~[pipes::Port<T>],
|
mut ports: ~[pipes::Port<T>],
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub struct PortSet<T> {
|
||||||
|
mut ports: ~[pipes::Port<T>],
|
||||||
|
}
|
||||||
|
|
||||||
pub fn PortSet<T: Owned>() -> PortSet<T>{
|
pub fn PortSet<T: Owned>() -> PortSet<T>{
|
||||||
PortSet {
|
PortSet {
|
||||||
|
@ -1210,7 +1482,11 @@ impl<T: Owned> PortSet<T> : Peekable<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A channel that can be shared between many senders.
|
/// A channel that can be shared between many senders.
|
||||||
|
#[cfg(stage0)]
|
||||||
pub type SharedChan<T: Owned> = private::Exclusive<Chan<T>>;
|
pub type SharedChan<T: Owned> = private::Exclusive<Chan<T>>;
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub type SharedChan<T> = private::Exclusive<Chan<T>>;
|
||||||
|
|
||||||
impl<T: Owned> SharedChan<T>: GenericChan<T> {
|
impl<T: Owned> SharedChan<T>: GenericChan<T> {
|
||||||
fn send(x: T) {
|
fn send(x: T) {
|
||||||
|
@ -1278,9 +1554,17 @@ proto! oneshot (
|
||||||
)
|
)
|
||||||
|
|
||||||
/// The send end of a oneshot pipe.
|
/// The send end of a oneshot pipe.
|
||||||
|
#[cfg(stage0)]
|
||||||
pub type ChanOne<T: Owned> = oneshot::client::Oneshot<T>;
|
pub type ChanOne<T: Owned> = oneshot::client::Oneshot<T>;
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub type ChanOne<T> = oneshot::client::Oneshot<T>;
|
||||||
/// The receive end of a oneshot pipe.
|
/// The receive end of a oneshot pipe.
|
||||||
|
#[cfg(stage0)]
|
||||||
pub type PortOne<T: Owned> = oneshot::server::Oneshot<T>;
|
pub type PortOne<T: Owned> = oneshot::server::Oneshot<T>;
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub type PortOne<T> = oneshot::server::Oneshot<T>;
|
||||||
|
|
||||||
/// Initialiase a (send-endpoint, recv-endpoint) oneshot pipe pair.
|
/// Initialiase a (send-endpoint, recv-endpoint) oneshot pipe pair.
|
||||||
pub fn oneshot<T: Owned>() -> (PortOne<T>, ChanOne<T>) {
|
pub fn oneshot<T: Owned>() -> (PortOne<T>, ChanOne<T>) {
|
||||||
|
|
|
@ -238,7 +238,7 @@ pub unsafe fn unwrap_shared_mutable_state<T: Owned>(rc: SharedMutableState<T>)
|
||||||
* Data races between tasks can result in crashes and, with sufficient
|
* Data races between tasks can result in crashes and, with sufficient
|
||||||
* cleverness, arbitrary type coercion.
|
* cleverness, arbitrary type coercion.
|
||||||
*/
|
*/
|
||||||
pub type SharedMutableState<T: Owned> = ArcDestruct<T>;
|
pub type SharedMutableState<T> = ArcDestruct<T>;
|
||||||
|
|
||||||
pub unsafe fn shared_mutable_state<T: Owned>(data: T) ->
|
pub unsafe fn shared_mutable_state<T: Owned>(data: T) ->
|
||||||
SharedMutableState<T> {
|
SharedMutableState<T> {
|
||||||
|
@ -341,11 +341,11 @@ impl LittleLock {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ExData<T: Owned> { lock: LittleLock, mut failed: bool, mut data: T, }
|
struct ExData<T> { lock: LittleLock, mut failed: bool, mut data: T, }
|
||||||
/**
|
/**
|
||||||
* An arc over mutable data that is protected by a lock. For library use only.
|
* An arc over mutable data that is protected by a lock. For library use only.
|
||||||
*/
|
*/
|
||||||
pub struct Exclusive<T: Owned> { x: SharedMutableState<ExData<T>> }
|
pub struct Exclusive<T> { x: SharedMutableState<ExData<T>> }
|
||||||
|
|
||||||
pub fn exclusive<T:Owned >(user_data: T) -> Exclusive<T> {
|
pub fn exclusive<T:Owned >(user_data: T) -> Exclusive<T> {
|
||||||
let data = ExData {
|
let data = ExData {
|
||||||
|
|
|
@ -41,7 +41,7 @@ use sys::Closure;
|
||||||
use task::spawn;
|
use task::spawn;
|
||||||
use uint;
|
use uint;
|
||||||
|
|
||||||
pub type GlobalDataKey<T: Owned> = &fn(v: T);
|
pub type GlobalDataKey<T> = &fn(v: T);
|
||||||
|
|
||||||
pub unsafe fn global_data_clone_create<T: Owned Clone>(
|
pub unsafe fn global_data_clone_create<T: Owned Clone>(
|
||||||
key: GlobalDataKey<T>, create: &fn() -> ~T) -> T {
|
key: GlobalDataKey<T>, create: &fn() -> ~T) -> T {
|
||||||
|
|
|
@ -41,7 +41,7 @@ pub fn align(size: uint, align: uint) -> uint {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Adaptor to wrap around visitors implementing MovePtr.
|
/// Adaptor to wrap around visitors implementing MovePtr.
|
||||||
pub struct MovePtrAdaptor<V: TyVisitor MovePtr> {
|
pub struct MovePtrAdaptor<V> {
|
||||||
inner: V
|
inner: V
|
||||||
}
|
}
|
||||||
pub fn MovePtrAdaptor<V: TyVisitor MovePtr>(v: V) -> MovePtrAdaptor<V> {
|
pub fn MovePtrAdaptor<V: TyVisitor MovePtr>(v: V) -> MovePtrAdaptor<V> {
|
||||||
|
|
|
@ -45,7 +45,7 @@ use task;
|
||||||
*
|
*
|
||||||
* These two cases aside, the interface is safe.
|
* These two cases aside, the interface is safe.
|
||||||
*/
|
*/
|
||||||
pub type LocalDataKey<T: Durable> = &fn(v: @T);
|
pub type LocalDataKey<T> = &fn(v: @T);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a task-local data value from the table, returning the
|
* Remove a task-local data value from the table, returning the
|
||||||
|
|
|
@ -77,7 +77,7 @@ use cast;
|
||||||
use container::Map;
|
use container::Map;
|
||||||
use oldcomm;
|
use oldcomm;
|
||||||
use option;
|
use option;
|
||||||
use pipes::{Chan, GenericChan, GenericPort, Port};
|
use pipes::{Chan, GenericChan, GenericPort, Port, stream};
|
||||||
use pipes;
|
use pipes;
|
||||||
use prelude::*;
|
use prelude::*;
|
||||||
use private;
|
use private;
|
||||||
|
|
|
@ -569,7 +569,7 @@ struct FnSig {
|
||||||
* by the meta information because, in some cases, the
|
* by the meta information because, in some cases, the
|
||||||
* meta information is inferred. */
|
* meta information is inferred. */
|
||||||
#[deriving_eq]
|
#[deriving_eq]
|
||||||
struct FnTyBase<M: cmp::Eq> {
|
struct FnTyBase<M> {
|
||||||
meta: M, // Either FnMeta or FnVid
|
meta: M, // Either FnMeta or FnVid
|
||||||
sig: FnSig // Types of arguments/return type
|
sig: FnSig // Types of arguments/return type
|
||||||
}
|
}
|
||||||
|
|
|
@ -598,6 +598,20 @@ fn convert_methods(ccx: @crate_ctxt,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn ensure_no_ty_param_bounds(ccx: @crate_ctxt,
|
||||||
|
span: span,
|
||||||
|
ty_params: &[ast::ty_param],
|
||||||
|
thing: &static/str) {
|
||||||
|
for ty_params.each |ty_param| {
|
||||||
|
if ty_param.bounds.len() > 0 {
|
||||||
|
ccx.tcx.sess.span_err(
|
||||||
|
span,
|
||||||
|
fmt!("trait bounds are not allowed in %s definitions",
|
||||||
|
thing));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn convert(ccx: @crate_ctxt, it: @ast::item) {
|
fn convert(ccx: @crate_ctxt, it: @ast::item) {
|
||||||
let tcx = ccx.tcx;
|
let tcx = ccx.tcx;
|
||||||
let rp = tcx.region_paramd_items.find(it.id);
|
let rp = tcx.region_paramd_items.find(it.id);
|
||||||
|
@ -607,6 +621,7 @@ fn convert(ccx: @crate_ctxt, it: @ast::item) {
|
||||||
// These don't define types.
|
// These don't define types.
|
||||||
ast::item_foreign_mod(_) | ast::item_mod(_) => {}
|
ast::item_foreign_mod(_) | ast::item_mod(_) => {}
|
||||||
ast::item_enum(ref enum_definition, ref ty_params) => {
|
ast::item_enum(ref enum_definition, ref ty_params) => {
|
||||||
|
ensure_no_ty_param_bounds(ccx, it.span, *ty_params, "enumeration");
|
||||||
let tpt = ty_of_item(ccx, it);
|
let tpt = ty_of_item(ccx, it);
|
||||||
write_ty_to_tcx(tcx, it.id, tpt.ty);
|
write_ty_to_tcx(tcx, it.id, tpt.ty);
|
||||||
get_enum_variant_types(ccx,
|
get_enum_variant_types(ccx,
|
||||||
|
@ -644,6 +659,8 @@ fn convert(ccx: @crate_ctxt, it: @ast::item) {
|
||||||
let _ = convert_methods(ccx, provided_methods, rp, bounds);
|
let _ = convert_methods(ccx, provided_methods, rp, bounds);
|
||||||
}
|
}
|
||||||
ast::item_struct(struct_def, tps) => {
|
ast::item_struct(struct_def, tps) => {
|
||||||
|
ensure_no_ty_param_bounds(ccx, it.span, tps, "structure");
|
||||||
|
|
||||||
// Write the class type
|
// Write the class type
|
||||||
let tpt = ty_of_item(ccx, it);
|
let tpt = ty_of_item(ccx, it);
|
||||||
write_ty_to_tcx(tcx, it.id, tpt.ty);
|
write_ty_to_tcx(tcx, it.id, tpt.ty);
|
||||||
|
@ -651,6 +668,11 @@ fn convert(ccx: @crate_ctxt, it: @ast::item) {
|
||||||
|
|
||||||
convert_struct(ccx, rp, struct_def, tps, tpt, it.id);
|
convert_struct(ccx, rp, struct_def, tps, tpt, it.id);
|
||||||
}
|
}
|
||||||
|
ast::item_ty(_, ref ty_params) => {
|
||||||
|
ensure_no_ty_param_bounds(ccx, it.span, *ty_params, "type");
|
||||||
|
let tpt = ty_of_item(ccx, it);
|
||||||
|
write_ty_to_tcx(tcx, it.id, tpt.ty);
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
// This call populates the type cache with the converted type
|
// This call populates the type cache with the converted type
|
||||||
// of the item in passing. All we have to do here is to write
|
// of the item in passing. All we have to do here is to write
|
||||||
|
|
|
@ -31,7 +31,7 @@ struct ValsAndBindings<V, T> {
|
||||||
mut bindings: ~[(V, VarValue<V, T>)],
|
mut bindings: ~[(V, VarValue<V, T>)],
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Node<V:Copy, T:Copy> {
|
struct Node<V, T> {
|
||||||
root: V,
|
root: V,
|
||||||
possible_types: T,
|
possible_types: T,
|
||||||
rank: uint,
|
rank: uint,
|
||||||
|
|
|
@ -79,7 +79,7 @@ impl &Condvar {
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/// An atomically reference counted wrapper for shared immutable state.
|
/// An atomically reference counted wrapper for shared immutable state.
|
||||||
struct ARC<T: Const Owned> { x: SharedMutableState<T> }
|
struct ARC<T> { x: SharedMutableState<T> }
|
||||||
|
|
||||||
/// Create an atomically reference counted wrapper.
|
/// Create an atomically reference counted wrapper.
|
||||||
pub fn ARC<T: Const Owned>(data: T) -> ARC<T> {
|
pub fn ARC<T: Const Owned>(data: T) -> ARC<T> {
|
||||||
|
@ -130,9 +130,9 @@ impl<T: Const Owned> ARC<T>: Clone {
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
struct MutexARCInner<T: Owned> { lock: Mutex, failed: bool, data: T }
|
struct MutexARCInner<T> { lock: Mutex, failed: bool, data: T }
|
||||||
/// An ARC with mutable data protected by a blocking mutex.
|
/// An ARC with mutable data protected by a blocking mutex.
|
||||||
struct MutexARC<T: Owned> { x: SharedMutableState<MutexARCInner<T>> }
|
struct MutexARC<T> { x: SharedMutableState<MutexARCInner<T>> }
|
||||||
|
|
||||||
/// Create a mutex-protected ARC with the supplied data.
|
/// Create a mutex-protected ARC with the supplied data.
|
||||||
pub fn MutexARC<T: Owned>(user_data: T) -> MutexARC<T> {
|
pub fn MutexARC<T: Owned>(user_data: T) -> MutexARC<T> {
|
||||||
|
@ -267,14 +267,14 @@ fn PoisonOnFail(failed: &r/mut bool) -> PoisonOnFail {
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
struct RWARCInner<T: Const Owned> { lock: RWlock, failed: bool, data: T }
|
struct RWARCInner<T> { lock: RWlock, failed: bool, data: T }
|
||||||
/**
|
/**
|
||||||
* A dual-mode ARC protected by a reader-writer lock. The data can be accessed
|
* A dual-mode ARC protected by a reader-writer lock. The data can be accessed
|
||||||
* mutably or immutably, and immutably-accessing tasks may run concurrently.
|
* mutably or immutably, and immutably-accessing tasks may run concurrently.
|
||||||
*
|
*
|
||||||
* Unlike mutex_arcs, rw_arcs are safe, because they cannot be nested.
|
* Unlike mutex_arcs, rw_arcs are safe, because they cannot be nested.
|
||||||
*/
|
*/
|
||||||
struct RWARC<T: Const Owned> {
|
struct RWARC<T> {
|
||||||
x: SharedMutableState<RWARCInner<T>>,
|
x: SharedMutableState<RWARCInner<T>>,
|
||||||
mut cant_nest: ()
|
mut cant_nest: ()
|
||||||
}
|
}
|
||||||
|
@ -426,10 +426,10 @@ fn borrow_rwlock<T: Const Owned>(state: &r/mut RWARCInner<T>) -> &r/RWlock {
|
||||||
// FIXME (#3154) ice with struct/&<T> prevents these from being structs.
|
// FIXME (#3154) ice with struct/&<T> prevents these from being structs.
|
||||||
|
|
||||||
/// The "write permission" token used for RWARC.write_downgrade().
|
/// The "write permission" token used for RWARC.write_downgrade().
|
||||||
pub enum RWWriteMode<T: Const Owned> =
|
pub enum RWWriteMode<T> =
|
||||||
(&mut T, sync::RWlockWriteMode, PoisonOnFail);
|
(&mut T, sync::RWlockWriteMode, PoisonOnFail);
|
||||||
/// The "read permission" token used for RWARC.write_downgrade().
|
/// The "read permission" token used for RWARC.write_downgrade().
|
||||||
pub enum RWReadMode<T:Const Owned> = (&T, sync::RWlockReadMode);
|
pub enum RWReadMode<T> = (&T, sync::RWlockReadMode);
|
||||||
|
|
||||||
impl<T: Const Owned> &RWWriteMode<T> {
|
impl<T: Const Owned> &RWWriteMode<T> {
|
||||||
/// Access the pre-downgrade RWARC in write mode.
|
/// Access the pre-downgrade RWARC in write mode.
|
||||||
|
|
|
@ -23,7 +23,14 @@ use core::pipes;
|
||||||
use core::prelude::*;
|
use core::prelude::*;
|
||||||
|
|
||||||
/// An extension of `pipes::stream` that allows both sending and receiving.
|
/// An extension of `pipes::stream` that allows both sending and receiving.
|
||||||
pub struct DuplexStream<T: Owned, U: Owned> {
|
#[cfg(stage0)]
|
||||||
|
pub struct DuplexStream<T:Owned, U:Owned> {
|
||||||
|
priv chan: Chan<T>,
|
||||||
|
priv port: Port<U>,
|
||||||
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
pub struct DuplexStream<T, U> {
|
||||||
priv chan: Chan<T>,
|
priv chan: Chan<T>,
|
||||||
priv port: Port<U>,
|
priv port: Port<U>,
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ and an `Unflattener` that converts the bytes to a value.
|
||||||
|
|
||||||
Create using the constructors in the `serial` and `pod` modules.
|
Create using the constructors in the `serial` and `pod` modules.
|
||||||
*/
|
*/
|
||||||
pub struct FlatPort<T, U: Unflattener<T>, P: BytePort> {
|
pub struct FlatPort<T, U, P> {
|
||||||
unflattener: U,
|
unflattener: U,
|
||||||
byte_port: P
|
byte_port: P
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ byte vectors, and a `ByteChan` that transmits the bytes.
|
||||||
|
|
||||||
Create using the constructors in the `serial` and `pod` modules.
|
Create using the constructors in the `serial` and `pod` modules.
|
||||||
*/
|
*/
|
||||||
pub struct FlatChan<T, F: Flattener<T>, C: ByteChan> {
|
pub struct FlatChan<T, F, C> {
|
||||||
flattener: F,
|
flattener: F,
|
||||||
byte_chan: C
|
byte_chan: C
|
||||||
}
|
}
|
||||||
|
@ -181,14 +181,12 @@ pub mod pod {
|
||||||
use core::pipes;
|
use core::pipes;
|
||||||
use core::prelude::*;
|
use core::prelude::*;
|
||||||
|
|
||||||
pub type ReaderPort<T: Copy Owned, R> =
|
pub type ReaderPort<T, R> =
|
||||||
FlatPort<T, PodUnflattener<T>, ReaderBytePort<R>>;
|
FlatPort<T, PodUnflattener<T>, ReaderBytePort<R>>;
|
||||||
pub type WriterChan<T: Copy Owned, W> =
|
pub type WriterChan<T, W> =
|
||||||
FlatChan<T, PodFlattener<T>, WriterByteChan<W>>;
|
FlatChan<T, PodFlattener<T>, WriterByteChan<W>>;
|
||||||
pub type PipePort<T: Copy Owned> =
|
pub type PipePort<T> = FlatPort<T, PodUnflattener<T>, PipeBytePort>;
|
||||||
FlatPort<T, PodUnflattener<T>, PipeBytePort>;
|
pub type PipeChan<T> = FlatChan<T, PodFlattener<T>, PipeByteChan>;
|
||||||
pub type PipeChan<T: Copy Owned> =
|
|
||||||
FlatChan<T, PodFlattener<T>, PipeByteChan>;
|
|
||||||
|
|
||||||
/// Create a `FlatPort` from a `Reader`
|
/// Create a `FlatPort` from a `Reader`
|
||||||
pub fn reader_port<T: Copy Owned, R: Reader>(
|
pub fn reader_port<T: Copy Owned, R: Reader>(
|
||||||
|
@ -352,11 +350,11 @@ pub mod flatteners {
|
||||||
|
|
||||||
|
|
||||||
// FIXME #4074: Copy + Owned != POD
|
// FIXME #4074: Copy + Owned != POD
|
||||||
pub struct PodUnflattener<T: Copy Owned> {
|
pub struct PodUnflattener<T> {
|
||||||
bogus: ()
|
bogus: ()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct PodFlattener<T: Copy Owned> {
|
pub struct PodFlattener<T> {
|
||||||
bogus: ()
|
bogus: ()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,14 +396,13 @@ pub mod flatteners {
|
||||||
|
|
||||||
pub type DeserializeBuffer<T> = ~fn(buf: &[u8]) -> T;
|
pub type DeserializeBuffer<T> = ~fn(buf: &[u8]) -> T;
|
||||||
|
|
||||||
pub struct DeserializingUnflattener<D: Decoder,
|
pub struct DeserializingUnflattener<D, T> {
|
||||||
T: Decodable<D>> {
|
|
||||||
deserialize_buffer: DeserializeBuffer<T>
|
deserialize_buffer: DeserializeBuffer<T>
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type SerializeValue<T> = ~fn(val: &T) -> ~[u8];
|
pub type SerializeValue<T> = ~fn(val: &T) -> ~[u8];
|
||||||
|
|
||||||
pub struct SerializingFlattener<S: Encoder, T: Encodable<S>> {
|
pub struct SerializingFlattener<S, T> {
|
||||||
serialize_value: SerializeValue<T>
|
serialize_value: SerializeValue<T>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -518,11 +515,11 @@ pub mod bytepipes {
|
||||||
use core::pipes;
|
use core::pipes;
|
||||||
use core::prelude::*;
|
use core::prelude::*;
|
||||||
|
|
||||||
pub struct ReaderBytePort<R: Reader> {
|
pub struct ReaderBytePort<R> {
|
||||||
reader: R
|
reader: R
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct WriterByteChan<W: Writer> {
|
pub struct WriterByteChan<W> {
|
||||||
writer: W
|
writer: W
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -767,9 +764,9 @@ mod test {
|
||||||
test_some_tcp_stream(reader_port, writer_chan, 9667);
|
test_some_tcp_stream(reader_port, writer_chan, 9667);
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReaderPortFactory<U: Unflattener<int>> =
|
type ReaderPortFactory<U> =
|
||||||
~fn(TcpSocketBuf) -> FlatPort<int, U, ReaderBytePort<TcpSocketBuf>>;
|
~fn(TcpSocketBuf) -> FlatPort<int, U, ReaderBytePort<TcpSocketBuf>>;
|
||||||
type WriterChanFactory<F: Flattener<int>> =
|
type WriterChanFactory<F> =
|
||||||
~fn(TcpSocketBuf) -> FlatChan<int, F, WriterByteChan<TcpSocketBuf>>;
|
~fn(TcpSocketBuf) -> FlatChan<int, F, WriterByteChan<TcpSocketBuf>>;
|
||||||
|
|
||||||
fn test_some_tcp_stream<U: Unflattener<int>, F: Flattener<int>>(
|
fn test_some_tcp_stream<U: Unflattener<int>, F: Flattener<int>>(
|
||||||
|
@ -893,7 +890,7 @@ mod test {
|
||||||
use core::sys;
|
use core::sys;
|
||||||
use core::task;
|
use core::task;
|
||||||
|
|
||||||
type PortLoader<P: BytePort> =
|
type PortLoader<P> =
|
||||||
~fn(~[u8]) -> FlatPort<int, PodUnflattener<int>, P>;
|
~fn(~[u8]) -> FlatPort<int, PodUnflattener<int>, P>;
|
||||||
|
|
||||||
fn reader_port_loader(bytes: ~[u8]
|
fn reader_port_loader(bytes: ~[u8]
|
||||||
|
|
|
@ -24,9 +24,9 @@ use core::uint;
|
||||||
use core::vec;
|
use core::vec;
|
||||||
|
|
||||||
/// A convenience type to treat a hashmap as a set
|
/// A convenience type to treat a hashmap as a set
|
||||||
pub type Set<K:Eq IterBytes Hash> = HashMap<K, ()>;
|
pub type Set<K> = HashMap<K, ()>;
|
||||||
|
|
||||||
pub type HashMap<K:Eq IterBytes Hash, V> = chained::T<K, V>;
|
pub type HashMap<K, V> = chained::T<K, V>;
|
||||||
|
|
||||||
pub trait StdMap<K:Eq IterBytes Hash Copy, V: Copy> {
|
pub trait StdMap<K:Eq IterBytes Hash Copy, V: Copy> {
|
||||||
/// Return the number of elements in the map
|
/// Return the number of elements in the map
|
||||||
|
@ -142,12 +142,12 @@ pub mod chained {
|
||||||
mut next: Option<@Entry<K, V>>
|
mut next: Option<@Entry<K, V>>
|
||||||
}
|
}
|
||||||
|
|
||||||
struct HashMap_<K:Eq IterBytes Hash, V> {
|
struct HashMap_<K, V> {
|
||||||
mut count: uint,
|
mut count: uint,
|
||||||
mut chains: ~[mut Option<@Entry<K,V>>]
|
mut chains: ~[mut Option<@Entry<K,V>>]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type T<K:Eq IterBytes Hash, V> = @HashMap_<K, V>;
|
pub type T<K, V> = @HashMap_<K, V>;
|
||||||
|
|
||||||
enum SearchResult<K, V> {
|
enum SearchResult<K, V> {
|
||||||
NotFound,
|
NotFound,
|
||||||
|
|
|
@ -22,7 +22,7 @@ extern "C" mod rusti {
|
||||||
fn init<T>() -> T;
|
fn init<T>() -> T;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct PriorityQueue <T: Ord>{
|
pub struct PriorityQueue<T> {
|
||||||
priv data: ~[T],
|
priv data: ~[T],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ struct SemInner<Q> {
|
||||||
blocked: Q
|
blocked: Q
|
||||||
}
|
}
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
enum Sem<Q: Owned> = Exclusive<SemInner<Q>>;
|
enum Sem<Q> = Exclusive<SemInner<Q>>;
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
fn new_sem<Q: Owned>(count: int, q: Q) -> Sem<Q> {
|
fn new_sem<Q: Owned>(count: int, q: Q) -> Sem<Q> {
|
||||||
|
@ -167,7 +167,7 @@ impl &Sem<~[mut Waitqueue]> {
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
type SemRelease = SemReleaseGeneric<()>;
|
type SemRelease = SemReleaseGeneric<()>;
|
||||||
type SemAndSignalRelease = SemReleaseGeneric<~[mut Waitqueue]>;
|
type SemAndSignalRelease = SemReleaseGeneric<~[mut Waitqueue]>;
|
||||||
struct SemReleaseGeneric<Q: Owned> { sem: &Sem<Q> }
|
struct SemReleaseGeneric<Q> { sem: &Sem<Q> }
|
||||||
|
|
||||||
impl<Q: Owned> SemReleaseGeneric<Q> : Drop {
|
impl<Q: Owned> SemReleaseGeneric<Q> : Drop {
|
||||||
fn finalize(&self) {
|
fn finalize(&self) {
|
||||||
|
|
|
@ -35,7 +35,7 @@ use core::prelude::*;
|
||||||
// * symmetric difference: ^
|
// * symmetric difference: ^
|
||||||
// These would be convenient since the methods work like `each`
|
// These would be convenient since the methods work like `each`
|
||||||
|
|
||||||
pub struct TreeMap<K: Ord, V> {
|
pub struct TreeMap<K, V> {
|
||||||
priv root: Option<~TreeNode<K, V>>,
|
priv root: Option<~TreeNode<K, V>>,
|
||||||
priv length: uint
|
priv length: uint
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,7 @@ impl <K: Ord, V> TreeMap<K, V> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Lazy forward iterator over a map
|
/// Lazy forward iterator over a map
|
||||||
pub struct TreeMapIterator<K: Ord, V> {
|
pub struct TreeMapIterator<K, V> {
|
||||||
priv stack: ~[&~TreeNode<K, V>],
|
priv stack: ~[&~TreeNode<K, V>],
|
||||||
priv node: &Option<~TreeNode<K, V>>,
|
priv node: &Option<~TreeNode<K, V>>,
|
||||||
priv current: Option<&~TreeNode<K, V>>
|
priv current: Option<&~TreeNode<K, V>>
|
||||||
|
@ -240,7 +240,7 @@ impl <K: Ord, V> TreeMapIterator<K, V> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TreeSet<T: Ord> {
|
pub struct TreeSet<T> {
|
||||||
priv map: TreeMap<T, ()>
|
priv map: TreeMap<T, ()>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -518,7 +518,7 @@ impl <T: Ord> TreeSet<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Lazy forward iterator over a set
|
/// Lazy forward iterator over a set
|
||||||
pub struct TreeSetIterator<T: Ord> {
|
pub struct TreeSetIterator<T> {
|
||||||
priv iter: TreeMapIterator<T, ()>
|
priv iter: TreeMapIterator<T, ()>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -540,7 +540,7 @@ impl <T: Ord> TreeSetIterator<T> {
|
||||||
|
|
||||||
// Nodes keep track of their level in the tree, starting at 1 in the
|
// Nodes keep track of their level in the tree, starting at 1 in the
|
||||||
// leaves and with a red child sharing the level of the parent.
|
// leaves and with a red child sharing the level of the parent.
|
||||||
struct TreeNode<K: Ord, V> {
|
struct TreeNode<K, V> {
|
||||||
key: K,
|
key: K,
|
||||||
value: V,
|
value: V,
|
||||||
left: Option<~TreeNode<K, V>>,
|
left: Option<~TreeNode<K, V>>,
|
||||||
|
|
|
@ -235,10 +235,17 @@ struct Exec {
|
||||||
discovered_outputs: WorkMap
|
discovered_outputs: WorkMap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(stage0)]
|
||||||
struct Work<T:Owned> {
|
struct Work<T:Owned> {
|
||||||
prep: @Mut<Prep>,
|
prep: @Mut<Prep>,
|
||||||
res: Option<Either<T,PortOne<(Exec,T)>>>
|
res: Option<Either<T,PortOne<(Exec,T)>>>
|
||||||
}
|
}
|
||||||
|
#[cfg(stage1)]
|
||||||
|
#[cfg(stage2)]
|
||||||
|
struct Work<T> {
|
||||||
|
prep: @Mut<Prep>,
|
||||||
|
res: Option<Either<T,PortOne<(Exec,T)>>>
|
||||||
|
}
|
||||||
|
|
||||||
fn json_encode<T:Encodable<json::Encoder>>(t: &T) -> ~str {
|
fn json_encode<T:Encodable<json::Encoder>>(t: &T) -> ~str {
|
||||||
do io::with_str_writer |wr| {
|
do io::with_str_writer |wr| {
|
||||||
|
|
|
@ -110,6 +110,7 @@ pub trait ext_ctxt_ast_builder {
|
||||||
fn ty_option(ty: @ast::Ty) -> @ast::Ty;
|
fn ty_option(ty: @ast::Ty) -> @ast::Ty;
|
||||||
fn ty_infer() -> @ast::Ty;
|
fn ty_infer() -> @ast::Ty;
|
||||||
fn ty_nil_ast_builder() -> @ast::Ty;
|
fn ty_nil_ast_builder() -> @ast::Ty;
|
||||||
|
fn strip_bounds(bounds: &[ast::ty_param]) -> ~[ast::ty_param];
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ext_ctxt: ext_ctxt_ast_builder {
|
impl ext_ctxt: ext_ctxt_ast_builder {
|
||||||
|
@ -370,6 +371,12 @@ impl ext_ctxt: ext_ctxt_ast_builder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn strip_bounds(bounds: &[ast::ty_param]) -> ~[ast::ty_param] {
|
||||||
|
do bounds.map |ty_param| {
|
||||||
|
ast::ty_param { bounds: @~[], ..copy *ty_param }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn item_ty_poly(name: ident,
|
fn item_ty_poly(name: ident,
|
||||||
span: span,
|
span: span,
|
||||||
ty: @ast::Ty,
|
ty: @ast::Ty,
|
||||||
|
|
|
@ -248,7 +248,7 @@ impl state: to_type_decls {
|
||||||
ast::enum_def(enum_def_ {
|
ast::enum_def(enum_def_ {
|
||||||
variants: items_msg,
|
variants: items_msg,
|
||||||
common: None }),
|
common: None }),
|
||||||
self.ty_params
|
cx.strip_bounds(self.ty_params)
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -281,7 +281,7 @@ impl state: to_type_decls {
|
||||||
self.data_name()],
|
self.data_name()],
|
||||||
dummy_sp())
|
dummy_sp())
|
||||||
.add_tys(cx.ty_vars_global(self.ty_params))))),
|
.add_tys(cx.ty_vars_global(self.ty_params))))),
|
||||||
self.ty_params));
|
cx.strip_bounds(self.ty_params)));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
items.push(
|
items.push(
|
||||||
|
@ -299,7 +299,7 @@ impl state: to_type_decls {
|
||||||
dummy_sp())
|
dummy_sp())
|
||||||
.add_tys(cx.ty_vars_global(self.ty_params))),
|
.add_tys(cx.ty_vars_global(self.ty_params))),
|
||||||
self.proto.buffer_ty_path(cx)])),
|
self.proto.buffer_ty_path(cx)])),
|
||||||
self.ty_params));
|
cx.strip_bounds(self.ty_params)));
|
||||||
};
|
};
|
||||||
items
|
items
|
||||||
}
|
}
|
||||||
|
@ -417,7 +417,7 @@ impl protocol: gen_init {
|
||||||
cx.ident_of(~"__Buffer"),
|
cx.ident_of(~"__Buffer"),
|
||||||
dummy_sp(),
|
dummy_sp(),
|
||||||
cx.ty_rec(fields),
|
cx.ty_rec(fields),
|
||||||
params)
|
cx.strip_bounds(params))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compile(cx: ext_ctxt) -> @ast::item {
|
fn compile(cx: ext_ctxt) -> @ast::item {
|
||||||
|
|
|
@ -33,6 +33,7 @@ use core::str;
|
||||||
use core::to_bytes;
|
use core::to_bytes;
|
||||||
|
|
||||||
/// The specific types of unsupported syntax
|
/// The specific types of unsupported syntax
|
||||||
|
#[deriving_eq]
|
||||||
pub enum ObsoleteSyntax {
|
pub enum ObsoleteSyntax {
|
||||||
ObsoleteLowerCaseKindBounds,
|
ObsoleteLowerCaseKindBounds,
|
||||||
ObsoleteLet,
|
ObsoleteLet,
|
||||||
|
@ -45,16 +46,8 @@ pub enum ObsoleteSyntax {
|
||||||
ObsoleteModeInFnType,
|
ObsoleteModeInFnType,
|
||||||
ObsoleteMoveInit,
|
ObsoleteMoveInit,
|
||||||
ObsoleteBinaryMove,
|
ObsoleteBinaryMove,
|
||||||
ObsoleteUnsafeBlock
|
ObsoleteUnsafeBlock,
|
||||||
}
|
ObsoleteUnenforcedBound
|
||||||
|
|
||||||
impl ObsoleteSyntax : cmp::Eq {
|
|
||||||
pure fn eq(&self, other: &ObsoleteSyntax) -> bool {
|
|
||||||
(*self) as uint == (*other) as uint
|
|
||||||
}
|
|
||||||
pure fn ne(&self, other: &ObsoleteSyntax) -> bool {
|
|
||||||
!(*self).eq(other)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ObsoleteSyntax: to_bytes::IterBytes {
|
impl ObsoleteSyntax: to_bytes::IterBytes {
|
||||||
|
@ -123,6 +116,11 @@ impl Parser {
|
||||||
ObsoleteUnsafeBlock => (
|
ObsoleteUnsafeBlock => (
|
||||||
"non-standalone unsafe block",
|
"non-standalone unsafe block",
|
||||||
"use an inner `unsafe { ... }` block instead"
|
"use an inner `unsafe { ... }` block instead"
|
||||||
|
),
|
||||||
|
ObsoleteUnenforcedBound => (
|
||||||
|
"unenforced type parameter bound",
|
||||||
|
"use trait bounds on the functions that take the type as \
|
||||||
|
arguments, not on the types themselves"
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ use core::dvec::DVec;
|
||||||
use std::map::HashMap;
|
use std::map::HashMap;
|
||||||
use std::map;
|
use std::map;
|
||||||
|
|
||||||
type hash_interner<T: Const> =
|
type hash_interner<T> =
|
||||||
{map: HashMap<T, uint>,
|
{map: HashMap<T, uint>,
|
||||||
vect: DVec<T>};
|
vect: DVec<T>};
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ extern mod std;
|
||||||
|
|
||||||
export context;
|
export context;
|
||||||
|
|
||||||
struct arc_destruct<T:Const> {
|
struct arc_destruct<T> {
|
||||||
_data: int,
|
_data: int,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ use core::libc::size_t;
|
||||||
* transmitted. If a port value is copied, both copies refer to the same
|
* transmitted. If a port value is copied, both copies refer to the same
|
||||||
* port. Ports may be associated with multiple `chan`s.
|
* port. Ports may be associated with multiple `chan`s.
|
||||||
*/
|
*/
|
||||||
pub enum port<T: Owned> {
|
pub enum port<T> {
|
||||||
port_t(@port_ptr<T>)
|
port_t(@port_ptr<T>)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ pub fn port<T: Owned>() -> port<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct port_ptr<T:Owned> {
|
struct port_ptr<T> {
|
||||||
po: *rust_port,
|
po: *rust_port,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -122,15 +122,15 @@ mod map_reduce {
|
||||||
use std::map::HashMap;
|
use std::map::HashMap;
|
||||||
use std::map;
|
use std::map;
|
||||||
|
|
||||||
pub type putter<K: Owned, V: Owned> = fn(&K, V);
|
pub type putter<K, V> = fn(&K, V);
|
||||||
|
|
||||||
pub type mapper<K1: Owned, K2: Owned, V: Owned> = fn~(K1, putter<K2, V>);
|
pub type mapper<K1, K2, V> = fn~(K1, putter<K2, V>);
|
||||||
|
|
||||||
pub type getter<V: Owned> = fn() -> Option<V>;
|
pub type getter<V> = fn() -> Option<V>;
|
||||||
|
|
||||||
pub type reducer<K: Copy Owned, V: Copy Owned> = fn~(&K, getter<V>);
|
pub type reducer<K, V> = fn~(&K, getter<V>);
|
||||||
|
|
||||||
enum ctrl_proto<K: Copy Owned, V: Copy Owned> {
|
enum ctrl_proto<K, V> {
|
||||||
find_reducer(K, Chan<Chan<::map_reduce::reduce_proto<V>>>),
|
find_reducer(K, Chan<Chan<::map_reduce::reduce_proto<V>>>),
|
||||||
mapper_done
|
mapper_done
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ mod map_reduce {
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
pub enum reduce_proto<V: Copy Owned> {
|
pub enum reduce_proto<V> {
|
||||||
emit_val(V),
|
emit_val(V),
|
||||||
done,
|
done,
|
||||||
addref,
|
addref,
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
pub struct send_packet<T: Copy> {
|
pub struct send_packet<T> {
|
||||||
p: T
|
p: T
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ fn test00_start(ch: chan_t<int>, message: int) { send(ch, message); }
|
||||||
type task_id = int;
|
type task_id = int;
|
||||||
type port_id = int;
|
type port_id = int;
|
||||||
|
|
||||||
enum chan_t<T: Owned> = {task: task_id, port: port_id};
|
enum chan_t<T> = {task: task_id, port: port_id};
|
||||||
|
|
||||||
fn send<T: Owned>(ch: chan_t<T>, data: T) { fail; }
|
fn send<T: Owned>(ch: chan_t<T>, data: T) { fail; }
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
extern mod std;
|
extern mod std;
|
||||||
use std::arc;
|
use std::arc;
|
||||||
|
|
||||||
enum e<T: Const Owned> { e(arc::ARC<T>) }
|
enum e<T> { e(arc::ARC<T>) }
|
||||||
|
|
||||||
fn foo() -> e<int> {fail;}
|
fn foo() -> e<int> {fail;}
|
||||||
|
|
||||||
|
|
|
@ -135,11 +135,6 @@ struct Spanned<T> {
|
||||||
node: T,
|
node: T,
|
||||||
}
|
}
|
||||||
|
|
||||||
enum AnEnum {
|
|
||||||
AVariant,
|
|
||||||
AnotherVariant
|
|
||||||
}
|
|
||||||
|
|
||||||
#[auto_encode]
|
#[auto_encode]
|
||||||
#[auto_decode]
|
#[auto_decode]
|
||||||
struct SomeStruct { v: ~[uint] }
|
struct SomeStruct { v: ~[uint] }
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct Box<T: Copy> {c: @T}
|
struct Box<T> {c: @T}
|
||||||
|
|
||||||
fn unbox<T: Copy>(b: Box<T>) -> T { return *b.c; }
|
fn unbox<T: Copy>(b: Box<T>) -> T { return *b.c; }
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ impl cat_type : cmp::Eq {
|
||||||
// for any int value that's less than the meows field
|
// for any int value that's less than the meows field
|
||||||
|
|
||||||
// ok: T should be in scope when resolving the trait ref for map
|
// ok: T should be in scope when resolving the trait ref for map
|
||||||
struct cat<T: Copy> {
|
struct cat<T> {
|
||||||
// Yes, you can have negative meows
|
// Yes, you can have negative meows
|
||||||
priv mut meows : int,
|
priv mut meows : int,
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct Recbox<T: Copy> {x: @T}
|
struct Recbox<T> {x: @T}
|
||||||
|
|
||||||
fn reclift<T: Copy>(t: T) -> Recbox<T> { return Recbox {x: @t}; }
|
fn reclift<T: Copy>(t: T) -> Recbox<T> { return Recbox {x: @t}; }
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
struct Recbox<T: Copy> {x: ~T}
|
struct Recbox<T> {x: ~T}
|
||||||
|
|
||||||
fn reclift<T: Copy>(t: T) -> Recbox<T> { return Recbox {x: ~t}; }
|
fn reclift<T: Copy>(t: T) -> Recbox<T> { return Recbox {x: ~t}; }
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
trait clam<A: Copy> {
|
trait clam<A: Copy> {
|
||||||
fn chowder(y: A);
|
fn chowder(y: A);
|
||||||
}
|
}
|
||||||
struct foo<A: Copy> {
|
struct foo<A> {
|
||||||
x: A,
|
x: A,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
trait clam<A: Copy> { }
|
trait clam<A: Copy> { }
|
||||||
struct foo<A: Copy> {
|
struct foo<A> {
|
||||||
x: A,
|
x: A,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
struct c1<T: Copy> {
|
struct c1<T> {
|
||||||
x: T,
|
x: T,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
struct c1<T: Copy> {
|
struct c1<T> {
|
||||||
x: T,
|
x: T,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ pub mod pipes {
|
||||||
pure fn ne(&self, other: &state) -> bool { !(*self).eq(other) }
|
pure fn ne(&self, other: &state) -> bool { !(*self).eq(other) }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type packet<T: Owned> = {
|
pub type packet<T> = {
|
||||||
mut state: state,
|
mut state: state,
|
||||||
mut blocked_task: Option<task::Task>,
|
mut blocked_task: Option<task::Task>,
|
||||||
mut payload: Option<T>
|
mut payload: Option<T>
|
||||||
|
@ -157,7 +157,7 @@ pub mod pipes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct send_packet<T: Owned> {
|
pub struct send_packet<T> {
|
||||||
mut p: Option<*packet<T>>,
|
mut p: Option<*packet<T>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ pub mod pipes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct recv_packet<T: Owned> {
|
pub struct recv_packet<T> {
|
||||||
mut p: Option<*packet<T>>,
|
mut p: Option<*packet<T>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ pure fn Matrix4<T:Copy Num>(m11: T, m12: T, m13: T, m14: T,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Matrix4<T:Copy Num> {
|
struct Matrix4<T> {
|
||||||
m11: T, m12: T, m13: T, m14: T,
|
m11: T, m12: T, m13: T, m14: T,
|
||||||
m21: T, m22: T, m23: T, m24: T,
|
m21: T, m22: T, m23: T, m24: T,
|
||||||
m31: T, m32: T, m33: T, m34: T,
|
m31: T, m32: T, m33: T, m34: T,
|
||||||
|
|
|
@ -29,7 +29,7 @@ fn align(size: uint, align: uint) -> uint {
|
||||||
((size + align) - 1u) & !(align - 1u)
|
((size + align) - 1u) & !(align - 1u)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ptr_visit_adaptor<V: TyVisitor movable_ptr> = Inner<V>;
|
enum ptr_visit_adaptor<V> = Inner<V>;
|
||||||
|
|
||||||
impl<V: TyVisitor movable_ptr> ptr_visit_adaptor<V> {
|
impl<V: TyVisitor movable_ptr> ptr_visit_adaptor<V> {
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
struct Arg<T> {val: T, fin: extern fn(T)}
|
struct Arg<T> {val: T, fin: extern fn(T)}
|
||||||
|
|
||||||
struct finish<T: Copy> {
|
struct finish<T> {
|
||||||
arg: Arg<T>
|
arg: Arg<T>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
// tests that ctrl's type gets inferred properly
|
// tests that ctrl's type gets inferred properly
|
||||||
type command<K: Owned, V: Owned> = {key: K, val: V};
|
type command<K, V> = {key: K, val: V};
|
||||||
|
|
||||||
fn cache_server<K: Owned, V: Owned>(c: oldcomm::Chan<oldcomm::Chan<command<K, V>>>) {
|
fn cache_server<K: Owned, V: Owned>(c: oldcomm::Chan<oldcomm::Chan<command<K, V>>>) {
|
||||||
let ctrl = oldcomm::Port();
|
let ctrl = oldcomm::Port();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue