about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2012-12-14 11:52:11 -0800
committerGraydon Hoare <graydon@mozilla.com>2012-12-18 17:22:27 -0800
commit8e28f23c60daae7042e2c279741fa90f623acac0 (patch)
treee332141f56606dda327961d21ec06af302e4f242
parent263136d389ec72d8ab52d3ad8303a100fd1d4254 (diff)
downloadrust-8e28f23c60daae7042e2c279741fa90f623acac0.tar.gz
rust-8e28f23c60daae7042e2c279741fa90f623acac0.zip
core: add macro_rules! for "condition! { c: in -> out; }".
-rw-r--r--src/libcore/condition.rs41
-rw-r--r--src/libcore/core.rc1
-rw-r--r--src/librustc/front/intrinsic_inject.rs2
-rw-r--r--src/librusti/rusti.rc2
-rw-r--r--src/libsyntax/ext/expand.rs20
-rw-r--r--src/libsyntax/ext/source_util.rs10
-rw-r--r--src/test/bench/core-std.rs2
-rw-r--r--src/test/run-pass/html-literals.rs5
-rw-r--r--src/test/run-pass/syntax-extension-source-utils.rs10
9 files changed, 58 insertions, 35 deletions
diff --git a/src/libcore/condition.rs b/src/libcore/condition.rs
index 9ba095cf1bc..df8063772a6 100644
--- a/src/libcore/condition.rs
+++ b/src/libcore/condition.rs
@@ -10,16 +10,17 @@
 
 // helper for transmutation, shown below.
 type RustClosure = (int,int);
