Skip to content

Commit 00e699f

Browse files
committed
change callback for expr/type to a fn pointer
The idea is that, this way, we can cleanly isolate ALL state that is being passed, since it goes as an argument to the fn pointer.
1 parent c0c8ab9 commit 00e699f

File tree

2 files changed

+62
-62
lines changed

2 files changed

+62
-62
lines changed

src/librustc_metadata/encoder.rs

Lines changed: 57 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -205,16 +205,17 @@ impl<'a, 'tcx, 'encoder> IndexBuilder<'a, 'tcx, 'encoder> {
205205
let def = ecx.tcx.lookup_adt_def(enum_did);
206206
self.encode_fields(enum_did);
207207
for (i, variant) in def.variants.iter().enumerate() {
208-
self.record(variant.did, |this| this.encode_enum_variant_info(enum_did, i, vis));
208+
self.record(variant.did,
209+
ItemContentBuilder::encode_enum_variant_info,
210+
(enum_did, i, vis));
209211
}
210212
}
211213
}
212214

213215
impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
214216
fn encode_enum_variant_info(&mut self,
215-
enum_did: DefId, // enum def-id
216-
index: usize, // variant index
217-
vis: &hir::Visibility) {
217+
(enum_did, index, vis):
218+
(DefId, usize, &hir::Visibility)) {
218219
let ecx = self.ecx;
219220
let def = ecx.tcx.lookup_adt_def(enum_did);
220221
let variant = &def.variants[index];
@@ -293,11 +294,8 @@ fn encode_reexports(ecx: &EncodeContext,
293294

294295
impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
295296
fn encode_info_for_mod(&mut self,
296-
md: &hir::Mod,
297-
attrs: &[ast::Attribute],
298-
id: NodeId,
299-
name: Name,
300-
vis: &hir::Visibility) {
297+
(md, attrs, id, name, vis):
298+
(&hir::Mod, &[ast::Attribute], NodeId, Name, &hir::Visibility)) {
301299
let ecx = self.ecx();
302300

303301
encode_def_id_and_key(ecx, self.rbml_w, ecx.tcx.map.local_def_id(id));
@@ -418,19 +416,18 @@ impl<'a, 'tcx, 'encoder> IndexBuilder<'a, 'tcx, 'encoder> {
418416
let def = self.ecx.tcx.lookup_adt_def(adt_def_id);
419417
for (variant_index, variant) in def.variants.iter().enumerate() {
420418
for (field_index, field) in variant.fields.iter().enumerate() {
421-
self.record(field.did, |this| this.encode_field(adt_def_id,
422-
variant_index,
423-
field_index));
419+
self.record(field.did,
420+
ItemContentBuilder::encode_field,
421+
(adt_def_id, variant_index, field_index));
424422
}
425423
}
426424
}
427425
}
428426

429427
impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
430428
fn encode_field(&mut self,
431-
adt_def_id: DefId,
432-
variant_index: usize,
433-
field_index: usize) {
429+
(adt_def_id, variant_index, field_index):
430+
(DefId, usize, usize)) {
434431
let ecx = self.ecx();
435432
let def = ecx.tcx.lookup_adt_def(adt_def_id);
436433
let variant = &def.variants[variant_index];
@@ -454,9 +451,8 @@ impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
454451

455452
impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
456453
fn encode_struct_ctor(&mut self,
457-
struct_def_id: DefId,
458-
struct_node_id: ast::NodeId,
459-
ctor_node_id: ast::NodeId) {
454+
(struct_def_id, struct_node_id, ctor_node_id):
455+
(DefId, ast::NodeId, ast::NodeId)) {
460456
let ecx = self.ecx();
461457
let def = ecx.tcx.lookup_adt_def(struct_def_id);
462458
let variant = def.struct_variant();
@@ -532,9 +528,8 @@ impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
532528

533529
impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
534530
fn encode_info_for_trait_item(&mut self,
535-
trait_def_id: DefId,
536-
item_def_id: DefId,
537-
trait_item: &hir::TraitItem) {
531+
(trait_def_id, item_def_id, trait_item):
532+
(DefId, DefId, &hir::TraitItem)) {
538533
let ecx = self.ecx;
539534
let tcx = ecx.tcx;
540535

@@ -635,9 +630,8 @@ impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
635630
}
636631

637632
fn encode_info_for_impl_item(&mut self,
638-
impl_id: NodeId,
639-
impl_item_def_id: DefId,
640-
ast_item: Option<&hir::ImplItem>) {
633+
(impl_id, impl_item_def_id, ast_item):
634+
(NodeId, DefId, Option<&hir::ImplItem>)) {
641635
match self.ecx.tcx.impl_or_trait_item(impl_item_def_id) {
642636
ty::ConstTraitItem(ref associated_const) => {
643637
self.encode_info_for_associated_const(&associated_const,
@@ -882,8 +876,7 @@ fn encode_xrefs<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
882876

883877
impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
884878
fn encode_info_for_item(&mut self,
885-
def_id: DefId,
886-
item: &hir::Item) {
879+
(def_id, item): (DefId, &hir::Item)) {
887880
let ecx = self.ecx();
888881
let tcx = ecx.tcx;
889882

@@ -943,11 +936,7 @@ impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
943936
self.encode_method_argument_names(&decl);
944937
}
945938
hir::ItemMod(ref m) => {
946-
self.encode_info_for_mod(m,
947-
&item.attrs,
948-
item.id,
949-
item.name,
950-
&item.vis);
939+
self.encode_info_for_mod((m, &item.attrs, item.id, item.name, &item.vis));
951940
}
952941
hir::ItemForeignMod(ref fm) => {
953942
encode_def_id_and_key(ecx, self.rbml_w, def_id);
@@ -1210,9 +1199,9 @@ impl<'a, 'tcx, 'encoder> IndexBuilder<'a, 'tcx, 'encoder> {
12101199
// there is a value for structs like `struct
12111200
// Foo()` and `struct Foo`
12121201
let ctor_def_id = ecx.tcx.map.local_def_id(struct_node_id);
1213-
self.record(ctor_def_id, |this| this.encode_struct_ctor(def_id,
1214-
item.id,
1215-
struct_node_id));
1202+
self.record(ctor_def_id,
1203+
ItemContentBuilder::encode_struct_ctor,
1204+
(def_id, item.id, struct_node_id));
12161205
}
12171206
}
12181207
}
@@ -1238,9 +1227,9 @@ impl<'a, 'tcx, 'encoder> IndexBuilder<'a, 'tcx, 'encoder> {
12381227
};
12391228

12401229
let trait_item_def_id = trait_item_def_id.def_id();
1241-
self.record(trait_item_def_id, |this| {
1242-
this.encode_info_for_impl_item(impl_id, trait_item_def_id, ast_item)
1243-
});
1230+
self.record(trait_item_def_id,
1231+
ItemContentBuilder::encode_info_for_impl_item,
1232+
(impl_id, trait_item_def_id, ast_item));
12441233
}
12451234
}
12461235

@@ -1253,17 +1242,16 @@ impl<'a, 'tcx, 'encoder> IndexBuilder<'a, 'tcx, 'encoder> {
12531242
for (item_def_id, trait_item) in r.iter().zip(trait_items) {
12541243
let item_def_id = item_def_id.def_id();
12551244
assert!(item_def_id.is_local());
1256-
self.record(item_def_id, |this| {
1257-
this.encode_info_for_trait_item(def_id, item_def_id, trait_item)
1258-
});
1245+
self.record(item_def_id,
1246+
ItemContentBuilder::encode_info_for_trait_item,
1247+
(def_id, item_def_id, trait_item));
12591248
}
12601249
}
12611250
}
12621251

12631252
impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
12641253
fn encode_info_for_foreign_item(&mut self,
1265-
def_id: DefId,
1266-
nitem: &hir::ForeignItem) {
1254+
(def_id, nitem): (DefId, &hir::ForeignItem)) {
12671255
let ecx = self.ecx();
12681256

12691257
debug!("writing foreign item {}", ecx.tcx.node_path_str(nitem.id));
@@ -1323,14 +1311,18 @@ impl<'a, 'ecx, 'tcx, 'encoder> Visitor<'tcx> for EncodeVisitor<'a, 'ecx, 'tcx, '
13231311
let def_id = self.index.ecx.tcx.map.local_def_id(item.id);
13241312
match item.node {
13251313
hir::ItemExternCrate(_) | hir::ItemUse(_) => (), // ignore these
1326-
_ => self.index.record(def_id, |index| index.encode_info_for_item(def_id, item)),
1314+
_ => self.index.record(def_id,
1315+
ItemContentBuilder::encode_info_for_item,
1316+
(def_id, item)),
13271317
}
13281318
self.index.encode_addl_info_for_item(item);
13291319
}
13301320
fn visit_foreign_item(&mut self, ni: &'tcx hir::ForeignItem) {
13311321
intravisit::walk_foreign_item(self, ni);
13321322
let def_id = self.index.ecx.tcx.map.local_def_id(ni.id);
1333-
self.index.record(def_id, |index| index.encode_info_for_foreign_item(def_id, ni));
1323+
self.index.record(def_id,
1324+
ItemContentBuilder::encode_info_for_foreign_item,
1325+
(def_id, ni));
13341326
}
13351327
fn visit_ty(&mut self, ty: &'tcx hir::Ty) {
13361328
intravisit::walk_ty(self, ty);
@@ -1343,11 +1335,9 @@ impl<'a, 'tcx, 'encoder> IndexBuilder<'a, 'tcx, 'encoder> {
13431335
let ecx = self.ecx();
13441336
if let hir::TyImplTrait(_) = ty.node {
13451337
let def_id = ecx.tcx.map.local_def_id(ty.id);
1346-
self.record(def_id, |this| {
1347-
encode_def_id_and_key(ecx, this.rbml_w, def_id);
1348-
encode_family(this.rbml_w, 'y');
1349-
this.encode_bounds_and_type_for_item(ty.id);
1350-
});
1338+
self.record(def_id,
1339+
ItemContentBuilder::encode_info_for_anon_ty,
1340+
(def_id, ty.id));
13511341
}
13521342
}
13531343

@@ -1357,16 +1347,24 @@ impl<'a, 'tcx, 'encoder> IndexBuilder<'a, 'tcx, 'encoder> {
13571347
match expr.node {
13581348
hir::ExprClosure(..) => {
13591349
let def_id = ecx.tcx.map.local_def_id(expr.id);
1360-
1361-
self.record(def_id, |this| this.encode_info_for_closure(def_id, expr.id));
1350+
self.record(def_id,
1351+
ItemContentBuilder::encode_info_for_closure,
1352+
(def_id, expr.id));
13621353
}
13631354
_ => { }
13641355
}
13651356
}
13661357
}
13671358

13681359
impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
1369-
fn encode_info_for_closure(&mut self, def_id: DefId, expr_id: NodeId) {
1360+
fn encode_info_for_anon_ty(&mut self, (def_id, ty_id): (DefId, NodeId)) {
1361+
let ecx = self.ecx;
1362+
encode_def_id_and_key(ecx, self.rbml_w, def_id);
1363+
encode_family(self.rbml_w, 'y');
1364+
self.encode_bounds_and_type_for_item(ty_id);
1365+
}
1366+
1367+
fn encode_info_for_closure(&mut self, (def_id, expr_id): (DefId, NodeId)) {
13701368
let ecx = self.ecx;
13711369
encode_def_id_and_key(ecx, self.rbml_w, def_id);
13721370
encode_name(self.rbml_w, syntax::parse::token::intern("<closure>"));
@@ -1395,13 +1393,13 @@ fn encode_info_for_items<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
13951393

13961394
let fields = {
13971395
let mut index = IndexBuilder::new(ecx, rbml_w);
1398-
index.record(DefId::local(CRATE_DEF_INDEX), |this| {
1399-
this.encode_info_for_mod(&krate.module,
1400-
&[],
1401-
CRATE_NODE_ID,
1402-
syntax::parse::token::intern(&ecx.link_meta.crate_name),
1403-
&hir::Public);
1404-
});
1396+
index.record(DefId::local(CRATE_DEF_INDEX),
1397+
ItemContentBuilder::encode_info_for_mod,
1398+
(&krate.module,
1399+
&[],
1400+
CRATE_NODE_ID,
1401+
syntax::parse::token::intern(&ecx.link_meta.crate_name),
1402+
&hir::Public));
14051403
krate.visit_all_items(&mut EncodeVisitor {
14061404
index: &mut index,
14071405
});

src/librustc_metadata/index_builder.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,16 @@ impl<'a, 'tcx, 'encoder> IndexBuilder<'a, 'tcx, 'encoder> {
5757
///
5858
/// Returns a dep-graph task that you should keep live as long as
5959
/// the data for this item is being emitted.
60-
pub fn record<OP>(&mut self, id: DefId, op: OP)
61-
where OP: FnOnce(&mut ItemContentBuilder<'a, 'tcx, 'encoder>)
60+
pub fn record<DATA>(&mut self,
61+
id: DefId,
62+
op: fn(&mut ItemContentBuilder<'a, 'tcx, 'encoder>, DATA),
63+
data: DATA)
6264
{
6365
let position = self.rbml_w.mark_stable_position();
6466
self.items.record(id, position);
6567
let _task = self.ecx.tcx.dep_graph.in_task(DepNode::MetaData(id));
6668
self.rbml_w.start_tag(tag_items_data_item).unwrap();
67-
op(self);
69+
op(self, data);
6870
self.rbml_w.end_tag().unwrap();
6971
}
7072

0 commit comments

Comments
 (0)