diff options
| author | Felix S. Klock II <pnkfelix@pnkfx.org> | 2017-06-13 21:57:49 +0200 |
|---|---|---|
| committer | Felix S. Klock II <pnkfelix@pnkfx.org> | 2017-06-15 23:48:31 +0200 |
| commit | 12d4d12fef4f9024ffcc8eb5fef11f1a21074cd7 (patch) | |
| tree | cbea264acfb3a0d9eba389f1476ec19eebad15bb /src | |
| parent | 57ab9e7e7c481427a8d59e16b932fbd1e5fe4c02 (diff) | |
| download | rust-12d4d12fef4f9024ffcc8eb5fef11f1a21074cd7.tar.gz rust-12d4d12fef4f9024ffcc8eb5fef11f1a21074cd7.zip | |
implement Error trait for error structs added in allocator API.
Diffstat (limited to 'src')
| -rw-r--r-- | src/liballoc/allocator.rs | 28 | ||||
| -rw-r--r-- | src/libstd/error.rs | 19 | ||||
| -rw-r--r-- | src/libstd/lib.rs | 1 |
3 files changed, 48 insertions, 0 deletions
diff --git a/src/liballoc/allocator.rs b/src/liballoc/allocator.rs index c308d99a72c..752acbd0b45 100644 --- a/src/liballoc/allocator.rs +++ b/src/liballoc/allocator.rs @@ -16,6 +16,7 @@ issue = "27700")] use core::cmp; +use core::fmt; use core::mem; use core::usize; use core::ptr::{self, Unique}; @@ -335,6 +336,19 @@ impl AllocErr { pub fn is_request_unsupported(&self) -> bool { if let AllocErr::Unsupported { .. } = *self { true } else { false } } + pub fn description(&self) -> &str { + match *self { + AllocErr::Exhausted { .. } => "allocator memory exhausted", + AllocErr::Unsupported { .. } => "unsupported allocator request", + } + } +} + +// (we need this for downstream impl of trait Error) +impl fmt::Display for AllocErr { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.description()) + } } /// The `CannotReallocInPlace` error is used when `grow_in_place` or @@ -343,6 +357,20 @@ impl AllocErr { #[derive(Clone, PartialEq, Eq, Debug)] pub struct CannotReallocInPlace; +impl CannotReallocInPlace { + pub fn description(&self) -> &str { + "cannot reallocate allocator's memory in place" + } +} + +// (we need this for downstream impl of trait Error) +impl fmt::Display for CannotReallocInPlace { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.description()) + } +} + +/// An implementation of `Allocator` can allocate, reallocate, and /// An implementation of `Alloc` can allocate, reallocate, and /// deallocate arbitrary blocks of data described via `Layout`. /// diff --git a/src/libstd/error.rs b/src/libstd/error.rs index f56e3a5d780..3d203429e7b 100644 --- a/src/libstd/error.rs +++ b/src/libstd/error.rs @@ -51,6 +51,7 @@ // coherence challenge (e.g., specialization, neg impls, etc) we can // reconsider what crate these items belong in. +use alloc::allocator; use any::TypeId; use cell; use char; @@ -221,6 +222,24 @@ impl Error for ! { fn description(&self) -> &str { *self } } +#[unstable(feature = "allocator_api", + reason = "the precise API and guarantees it provides may be tweaked.", + issue = "27700")] +impl Error for allocator::AllocErr { + fn description(&self) -> &str { + allocator::AllocErr::description(self) + } +} + +#[unstable(feature = "allocator_api", + reason = "the precise API and guarantees it provides may be tweaked.", + issue = "27700")] +impl Error for allocator::CannotReallocInPlace { + fn description(&self) -> &str { + allocator::CannotReallocInPlace::description(self) + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl Error for str::ParseBoolError { fn description(&self) -> &str { "failed to parse bool" } diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index f307fbb7c00..6938aefb522 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -245,6 +245,7 @@ // std is implemented with unstable features, many of which are internal // compiler details that will never be stable #![feature(alloc)] +#![feature(allocator_api)] #![feature(allow_internal_unstable)] #![feature(asm)] #![feature(associated_consts)] |
