diff options
| author | bors <bors@rust-lang.org> | 2013-03-28 19:06:48 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-03-28 19:06:48 -0700 |
| commit | 7a6cd2b21e240d3b075b30d598e661b038fe6fbe (patch) | |
| tree | 3542b2ed3564cb795e567c74857bfaa696525e11 /src/libstd | |
| parent | f81459211d0cf2738ed02f5c7fe24f56c8032960 (diff) | |
| parent | aa779c1240afd0f5e46897b6ddfa55126471bf19 (diff) | |
| download | rust-7a6cd2b21e240d3b075b30d598e661b038fe6fbe.tar.gz rust-7a6cd2b21e240d3b075b30d598e661b038fe6fbe.zip | |
auto merge of #5608 : erickt/rust/incoming, r=catamorphism
@nikomatsakis pointed out that `fn read_option<T>(&self, f: &fn() -> T) -> Option<T>` should have this syntax so it can work with custom option types: `fn read_option<T>(&self, f: &fn(bool) -> T) -> T`. Also, this also includes some `#[inline(always)]` on the memory functions in `src/libcore/unstable/lang.rs` to reduce one level of indirection when allocating memory.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/ebml.rs | 12 | ||||
| -rw-r--r-- | src/libstd/json.rs | 6 | ||||
| -rw-r--r-- | src/libstd/serialize.rs | 10 |
3 files changed, 17 insertions, 11 deletions
diff --git a/src/libstd/ebml.rs b/src/libstd/ebml.rs index 5855add7975..331bede5b7a 100644 --- a/src/libstd/ebml.rs +++ b/src/libstd/ebml.rs @@ -411,13 +411,13 @@ pub mod reader { } #[cfg(stage0)] - fn read_option<T>(&self, f: &fn() -> T) -> Option<T> { + fn read_option<T>(&self, f: &fn(bool) -> T) -> T { debug!("read_option()"); do self.read_enum("Option") || { do self.read_enum_variant |idx| { match idx { - 0 => None, - 1 => Some(f()), + 0 => f(false), + 1 => f(true), _ => fail!(), } } @@ -427,13 +427,13 @@ pub mod reader { #[cfg(stage1)] #[cfg(stage2)] #[cfg(stage3)] - fn read_option<T>(&self, f: &fn() -> T) -> Option<T> { + fn read_option<T>(&self, f: &fn(bool) -> T) -> T { debug!("read_option()"); do self.read_enum("Option") || { do self.read_enum_variant(["None", "Some"]) |idx| { match idx { - 0 => None, - 1 => Some(f()), + 0 => f(false), + 1 => f(true), _ => fail!(), } } diff --git a/src/libstd/json.rs b/src/libstd/json.rs index c48b210dca2..4b0e313330d 100644 --- a/src/libstd/json.rs +++ b/src/libstd/json.rs @@ -980,10 +980,10 @@ impl<'self> serialize::Decoder for Decoder<'self> { } } - fn read_option<T>(&self, f: &fn() -> T) -> Option<T> { + fn read_option<T>(&self, f: &fn(bool) -> T) -> T { match *self.peek() { - Null => { self.pop(); None } - _ => Some(f()), + Null => { self.pop(); f(false) } + _ => f(true), } } } diff --git a/src/libstd/serialize.rs b/src/libstd/serialize.rs index 02f4a934874..3c9ad0d77d1 100644 --- a/src/libstd/serialize.rs +++ b/src/libstd/serialize.rs @@ -118,7 +118,7 @@ pub trait Decoder { fn read_tup_elt<T>(&self, idx: uint, f: &fn() -> T) -> T; // Specialized types: - fn read_option<T>(&self, f: &fn() -> T) -> Option<T>; + fn read_option<T>(&self, f: &fn(bool) -> T) -> T; } pub trait Encodable<S:Encoder> { @@ -395,7 +395,13 @@ impl<S:Encoder,T:Encodable<S>> Encodable<S> for Option<T> { impl<D:Decoder,T:Decodable<D>> Decodable<D> for Option<T> { fn decode(d: &D) -> Option<T> { - d.read_option(|| Decodable::decode(d)) + do d.read_option |b| { + if b { + Some(Decodable::decode(d)) + } else { + None + } + } } } |
