Skip to content

Commit 59c3930

Browse files
author
Jakub Wieczorek
committed
---
yaml --- r: 132062 b: refs/heads/dist-snap c: febfb75 h: refs/heads/master v: v3
1 parent c4e4237 commit 59c3930

File tree

9 files changed

+331
-275
lines changed

9 files changed

+331
-275
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: 457a3c991d79b971be07fce75f9d0c12848fb37c
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
9-
refs/heads/dist-snap: 6e3e0a83aa9f704df7017199233774c4021d9a5d
9+
refs/heads/dist-snap: febfb752d2775bb1e875634e45058e27a36dd714
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1212
refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0

branches/dist-snap/src/libcore/iter.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,19 +1962,7 @@ pub struct Range<A> {
19621962
one: A
19631963
}
19641964

1965-
/// Returns an iterator over the given range [start, stop) (that is, starting
1966-
/// at start (inclusive), and ending at stop (exclusive)).
1967-
///
1968-
/// # Example
1969-
///
1970-
/// ```rust
1971-
/// let array = [0, 1, 2, 3, 4];
1972-
///
1973-
/// for i in range(0, 5u) {
1974-
/// println!("{}", i);
1975-
/// assert_eq!(i, array[i]);
1976-
/// }
1977-
/// ```
1965+
/// Return an iterator over the range [start, stop)
19781966
#[inline]
19791967
pub fn range<A: Add<A, A> + PartialOrd + Clone + One>(start: A, stop: A) -> Range<A> {
19801968
Range{state: start, stop: stop, one: One::one()}

branches/dist-snap/src/libregex_macros/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ use syntax::ext::build::AstBuilder;
3434
use syntax::ext::base::{ExtCtxt, MacResult, MacExpr, DummyResult};
3535
use syntax::parse::token;
3636
use syntax::print::pprust;
37-
use syntax::fold::Folder;
3837

3938
use rustc::plugin::Registry;
4039

@@ -616,7 +615,7 @@ fn exec<'t>(which: ::regex::native::MatchKind, input: &'t str,
616615
/// Otherwise, logs an error with cx.span_err and returns None.
617616
fn parse(cx: &mut ExtCtxt, tts: &[ast::TokenTree]) -> Option<String> {
618617
let mut parser = cx.new_parser_from_tts(tts);
619-
let entry = cx.expander().fold_expr(parser.parse_expr());
618+
let entry = cx.expand_expr(parser.parse_expr());
620619
let regex = match entry.node {
621620
ast::ExprLit(lit) => {
622621
match lit.node {

branches/dist-snap/src/librustc/middle/trans/_match.rs

Lines changed: 83 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -202,12 +202,12 @@ use middle::resolve::DefMap;
202202
use middle::trans::adt;
203203
use middle::trans::base::*;
204204
use middle::trans::build::*;
205-
use middle::trans::build;
206205
use middle::trans::callee;
207206
use middle::trans::cleanup;
208207
use middle::trans::cleanup::CleanupMethods;
209208
use middle::trans::common::*;
210209
use middle::trans::consts;
210+
use middle::trans::controlflow;
211211
use middle::trans::datum::*;
212212
use middle::trans::expr::Dest;
213213
use middle::trans::expr;
@@ -220,12 +220,14 @@ use util::ppaux::{Repr, vec_map_to_string};
220220

221221
use std;
222222
use std::collections::HashMap;
223+
use std::cell::Cell;
223224
use std::rc::Rc;
224225
use std::gc::{Gc};
225226
use syntax::ast;
226227
use syntax::ast::Ident;
227228
use syntax::codemap::Span;
228229
use syntax::fold::Folder;
230+
use syntax::parse::token::InternedString;
229231

230232
#[deriving(PartialEq)]
231233
pub enum VecLenOpt {
@@ -299,6 +301,20 @@ fn trans_opt<'a>(mut bcx: &'a Block<'a>, o: &Opt) -> opt_result<'a> {
299301
}
300302
}
301303

304+
fn variant_opt(bcx: &Block, pat_id: ast::NodeId) -> Opt {
305+
let ccx = bcx.ccx();
306+
let def = ccx.tcx.def_map.borrow().get_copy(&pat_id);
307+
match def {
308+
def::DefVariant(enum_id, var_id, _) => {
309+
let variant = ty::enum_variant_with_id(ccx.tcx(), enum_id, var_id);
310+
var(variant.disr_val, adt::represent_node(bcx, pat_id), var_id)
311+
}
312+
_ => {
313+
ccx.sess().bug("non-variant or struct in variant_opt()");
314+
}
315+
}
316+
}
317+
302318
#[deriving(Clone)]
303319
pub enum TransBindingMode {
304320
TrByCopy(/* llbinding */ ValueRef),
@@ -614,15 +630,26 @@ fn get_options(bcx: &Block, m: &[Match], col: uint) -> Vec<Opt> {
614630
ast::PatLit(l) => {
615631
add_to_set(ccx.tcx(), &mut found, lit(l));
616632
}
617-
ast::PatIdent(..) | ast::PatEnum(..) | ast::PatStruct(..) => {
633+
ast::PatIdent(..) => {
618634
// This is either an enum variant or a variable binding.
619635
let opt_def = ccx.tcx.def_map.borrow().find_copy(&cur.id);
620636
match opt_def {
621-
Some(def::DefVariant(enum_id, var_id, _)) => {
622-
let variant = ty::enum_variant_with_id(ccx.tcx(), enum_id, var_id);
637+
Some(def::DefVariant(..)) => {
638+
add_to_set(ccx.tcx(), &mut found,
639+
variant_opt(bcx, cur.id));
640+
}
641+
_ => {}
642+
}
643+
}
644+
ast::PatEnum(..) | ast::PatStruct(..) => {
645+
// This could be one of: a tuple-like enum variant, a
646+
// struct-like enum variant, or a struct.
647+
let opt_def = ccx.tcx.def_map.borrow().find_copy(&cur.id);
648+
match opt_def {
649+
Some(def::DefFn(..)) |
650+
Some(def::DefVariant(..)) => {
623651
add_to_set(ccx.tcx(), &mut found,
624-
var(variant.disr_val,
625-
adt::represent_node(bcx, cur.id), var_id));
652+
variant_opt(bcx, cur.id));
626653
}
627654
_ => {}
628655
}
@@ -768,33 +795,56 @@ fn any_irrefutable_adt_pat(bcx: &Block, m: &[Match], col: uint) -> bool {
768795
})
769796
}
770797

798+
struct DynamicFailureHandler<'a> {
799+
bcx: &'a Block<'a>,
800+
sp: Span,
801+
msg: InternedString,
802+
finished: Cell<Option<BasicBlockRef>>,
803+
}
804+
805+
impl<'a> DynamicFailureHandler<'a> {
806+
fn handle_fail(&self) -> BasicBlockRef {
807+
match self.finished.get() {
808+
Some(bb) => return bb,
809+
_ => (),
810+
}
811+
812+
let fcx = self.bcx.fcx;
813+
let fail_cx = fcx.new_block(false, "case_fallthrough", None);
814+
controlflow::trans_fail(fail_cx, self.sp, self.msg.clone());
815+
self.finished.set(Some(fail_cx.llbb));
816+
fail_cx.llbb
817+
}
818+
}
819+
771820
/// What to do when the pattern match fails.
772821
enum FailureHandler<'a> {
773822
Infallible,
774823
JumpToBasicBlock(BasicBlockRef),
775-
Unreachable
824+
DynamicFailureHandlerClass(Box<DynamicFailureHandler<'a>>),
776825
}
777826

778827
impl<'a> FailureHandler<'a> {
779828
fn is_infallible(&self) -> bool {
780829
match *self {
781830
Infallible => true,
782-
_ => false
831+
_ => false,
783832
}
784833
}
785834

786835
fn is_fallible(&self) -> bool {
787836
!self.is_infallible()
788837
}
789838

790-
fn handle_fail(&self, bcx: &Block) {
839+
fn handle_fail(&self) -> BasicBlockRef {
791840
match *self {
792-
Infallible =>
793-
fail!("attempted to fail in infallible failure handler!"),
794-
JumpToBasicBlock(basic_block) =>
795-
Br(bcx, basic_block),
796-
Unreachable =>
797-
build::Unreachable(bcx)
841+
Infallible => {
842+
fail!("attempted to fail in infallible failure handler!")
843+
}
844+
JumpToBasicBlock(basic_block) => basic_block,
845+
DynamicFailureHandlerClass(ref dynamic_failure_handler) => {
846+
dynamic_failure_handler.handle_fail()
847+
}
798848
}
799849
}
800850
}
@@ -955,7 +1005,7 @@ fn compile_guard<'a, 'b>(
9551005
// condition explicitly rather than (possibly) falling back to
9561006
// the default arm.
9571007
&JumpToBasicBlock(_) if m.len() == 1 && has_genuine_default => {
958-
chk.handle_fail(bcx);
1008+
Br(bcx, chk.handle_fail());
9591009
}
9601010
_ => {
9611011
compile_submatch(bcx, m, vals, chk, has_genuine_default);
@@ -980,7 +1030,7 @@ fn compile_submatch<'a, 'b>(
9801030
let mut bcx = bcx;
9811031
if m.len() == 0u {
9821032
if chk.is_fallible() {
983-
chk.handle_fail(bcx);
1033+
Br(bcx, chk.handle_fail());
9841034
}
9851035
return;
9861036
}
@@ -1251,7 +1301,7 @@ fn compile_submatch_continue<'a, 'b>(
12511301
// condition explicitly rather than (eventually) falling back to
12521302
// the last default arm.
12531303
&JumpToBasicBlock(_) if defaults.len() == 1 && has_genuine_default => {
1254-
chk.handle_fail(else_cx);
1304+
Br(else_cx, chk.handle_fail());
12551305
}
12561306
_ => {
12571307
compile_submatch(else_cx,
@@ -1345,10 +1395,21 @@ fn trans_match_inner<'a>(scope_cx: &'a Block<'a>,
13451395
}
13461396

13471397
let t = node_id_type(bcx, discr_expr.id);
1348-
let chk = if ty::type_is_empty(tcx, t) {
1349-
Unreachable
1350-
} else {
1351-
Infallible
1398+
let chk = {
1399+
if ty::type_is_empty(tcx, t) {
1400+
// Special case for empty types
1401+
let fail_cx = Cell::new(None);
1402+
let fail_handler = box DynamicFailureHandler {
1403+
bcx: scope_cx,
1404+
sp: discr_expr.span,
1405+
msg: InternedString::new("scrutinizing value that can't \
1406+
exist"),
1407+
finished: fail_cx,
1408+
};
1409+
DynamicFailureHandlerClass(fail_handler)
1410+
} else {
1411+
Infallible
1412+
}
13521413
};
13531414

13541415
let arm_datas: Vec<ArmData> = arms.iter().map(|arm| ArmData {

branches/dist-snap/src/libsyntax/ext/base.rs

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@ use parse::token;
2020
use parse::token::{InternedString, intern, str_to_ident};
2121
use util::small_vector::SmallVector;
2222
use ext::mtwt;
23-
use fold::Folder;
2423

2524
use std::collections::HashMap;
2625
use std::gc::{Gc, GC};
27-
use std::rc::Rc;
2826

2927
// new-style macro! tt code:
3028
//
@@ -106,9 +104,9 @@ pub type IdentMacroExpanderFn =
106104
/// just into the compiler's internal macro table, for `make_def`).
107105
pub trait MacResult {
108106
/// Define a new macro.
109-
// this should go away; the idea that a macro might expand into
110-
// either a macro definition or an expression, depending on what
111-
// the context wants, is kind of silly.
107+
// this particular flavor should go away; the idea that a macro might
108+
// expand into either a macro definition or an expression, depending
109+
// on what the context wants, is kind of silly.
112110
fn make_def(&self) -> Option<MacroDef> {
113111
None
114112
}
@@ -316,7 +314,7 @@ impl BlockInfo {
316314

317315
/// The base map of methods for expanding syntax extension
318316
/// AST nodes into full ASTs
319-
fn initial_syntax_expander_table() -> SyntaxEnv {
317+
pub fn syntax_expander_table() -> SyntaxEnv {
320318
// utility function to simplify creating NormalTT syntax extensions
321319
fn builtin_normal_expander(f: MacroExpanderFn) -> SyntaxExtension {
322320
NormalTT(box BasicMacroExpander {
@@ -433,9 +431,7 @@ pub struct ExtCtxt<'a> {
433431

434432
pub mod_path: Vec<ast::Ident> ,
435433
pub trace_mac: bool,
436-
pub exported_macros: Vec<Gc<ast::Item>>,
437-
438-
pub syntax_env: SyntaxEnv,
434+
pub exported_macros: Vec<Gc<ast::Item>>
439435
}
440436

441437
impl<'a> ExtCtxt<'a> {
@@ -449,18 +445,22 @@ impl<'a> ExtCtxt<'a> {
449445
ecfg: ecfg,
450446
trace_mac: false,
451447
exported_macros: Vec::new(),
452-
syntax_env: initial_syntax_expander_table(),
453448
}
454449
}
455450

456-
#[deprecated = "Replaced with `expander().fold_expr()`"]
457-
pub fn expand_expr(&mut self, e: Gc<ast::Expr>) -> Gc<ast::Expr> {
458-
self.expander().fold_expr(e)
459-
}
460-
461-
/// Returns a `Folder` for deeply expanding all macros in a AST node.
462-
pub fn expander<'b>(&'b mut self) -> expand::MacroExpander<'b, 'a> {
463-
expand::MacroExpander { cx: self }
451+
pub fn expand_expr(&mut self, mut e: Gc<ast::Expr>) -> Gc<ast::Expr> {
452+
loop {
453+
match e.node {
454+
ast::ExprMac(..) => {
455+
let mut expander = expand::MacroExpander {
456+
extsbox: syntax_expander_table(),
457+
cx: self,
458+
};
459+
e = expand::expand_expr(e, &mut expander);
460+
}
461+
_ => return e
462+
}
463+
}
464464
}
465465

466466
pub fn new_parser_from_tts(&self, tts: &[ast::TokenTree])
@@ -570,7 +570,7 @@ impl<'a> ExtCtxt<'a> {
570570
pub fn expr_to_string(cx: &mut ExtCtxt, expr: Gc<ast::Expr>, err_msg: &str)
571571
-> Option<(InternedString, ast::StrStyle)> {
572572
// we want to be able to handle e.g. concat("foo", "bar")
573-
let expr = cx.expander().fold_expr(expr);
573+
let expr = cx.expand_expr(expr);
574574
match expr.node {
575575
ast::ExprLit(l) => match l.node {
576576
ast::LitStr(ref s, style) => return Some(((*s).clone(), style)),
@@ -627,7 +627,7 @@ pub fn get_exprs_from_tts(cx: &mut ExtCtxt,
627627
let mut p = cx.new_parser_from_tts(tts);
628628
let mut es = Vec::new();
629629
while p.token != token::EOF {
630-
es.push(cx.expander().fold_expr(p.parse_expr()));
630+
es.push(cx.expand_expr(p.parse_expr()));
631631
if p.eat(&token::COMMA) {
632632
continue;
633633
}
@@ -642,13 +642,10 @@ pub fn get_exprs_from_tts(cx: &mut ExtCtxt,
642642
/// In order to have some notion of scoping for macros,
643643
/// we want to implement the notion of a transformation
644644
/// environment.
645-
///
645+
646646
/// This environment maps Names to SyntaxExtensions.
647-
pub struct SyntaxEnv {
648-
chain: Vec<MapChainFrame> ,
649-
}
650647
651-
// impl question: how to implement it? Initially, the
648+
//impl question: how to implement it? Initially, the
652649
// env will contain only macros, so it might be painful
653650
// to add an empty frame for every context. Let's just
654651
// get it working, first....
@@ -660,11 +657,15 @@ pub struct SyntaxEnv {
660657

661658
struct MapChainFrame {
662659
info: BlockInfo,
663-
map: HashMap<Name, Rc<SyntaxExtension>>,
660+
map: HashMap<Name, SyntaxExtension>,
661+
}
662+
663+
pub struct SyntaxEnv {
664+
chain: Vec<MapChainFrame> ,
664665
}
665666

666667
impl SyntaxEnv {
667-
fn new() -> SyntaxEnv {
668+
pub fn new() -> SyntaxEnv {
668669
let mut map = SyntaxEnv { chain: Vec::new() };
669670
map.push_frame();
670671
map
@@ -691,18 +692,18 @@ impl SyntaxEnv {
691692
unreachable!()
692693
}
693694

694-
pub fn find(&self, k: &Name) -> Option<Rc<SyntaxExtension>> {
695+
pub fn find<'a>(&'a self, k: &Name) -> Option<&'a SyntaxExtension> {
695696
for frame in self.chain.iter().rev() {
696697
match frame.map.find(k) {
697-
Some(v) => return Some(v.clone()),
698+
Some(v) => return Some(v),
698699
None => {}
699700
}
700701
}
701702
None
702703
}
703704

704705
pub fn insert(&mut self, k: Name, v: SyntaxExtension) {
705-
self.find_escape_frame().map.insert(k, Rc::new(v));
706+
self.find_escape_frame().map.insert(k, v);
706707
}
707708

708709
pub fn info<'a>(&'a mut self) -> &'a mut BlockInfo {

0 commit comments

Comments
 (0)