From 8e28f23c60daae7042e2c279741fa90f623acac0 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Fri, 14 Dec 2012 11:52:11 -0800 Subject: [PATCH] core: add macro_rules! for "condition! { c: in -> out; }". --- src/libcore/condition.rs | 41 ++++++++++--------- src/libcore/core.rc | 1 + src/librustc/front/intrinsic_inject.rs | 2 +- src/librusti/rusti.rc | 2 +- src/libsyntax/ext/expand.rs | 20 ++++++++- src/libsyntax/ext/source_util.rs | 10 ++--- src/test/bench/core-std.rs | 2 +- src/test/run-pass/html-literals.rs | 5 ++- .../run-pass/syntax-extension-source-utils.rs | 10 ++--- 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 { +pub struct Handler { handle: RustClosure, prev: Option<@Handler>, } -struct Condition { +pub struct Condition { + name: &static/str, key: task::local_data::LocalDataKey> } -impl Condition { +impl Condition { fn trap(&self, h: &self/fn(&T) ->U) -> Trap/&self { unsafe { @@ -32,7 +33,9 @@ impl Condition { 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 Condition { -struct Trap { +struct Trap { cond: &Condition, handler: @Handler } -impl Trap { - fn in(&self, inner: &self/fn() -> V) -> V { +impl Trap { + fn in(&self, inner: &self/fn() -> V) -> V { unsafe { let _g = Guard { cond: self.cond }; debug!("Trap: pushing handler to TLS"); @@ -81,7 +84,7 @@ impl Trap { } } -struct Guard { +struct Guard { cond: &Condition, drop { unsafe { @@ -105,13 +108,13 @@ struct Guard { #[cfg(test)] mod test { - fn sadness_key(_x: @Handler) { } - const sadness_condition : Condition = - 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_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")