Skip to content

Commit 0a6c8b7

Browse files
committed
---
yaml --- r: 153109 b: refs/heads/try2 c: 9fdaa94 h: refs/heads/master i: 153107: 753277f v: v3
1 parent e0ee2db commit 0a6c8b7

File tree

4 files changed

+41
-24
lines changed

4 files changed

+41
-24
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: f126eacd115415b0814ceb4a1c71380a0b2eb752
8+
refs/heads/try2: 9fdaa948c03a33e703eb5830dbed82ee2afe5101
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libsyntax/ext/base.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use parse::parser;
1919
use parse::token;
2020
use parse::token::{InternedString, intern, str_to_ident};
2121
use util::small_vector::SmallVector;
22+
use ext::mtwt;
2223

2324
use std::collections::HashMap;
2425
use std::gc::{Gc, GC};
@@ -273,7 +274,7 @@ pub struct BlockInfo {
273274
// should macros escape from this scope?
274275
pub macros_escape: bool,
275276
// what are the pending renames?
276-
pub pending_renames: RenameList,
277+
pub pending_renames: mtwt::RenameList,
277278
}
278279

279280
impl BlockInfo {
@@ -285,9 +286,6 @@ impl BlockInfo {
285286
}
286287
}
287288

288-
// a list of ident->name renamings
289-
pub type RenameList = Vec<(ast::Ident, Name)>;
290-
291289
// The base map of methods for expanding syntax extension
292290
// AST nodes into full ASTs
293291
pub fn syntax_expander_table() -> SyntaxEnv {

branches/try2/src/libsyntax/ext/expand.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -844,17 +844,14 @@ fn expand_pat(p: Gc<ast::Pat>, fld: &mut MacroExpander) -> Gc<ast::Pat> {
844844
// to every identifier, including both bindings and varrefs
845845
// (and lots of things that will turn out to be neither)
846846
pub struct IdentRenamer<'a> {
847-
renames: &'a mut RenameList,
847+
renames: &'a mtwt::RenameList,
848848
}
849849

850850
impl<'a> Folder for IdentRenamer<'a> {
851851
fn fold_ident(&mut self, id: Ident) -> Ident {
852-
let new_ctxt = self.renames.iter().fold(id.ctxt, |ctxt, &(from, to)| {
853-
mtwt::new_rename(from, to, ctxt)
854-
});
855852
Ident {
856853
name: id.name,
857-
ctxt: new_ctxt,
854+
ctxt: mtwt::new_renames(self.renames, id.ctxt),
858855
}
859856
}
860857
}

branches/try2/src/libsyntax/ext/mtwt.rs

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,38 +54,51 @@ pub enum SyntaxContext_ {
5454
IllegalCtxt
5555
}
5656

57+
/// A list of ident->name renamings
58+
pub type RenameList = Vec<(Ident, Name)>;
59+
5760
/// Extend a syntax context with a given mark
58-
pub fn new_mark(m: Mrk, tail: SyntaxContext) -> SyntaxContext {
59-
with_sctable(|table| new_mark_internal(m, tail, table))
61+
pub fn new_mark(m: Mrk, ctxt: SyntaxContext) -> SyntaxContext {
62+
with_sctable(|table| new_mark_internal(m, ctxt, table))
6063
}
6164

62-
// Extend a syntax context with a given mark and table
63-
fn new_mark_internal(m: Mrk, tail: SyntaxContext, table: &SCTable) -> SyntaxContext {
64-
let key = (tail, m);
65+
// Extend a syntax context with a given mark and sctable (explicit memoization)
66+
fn new_mark_internal(m: Mrk, ctxt: SyntaxContext, table: &SCTable) -> SyntaxContext {
67+
let key = (ctxt, m);
6568
let new_ctxt = |_: &(SyntaxContext, Mrk)|
66-
idx_push(&mut *table.table.borrow_mut(), Mark(m, tail));
69+
idx_push(&mut *table.table.borrow_mut(), Mark(m, ctxt));
6770

6871
*table.mark_memo.borrow_mut().find_or_insert_with(key, new_ctxt)
6972
}
7073

7174
/// Extend a syntax context with a given rename
7275
pub fn new_rename(id: Ident, to:Name,
73-
tail: SyntaxContext) -> SyntaxContext {
74-
with_sctable(|table| new_rename_internal(id, to, tail, table))
76+
ctxt: SyntaxContext) -> SyntaxContext {
77+
with_sctable(|table| new_rename_internal(id, to, ctxt, table))
7578
}
7679

77-
// Extend a syntax context with a given rename and sctable
80+
// Extend a syntax context with a given rename and sctable (explicit memoization)
7881
fn new_rename_internal(id: Ident,
7982
to: Name,
80-
tail: SyntaxContext,
83+
ctxt: SyntaxContext,
8184
table: &SCTable) -> SyntaxContext {
82-
let key = (tail,id,to);
85+
let key = (ctxt,id,to);
8386
let new_ctxt = |_: &(SyntaxContext, Ident, Mrk)|
84-
idx_push(&mut *table.table.borrow_mut(), Rename(id, to, tail));
87+
idx_push(&mut *table.table.borrow_mut(), Rename(id, to, ctxt));
8588

8689
*table.rename_memo.borrow_mut().find_or_insert_with(key, new_ctxt)
8790
}
8891

92+
/// Apply a list of renamings to a context
93+
// if these rename lists get long, it would make sense
94+
// to consider memoizing this fold. This may come up
95+
// when we add hygiene to item names.
96+
pub fn new_renames(renames: &RenameList, ctxt: SyntaxContext) -> SyntaxContext {
97+
renames.iter().fold(ctxt, |ctxt, &(from, to)| {
98+
new_rename(from, to, ctxt)
99+
})
100+
}
101+
89102
/// Fetch the SCTable from TLS, create one if it doesn't yet exist.
90103
pub fn with_sctable<T>(op: |&SCTable| -> T) -> T {
91104
local_data_key!(sctable_key: Rc<SCTable>)
@@ -263,9 +276,9 @@ fn xor_push(marks: &mut Vec<Mrk>, mark: Mrk) {
263276

264277
#[cfg(test)]
265278
mod tests {
266-
use ast::*;
279+
use ast::{EMPTY_CTXT, Ident, Mrk, Name, SyntaxContext};
267280
use super::{resolve, xor_push, new_mark_internal, new_sctable_internal};
268-
use super::{new_rename_internal, marksof_internal, resolve_internal};
281+
use super::{new_rename_internal, new_renames, marksof_internal, resolve_internal};
269282
use super::{SCTable, EmptyCtxt, Mark, Rename, IllegalCtxt};
270283
use std::collections::HashMap;
271284

@@ -480,4 +493,13 @@ mod tests {
480493
resolve_internal(id(30,EMPTY_CTXT),&mut t, &mut rt);
481494
assert_eq!(rt.len(),2);
482495
}
496+
497+
#[test]
498+
fn new_resolves_test() {
499+
let renames = vec!((Ident{name:23,ctxt:EMPTY_CTXT},24),
500+
(Ident{name:29,ctxt:EMPTY_CTXT},29));
501+
let new_ctxt1 = new_renames(&renames,EMPTY_CTXT);
502+
assert_eq!(resolve(Ident{name:23,ctxt:new_ctxt1}),24);
503+
assert_eq!(resolve(Ident{name:29,ctxt:new_ctxt1}),29);
504+
}
483505
}

0 commit comments

Comments
 (0)