about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorFelix S. Klock II <pnkfelix@pnkfx.org>2017-06-13 21:57:49 +0200
committerFelix S. Klock II <pnkfelix@pnkfx.org>2017-06-15 23:48:31 +0200
commit12d4d12fef4f9024ffcc8eb5fef11f1a21074cd7 (patch)
treecbea264acfb3a0d9eba389f1476ec19eebad15bb /src
parent57ab9e7e7c481427a8d59e16b932fbd1e5fe4c02 (diff)
downloadrust-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.rs28
-rw-r--r--src/libstd/error.rs19
-rw-r--r--src/libstd/lib.rs1
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)]