Skip to content

Commit 2cf9649

Browse files
committed
Immutable ExpansionData.
1 parent f3c7333 commit 2cf9649

File tree

3 files changed

+37
-23
lines changed

3 files changed

+37
-23
lines changed

src/librustc_resolve/build_reduced_graph.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ impl<'b> Resolver<'b> {
203203
let ext = macro_rules::compile(&self.session.parse_sess, &def);
204204
let shadowing =
205205
self.resolve_macro_name(Mark::root(), name, false).is_some();
206-
self.expansion_data[&Mark::root()].module.macros.borrow_mut()
206+
self.expansion_data[&Mark::root()].module.get().macros.borrow_mut()
207207
.insert(name, macros::NameBinding {
208208
ext: Rc::new(ext),
209209
expansion: expansion,
@@ -525,8 +525,8 @@ pub struct BuildReducedGraphVisitor<'a, 'b: 'a> {
525525

526526
impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
527527
fn visit_invoc(&mut self, id: ast::NodeId) {
528-
self.resolver.expansion_data.get_mut(&Mark::from_placeholder_id(id)).unwrap().module =
529-
self.resolver.current_module;
528+
let mark = Mark::from_placeholder_id(id);
529+
self.resolver.expansion_data[&mark].module.set(self.resolver.current_module);
530530
}
531531
}
532532

src/librustc_resolve/lib.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ use std::mem::replace;
7777
use std::rc::Rc;
7878

7979
use resolve_imports::{ImportDirective, NameResolution};
80+
use macros::ExpansionData;
8081

8182
// NB: This module needs to be declared first so diagnostics are
8283
// registered before they are used.
@@ -1088,7 +1089,7 @@ pub struct Resolver<'a> {
10881089
macro_names: FnvHashSet<Name>,
10891090

10901091
// Maps the `Mark` of an expansion to its containing module or block.
1091-
expansion_data: FnvHashMap<Mark, macros::ExpansionData<'a>>,
1092+
expansion_data: FnvHashMap<Mark, &'a ExpansionData<'a>>,
10921093
}
10931094

10941095
pub struct ResolverArenas<'a> {
@@ -1097,6 +1098,7 @@ pub struct ResolverArenas<'a> {
10971098
name_bindings: arena::TypedArena<NameBinding<'a>>,
10981099
import_directives: arena::TypedArena<ImportDirective<'a>>,
10991100
name_resolutions: arena::TypedArena<RefCell<NameResolution<'a>>>,
1101+
expansion_data: arena::TypedArena<ExpansionData<'a>>,
11001102
}
11011103

