about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-06-18 14:23:37 -0700
committerBrian Anderson <banderson@mozilla.com>2013-06-18 16:27:48 -0700
commit29ad8e15a2b7e2024941d74ea4ce261cb501ded9 (patch)
tree24ff9de3f6473eba4f9bc536f572b4ea9d678027 /src
parent5b2dc520340103491088616ba4f58095948f5821 (diff)
downloadrust-29ad8e15a2b7e2024941d74ea4ce261cb501ded9.tar.gz
rust-29ad8e15a2b7e2024941d74ea4ce261cb501ded9.zip
std::rt: Improve the rtabort! macro
Diffstat (limited to 'src')
-rw-r--r--src/libstd/macros.rs19
-rw-r--r--src/libstd/rt/global_heap.rs3
-rw-r--r--src/libstd/rt/util.rs65
3 files changed, 72 insertions, 15 deletions
diff --git a/src/libstd/macros.rs b/src/libstd/macros.rs
index fed3ff461c4..7748c43efcd 100644
--- a/src/libstd/macros.rs
+++ b/src/libstd/macros.rs
@@ -10,18 +10,16 @@
 
 #[macro_escape];
 
+macro_rules! rterrln (
+    ($( $arg:expr),+) => ( {
+        ::rt::util::dumb_println(fmt!( $($arg),+ ));
+    } )
+)
+
 // Some basic logging
 macro_rules! rtdebug_ (
     ($( $arg:expr),+) => ( {
-        dumb_println(fmt!( $($arg),+ ));
-
-        fn dumb_println(s: &str) {
-            use io::WriterUtil;
-            let dbg = ::libc::STDERR_FILENO as ::io::fd_t;
-            dbg.write_str(s);
-            dbg.write_str("\n");
-        }
-
+        rterrln!( $($arg),+ )
     } )
 )
 
@@ -41,8 +39,7 @@ macro_rules! rtassert (
 
 macro_rules! rtabort(
     ($( $msg:expr),+) => ( {
-        rtdebug!($($msg),+);
-        ::rt::util::abort();
+        ::rt::util::abort(fmt!($($msg),+));
     } )
 )
 
diff --git a/src/libstd/rt/global_heap.rs b/src/libstd/rt/global_heap.rs
index b180cec9838..e89df2b1c93 100644
--- a/src/libstd/rt/global_heap.rs
+++ b/src/libstd/rt/global_heap.rs
@@ -82,8 +82,7 @@ pub fn cleanup() {
         let count_ptr = exchange_count_ptr();
         let allocations = atomic_load(&*count_ptr);
         if allocations != 0 {
-            rtabort!("exchange heap not empty on exit\
-                    %i dangling allocations", allocations);
+            rtabort!("exchange heap not empty on exit - %i dangling allocations", allocations);
         }
     }
 }
diff --git a/src/libstd/rt/util.rs b/src/libstd/rt/util.rs
index 6153170ecaf..904b2f8bbb9 100644
--- a/src/libstd/rt/util.rs
+++ b/src/libstd/rt/util.rs
@@ -8,7 +8,10 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+use container::Container;
+use iterator::IteratorUtil;
 use libc;
+use str::StrSlice;
 
 /// Get the number of cores available
 pub fn num_cpus() -> uint {
@@ -21,6 +24,64 @@ pub fn num_cpus() -> uint {
     }
 }
 
-pub fn abort() -> ! {
+pub fn dumb_println(s: &str) {
+    use io::WriterUtil;
+    let dbg = ::libc::STDERR_FILENO as ::io::fd_t;
+    dbg.write_str(s);
+    dbg.write_str("\n");
+}
+
+pub fn abort(msg: &str) -> ! {
+    let msg = if !msg.is_empty() { msg } else { "aborted" };
+    let hash = msg.iter().fold(0, |accum, val| accum + (val as uint) );
+    let quote = match hash % 10 {
+        0 => "
+It was from the artists and poets that the pertinent answers came, and I
+know that panic would have broken loose had they been able to compare notes.
+As it was, lacking their original letters, I half suspected the compiler of
+having asked leading questions, or of having edited the correspondence in
+corroboration of what he had latently resolved to see.",
+        1 => "
+There are not many persons who know what wonders are opened to them in the
+stories and visions of their youth; for when as children we listen and dream,
+we think but half-formed thoughts, and when as men we try to remember, we are
+dulled and prosaic with the poison of life. But some of us awake in the night
+with strange phantasms of enchanted hills and gardens, of fountains that sing
+in the sun, of golden cliffs overhanging murmuring seas, of plains that stretch
+down to sleeping cities of bronze and stone, and of shadowy companies of heroes
+that ride caparisoned white horses along the edges of thick forests; and then
+we know that we have looked back through the ivory gates into that world of
+wonder which was ours before we were wise and unhappy.",
+        2 => "
+Instead of the poems I had hoped for, there came only a shuddering blackness
+and ineffable loneliness; and I saw at last a fearful truth which no one had
+ever dared to breathe before — the unwhisperable secret of secrets — The fact
+that this city of stone and stridor is not a sentient perpetuation of Old New
+York as London is of Old London and Paris of Old Paris, but that it is in fact
+quite dead, its sprawling body imperfectly embalmed and infested with queer
+animate things which have nothing to do with it as it was in life.",
+        3 => "
+The ocean ate the last of the land and poured into the smoking gulf, thereby
+giving up all it had ever conquered. From the new-flooded lands it flowed
+again, uncovering death and decay; and from its ancient and immemorial bed it
+trickled loathsomely, uncovering nighted secrets of the years when Time was
+young and the gods unborn. Above the waves rose weedy remembered spires. The
+moon laid pale lilies of light on dead London, and Paris stood up from its damp
+grave to be sanctified with star-dust. Then rose spires and monoliths that were
+weedy but not remembered; terrible spires and monoliths of lands that men never
+knew were lands...",
+        4 => "
+There was a night when winds from unknown spaces whirled us irresistibly into
+limitless vacum beyond all thought and entity. Perceptions of the most
+maddeningly untransmissible sort thronged upon us; perceptions of infinity
+which at the time convulsed us with joy, yet which are now partly lost to my
+memory and partly incapable of presentation to others.",
+        _ => "You've met with a terrible fate, haven't you?"
+    };
+    rterrln!("%s", "");
+    rterrln!("%s", quote);
+    rterrln!("%s", "");
+    rterrln!("fatal runtime error: %s", msg);
+
     unsafe { libc::abort(); }
-}
\ No newline at end of file
+}