-struct Handler<T, U:Copy> {
+pub struct Handler<T, U> {
     handle: RustClosure,
     prev: Option<@Handler<T, U>>,
 }
 
-struct Condition<T, U:Copy> {
+pub struct Condition<T, U> {
+    name: &static/str,
     key: task::local_data::LocalDataKey<Handler<T,U>>
 }
 
-impl<T, U: Copy>  Condition<T,U> {
+impl<T, U>  Condition<T,U> {
 
     fn trap(&self, h: &self/fn(&T) ->U) -> Trap/&self<T,U> {
         unsafe {
@@ -32,7 +33,9 @@ impl<T, U: Copy>  Condition<T,U> {
 
     fn raise(t:&T) -> U  {
         do self.raise_default(t) {
-            fail ~"Unhandled condition";
+            fail fmt!("Unhandled condition: %s: %?",
+                      self.name,
+                      t);
         }
     }
 
@@ -65,13 +68,13 @@ impl<T, U: Copy>  Condition<T,U> {
 
 
 
-struct Trap<T, U:Copy> {
+struct Trap<T, U> {
     cond: &Condition<T,U>,
     handler: @Handler<T, U>
 }
 
-impl<T, U: Copy> Trap<T,U> {
-    fn in<V: Copy>(&self, inner: &self/fn() -> V) -> V {
+impl<T, U> Trap<T,U> {
+    fn in<V>(&self, inner: &self/fn() -> V) -> V {
         unsafe {
             let _g = Guard { cond: self.cond };
             debug!("Trap: pushing handler to TLS");
@@ -81,7 +84,7 @@ impl<T, U: Copy> Trap<T,U> {
     }
 }
 
-struct Guard<T, U:Copy> {
+struct Guard<T, U> {
     cond: &Condition<T,U>,
     drop {
         unsafe {
@@ -105,13 +108,13 @@ struct Guard<T, U:Copy> {
 #[cfg(test)]
 mod test {
 
-    fn sadness_key(_x: @Handler<int,int>) { }
-    const sadness_condition : Condition<int,int> =
-        Condition { key: sadness_key };
+    condition! {
+        sadness: int -> int;
+    }
 
     fn trouble(i: int) {
         debug!("trouble: raising conition");
-        let j = sadness_condition.raise(&i);
+        let j = sadness::cond.raise(&i);
         debug!("trouble: handler recovered with %d", j);
     }
 
@@ -119,7 +122,7 @@ mod test {
 
         let mut inner_trapped = false;
 
-        do sadness_condition.trap(|_j| {
+        do sadness::cond.trap(|_j| {
             debug!("nested_trap_test_inner: in handler");
             inner_trapped = true;
             0
@@ -136,7 +139,7 @@ mod test {
 
         let mut outer_trapped = false;
 
-        do sadness_condition.trap(|_j| {
+        do sadness::cond.trap(|_j| {
             debug!("nested_trap_test_outer: in handler");
             outer_trapped = true; 0
         }).in {
@@ -152,12 +155,12 @@ mod test {
 
         let mut inner_trapped = false;
 
-        do sadness_condition.trap(|_j| {
+        do sadness::cond.trap(|_j| {
             debug!("nested_reraise_trap_test_inner: in handler");
             inner_trapped = true;
             let i = 10;
             debug!("nested_reraise_trap_test_inner: handler re-raising");
-            sadness_condition.raise(&i)
+            sadness::cond.raise(&i)
         }).in {
             debug!("nested_reraise_trap_test_inner: in protected block");
             trouble(1);
@@ -171,7 +174,7 @@ mod test {
 
         let mut outer_trapped = false;
 
-        do sadness_condition.trap(|_j| {
+        do sadness::cond.trap(|_j| {
             debug!("nested_reraise_trap_test_outer: in handler");
             outer_trapped = true; 0
         }).in {
@@ -187,9 +190,9 @@ mod test {
 
         let mut trapped = false;
 
-        do sadness_condition.trap(|j| {
+        do sadness::cond.trap(|j| {
             debug!("test_default: in handler");
-            sadness_condition.raise_default(j, || {trapped=true; 5})
+            sadness::cond.raise_default(j, || {trapped=true; 5})
         }).in {
             debug!("test_default: in protected block");
             trouble(1);
diff --git a/src/libcore/core.rc b/src/libcore/core.rc
index 70d6e0898c7..72a0ddb21f9 100644
--- a/src/libcore/core.rc
+++ b/src/libcore/core.rc
@@ -242,6 +242,7 @@ mod core {
     pub const debug : u32 = 4_u32;
 
     pub use cmp;
+    pub use condition;
 }
 
 
diff --git a/src/librustc/front/intrinsic_inject.rs b/src/librustc/front/intrinsic_inject.rs
index ce918747c3f..f8a94fff678 100644
--- a/src/librustc/front/intrinsic_inject.rs
+++ b/src/librustc/front/intrinsic_inject.rs
@@ -17,7 +17,7 @@ export inject_intrinsic;
 fn inject_intrinsic(sess: Session,
                     crate: @ast::crate) -> @ast::crate {
 
-    let intrinsic_module = @include_str!("intrinsic.rs");
+    let intrinsic_module = @(include_str!("intrinsic.rs").to_owned());
 
     let item = parse::parse_item_from_source_str(~"<intrinsic>",
                                                  intrinsic_module,
diff --git a/src/librusti/rusti.rc b/src/librusti/rusti.rc
index a2e1167eaa8..0f84a720069 100644
--- a/src/librusti/rusti.rc
+++ b/src/librusti/rusti.rc
@@ -138,7 +138,7 @@ fn run(repl: Repl, input: ~str) -> Repl {
     };
 
     debug!("building driver input");
-    let head = include_str!("wrapper.rs");
+    let head = include_str!("wrapper.rs").to_owned();
     let foot = fmt!("%s\nfn main() {\n%s\n\nprint({\n%s\n})\n}",
                     repl.view_items, repl.stmts, input);
     let wrapped = driver::str_input(head + foot);
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index a65f5f33512..41d5c8ee0bb 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -286,12 +286,30 @@ fn core_macros() -> ~str {
 
     macro_rules! die(
         ($msg: expr) => (
-            core::sys::begin_unwind($msg, file!(), line!())
+            core::sys::begin_unwind($msg,
+                                    file!().to_owned(), line!())
         );
         () => (
             die!(~\"explicit failure\")
         )
     )
+
+    macro_rules! condition (
+
+        { $c:ident: $in:ty -> $out:ty; } => {
+
+            mod $c {
+                fn key(_x: @core::condition::Handler<$in,$out>) { }
+
+                pub const cond : core::condition::Condition<$in,$out> =
+                    core::condition::Condition {
+                    name: stringify!(c),
+                    key: key
+                };
+            }
+        }
+    )
+
 }";
 }
 
diff --git a/src/libsyntax/ext/source_util.rs b/src/libsyntax/ext/source_util.rs
index 099764a3278..e4074315689 100644
--- a/src/libsyntax/ext/source_util.rs
+++ b/src/libsyntax/ext/source_util.rs
@@ -11,7 +11,7 @@
 use ext::base::*;
 use codemap::{span, Loc, FileMap};
 use print::pprust;
-use ext::build::{mk_base_vec_e, mk_uint, mk_u8, mk_uniq_str};
+use ext::build::{mk_base_vec_e, mk_uint, mk_u8, mk_base_str};
 
 export expand_line;
 export expand_col;
@@ -46,19 +46,19 @@ fn expand_file(cx: ext_ctxt, sp: span, tts: ~[ast::token_tree])
     base::check_zero_tts(cx, sp, tts, "file!");
     let Loc { file: @FileMap { name: filename, _ }, _ } =
         cx.codemap().lookup_char_pos(sp.lo);
-    base::mr_expr(mk_uniq_str(cx, sp, filename))
+    base::mr_expr(mk_base_str(cx, sp, filename))
 }
 
 fn expand_stringify(cx: ext_ctxt, sp: span, tts: ~[ast::token_tree])
     -> base::mac_result {
     let s = pprust::tts_to_str(tts, cx.parse_sess().interner);
-    base::mr_expr(mk_uniq_str(cx, sp, s))
+    base::mr_expr(mk_base_str(cx, sp, s))
 }
 
 fn expand_mod(cx: ext_ctxt, sp: span, tts: ~[ast::token_tree])
     -> base::mac_result {
     base::check_zero_tts(cx, sp, tts, "module_path!");
-    base::mr_expr(mk_uniq_str(cx, sp,
+    base::mr_expr(mk_base_str(cx, sp,
                               str::connect(cx.mod_path().map(
                                   |x| cx.str_of(*x)), ~"::")))
 }
@@ -83,7 +83,7 @@ fn expand_include_str(cx: ext_ctxt, sp: span, tts: ~[ast::token_tree])
       }
     }
 
-    base::mr_expr(mk_uniq_str(cx, sp, result::unwrap(res)))
+    base::mr_expr(mk_base_str(cx, sp, result::unwrap(res)))
 }
 
 fn expand_include_bin(cx: ext_ctxt, sp: span, tts: ~[ast::token_tree])
diff --git a/src/test/bench/core-std.rs b/src/test/bench/core-std.rs
index f584a3f90b9..bc20eddfda1 100644
--- a/src/test/bench/core-std.rs
+++ b/src/test/bench/core-std.rs
@@ -19,7 +19,7 @@ use std::map::{Map, HashMap};
 use io::{Reader, ReaderUtil};
 
 macro_rules! bench (
-    ($id:ident) => (maybe_run_test(argv, stringify!($id), $id))
+    ($id:ident) => (maybe_run_test(argv, stringify!($id).to_owned(), $id))
 )
 
 fn main() {
diff --git a/src/test/run-pass/html-literals.rs b/src/test/run-pass/html-literals.rs
index 4629bdc22b8..84f23e57796 100644
--- a/src/test/run-pass/html-literals.rs
+++ b/src/test/run-pass/html-literals.rs
@@ -39,7 +39,8 @@ macro_rules! parse_node (
     ) => (
         parse_node!(
             [$(: $tags ($(:$tag_nodes),*))*];
-            [$(:$head_nodes,)* :tag(stringify!($head), ~[$($nodes),*])];
+            [$(:$head_nodes,)* :tag(stringify!($head).to_owned(),
+                                    ~[$($nodes),*])];
             $($rest)*
         )
     );
@@ -75,7 +76,7 @@ macro_rules! parse_node (
     ) => (
         parse_node!(
             [$(: $tags ($(:$tag_nodes),*))*];
-            [$(:$nodes,)* :text(stringify!($word))];
+            [$(:$nodes,)* :text(stringify!($word).to_owned())];
             $($rest)*
         )
     );
diff --git a/src/test/run-pass/syntax-extension-source-utils.rs b/src/test/run-pass/syntax-extension-source-utils.rs
index 0d7174370a0..413edcdb13a 100644
--- a/src/test/run-pass/syntax-extension-source-utils.rs
+++ b/src/test/run-pass/syntax-extension-source-utils.rs
@@ -16,20 +16,20 @@ mod m1 {
     #[legacy_exports];
     mod m2 {
         #[legacy_exports];
-        fn where_am_i() -> ~str { module_path!() }
+        fn where_am_i() -> ~str { (module_path!()).to_owned() }
     }
 }
 
 fn main() {
     assert(line!() == 24);
     assert(col!() == 11);
-    assert(file!().ends_with(~"syntax-extension-source-utils.rs"));
-    assert(stringify!((2*3) + 5) == ~"( 2 * 3 ) + 5");
-    assert(include!("syntax-extension-source-utils-files/includeme.fragment")
+    assert(file!().to_owned().ends_with(~"syntax-extension-source-utils.rs"));
+    assert(stringify!((2*3) + 5).to_owned() == ~"( 2 * 3 ) + 5");
+    assert(include!("syntax-extension-source-utils-files/includeme.fragment").to_owned()
            == ~"victory robot 6");
 
     assert(
-        include_str!("syntax-extension-source-utils-files/includeme.fragment")
+        include_str!("syntax-extension-source-utils-files/includeme.fragment").to_owned()
         .starts_with(~"/* this is for "));
     assert(
         include_bin!("syntax-extension-source-utils-files/includeme.fragment")