11021104
impl<'a> ResolverArenas<'a> {
@@ -1120,6 +1122,9 @@ impl<'a> ResolverArenas<'a> {
11201122
fn alloc_name_resolution(&'a self) -> &'a RefCell<NameResolution<'a>> {
11211123
self.name_resolutions.alloc(Default::default())
11221124
}
1125+
fn alloc_expansion_data(&'a self, expansion_data: ExpansionData<'a>) -> &'a ExpansionData<'a> {
1126+
self.expansion_data.alloc(expansion_data)
1127+
}
11231128
}
11241129

11251130
impl<'a> ty::NodeIdTree for Resolver<'a> {
@@ -1206,7 +1211,8 @@ impl<'a> Resolver<'a> {
12061211
DefCollector::new(&mut definitions).collect_root();
12071212

12081213
let mut expansion_data = FnvHashMap();
1209-
expansion_data.insert(Mark::root(), macros::ExpansionData::root(graph_root));
1214+
expansion_data.insert(Mark::root(),
1215+
arenas.alloc_expansion_data(ExpansionData::root(graph_root)));
12101216

12111217
Resolver {
12121218
session: session,
@@ -1277,6 +1283,7 @@ impl<'a> Resolver<'a> {
12771283
name_bindings: arena::TypedArena::new(),
12781284
import_directives: arena::TypedArena::new(),
12791285
name_resolutions: arena::TypedArena::new(),
1286+
expansion_data: arena::TypedArena::new(),
12801287
}
12811288
}
12821289

src/librustc_resolve/macros.rs

+25-18
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use {Module, Resolver};
1212
use build_reduced_graph::BuildReducedGraphVisitor;
1313
use rustc::hir::def_id::{CRATE_DEF_INDEX, DefIndex};
1414
use rustc::hir::map::{self, DefCollector};
15+
use std::cell::Cell;
1516
use std::rc::Rc;
1617
use syntax::ast;
1718
use syntax::errors::DiagnosticBuilder;
@@ -35,7 +36,7 @@ pub struct NameBinding {
3536
#[derive(Clone)]
3637
pub struct ExpansionData<'a> {
3738
backtrace: SyntaxContext,
38-
pub module: Module<'a>,
39+
pub module: Cell<Module<'a>>,
3940
def_index: DefIndex,
4041
// True if this expansion is in a `const_integer` position, for example `[u32; m!()]`.
4142
// c.f. `DefCollector::visit_ast_const_integer`.
@@ -46,7 +47,7 @@ impl<'a> ExpansionData<'a> {
4647
pub fn root(graph_root: Module<'a>) -> Self {
4748
ExpansionData {
4849
backtrace: SyntaxContext::empty(),
49-
module: graph_root,
50+
module: Cell::new(graph_root),
5051
def_index: CRATE_DEF_INDEX,
5152
const_integer: false,
5253
}
@@ -61,18 +62,18 @@ impl<'a> base::Resolver for Resolver<'a> {
6162
fn get_module_scope(&mut self, id: ast::NodeId) -> Mark {
6263
let mark = Mark::fresh();
6364
let module = self.module_map[&id];
64-
self.expansion_data.insert(mark, ExpansionData {
65+
self.expansion_data.insert(mark, self.arenas.alloc_expansion_data(ExpansionData {
6566
backtrace: SyntaxContext::empty(),
66-
module: module,
67+
module: Cell::new(module),
6768
def_index: module.def_id().unwrap().index,
6869
const_integer: false,
69-
});
70+
}));
7071
mark
7172
}
7273

7374
fn visit_expansion(&mut self, mark: Mark, expansion: &Expansion) {
7475
self.collect_def_ids(mark, expansion);
75-
self.current_module = self.expansion_data[&mark].module;
76+
self.current_module = self.expansion_data[&mark].module.get();
7677
expansion.visit_with(&mut BuildReducedGraphVisitor { resolver: self, expansion: mark });
7778
}
7879

@@ -81,13 +82,14 @@ impl<'a> base::Resolver for Resolver<'a> {
8182
self.session.span_err(def.span, "user-defined macros may not be named `macro_rules`");
8283
}
8384
if def.use_locally {
84-
let ExpansionData { mut module, backtrace, .. } = self.expansion_data[&scope];
85+
let expansion_data = self.expansion_data[&scope];
86+
let mut module = expansion_data.module.get();
8587
while module.macros_escape {
8688
module = module.parent.unwrap();
8789
}
8890
let binding = NameBinding {
8991
ext: Rc::new(macro_rules::compile(&self.session.parse_sess, &def)),
90-
expansion: backtrace.data().prev_ctxt.data().outer_mark,
92+
expansion: expansion_data.backtrace.data().prev_ctxt.data().outer_mark,
9193
shadowing: self.resolve_macro_name(scope, def.ident.name, false).is_some(),
9294
span: def.span,
9395
};
@@ -119,7 +121,7 @@ impl<'a> base::Resolver for Resolver<'a> {
119121
fn find_attr_invoc(&mut self, attrs: &mut Vec<ast::Attribute>) -> Option<ast::Attribute> {
120122
for i in 0..attrs.len() {
121123
let name = intern(&attrs[i].name());
122-
match self.expansion_data[&Mark::root()].module.macros.borrow().get(&name) {
124+
match self.expansion_data[&Mark::root()].module.get().macros.borrow().get(&name) {
123125
Some(binding) => match *binding.ext {
124126
MultiModifier(..) | MultiDecorator(..) | SyntaxExtension::AttrProcMacro(..) => {
125127
return Some(attrs.remove(i))
@@ -164,10 +166,11 @@ impl<'a> base::Resolver for Resolver<'a> {
164166
impl<'a> Resolver<'a> {
165167
pub fn resolve_macro_name(&mut self, scope: Mark, name: ast::Name, record_used: bool)
166168
-> Option<Rc<SyntaxExtension>> {
167-
let ExpansionData { mut module, backtrace, .. } = self.expansion_data[&scope];
169+
let expansion_data = self.expansion_data[&scope];
170+
let mut module = expansion_data.module.get();
168171
loop {
169172
if let Some(binding) = module.macros.borrow().get(&name) {
170-
let mut backtrace = backtrace.data();
173+
let mut backtrace = expansion_data.backtrace.data();
171174
while binding.expansion != backtrace.outer_mark {
172175
if backtrace.outer_mark != Mark::root() {
173176
backtrace = backtrace.prev_ctxt.data();
@@ -205,14 +208,18 @@ impl<'a> Resolver<'a> {
205208
}
206209

207210
fn collect_def_ids(&mut self, mark: Mark, expansion: &Expansion) {
208-
let expansion_data = &mut self.expansion_data;
209-
let ExpansionData { backtrace, def_index, const_integer, module } = expansion_data[&mark];
211+
let Resolver { ref mut expansion_data, arenas, graph_root, .. } = *self;
212+
let ExpansionData { def_index, const_integer, backtrace, .. } =
213+
expansion_data[&mark].clone();
214+
210215
let visit_macro_invoc = &mut |invoc: map::MacroInvocationData| {
211-
expansion_data.entry(invoc.mark).or_insert(ExpansionData {
212-
backtrace: backtrace.apply_mark(invoc.mark),
213-
def_index: invoc.def_index,
214-
const_integer: invoc.const_integer,
215-
module: module,
216+
expansion_data.entry(invoc.mark).or_insert_with(|| {
217+
arenas.alloc_expansion_data(ExpansionData {
218+
backtrace: backtrace.apply_mark(invoc.mark),
219+
def_index: invoc.def_index,
220+
const_integer: invoc.const_integer,
221+
module: Cell::new(graph_root),
222+
})
216223
});
217224
};
218225

0 commit comments

Comments
 (0)