Skip to content

Commit 6f4bde9

Browse files
committed
librustc: Stop calling each_path in coherence.
10% win or so for small crates.
1 parent 526c387 commit 6f4bde9

File tree

7 files changed

+77
-18
lines changed

7 files changed

+77
-18
lines changed

src/librustc/metadata/common.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ pub static tag_misc_info_crate_items: uint = 0x80;
182182
pub static tag_item_method_provided_source: uint = 0x81;
183183
pub static tag_item_impl_vtables: uint = 0x82;
184184

185+
pub static tag_impls: uint = 0x83;
186+
pub static tag_impls_impl: uint = 0x84;
187+
185188
pub struct LinkMeta {
186189
name: @str,
187190
vers: @str,

src/librustc/metadata/csearch.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,3 +246,11 @@ pub fn get_link_args_for_crate(cstore: @mut cstore::CStore,
246246
let cdata = cstore::get_crate_data(cstore, crate_num);
247247
decoder::get_link_args_for_crate(cdata)
248248
}
249+
250+
pub fn each_impl(cstore: @mut cstore::CStore,
251+
crate_num: ast::CrateNum,
252+
callback: &fn(ast::def_id)) {
253+
let cdata = cstore::get_crate_data(cstore, crate_num);
254+
decoder::each_impl(cdata, callback)
255+
}
256+

src/librustc/metadata/decoder.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,3 +1298,13 @@ pub fn get_link_args_for_crate(cdata: cmd) -> ~[~str] {
12981298
};
12991299
result
13001300
}
1301+
1302+
pub fn each_impl(cdata: cmd, callback: &fn(ast::def_id)) {
1303+
let impls_doc = reader::get_doc(reader::Doc(cdata.data), tag_impls);
1304+
let _ = do reader::tagged_docs(impls_doc, tag_impls_impl) |impl_doc| {
1305+
callback(item_def_id(impl_doc, cdata));
1306+
true
1307+
};
1308+
}
1309+
1310+

src/librustc/metadata/encoder.rs

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use syntax::attr::AttrMetaMethods;
4040
use syntax::diagnostic::span_handler;
4141
use syntax::parse::token::special_idents;
4242
use syntax::ast_util;
43+
use syntax::visit::Visitor;
4344
use syntax::visit;
4445
use syntax::parse::token;
4546
use syntax;
@@ -73,6 +74,7 @@ struct Stats {
7374
dep_bytes: uint,
7475
lang_item_bytes: uint,
7576
link_args_bytes: uint,
77+
impl_bytes: uint,
7678
misc_bytes: uint,
7779
item_bytes: uint,
7880
index_bytes: uint,
@@ -1228,7 +1230,10 @@ struct EncodeVisitor {
12281230
}
12291231

12301232
impl visit::Visitor<()> for EncodeVisitor {
1231-
fn visit_expr(&mut self, ex:@expr, _:()) { my_visit_expr(ex); }
1233+
fn visit_expr(&mut self, ex:@expr, _:()) {
1234+
visit::walk_expr(self, ex, ());
1235+
my_visit_expr(ex);
1236+
}
12321237
fn visit_item(&mut self, i:@item, _:()) {
12331238
visit::walk_item(self, i, ());
12341239
my_visit_item(i,
@@ -1517,6 +1522,41 @@ fn encode_link_args(ecx: &EncodeContext, ebml_w: &mut writer::Encoder) {
15171522
ebml_w.end_tag();
15181523
}
15191524

1525+
struct ImplVisitor<'self> {
1526+
ecx: &'self EncodeContext<'self>,
1527+
ebml_w: &'self mut writer::Encoder,
1528+
}
1529+
1530+
impl<'self> Visitor<()> for ImplVisitor<'self> {
1531+
fn visit_item(&mut self, item: @item, _: ()) {
1532+
match item.node {
1533+
item_impl(*) => {
1534+
self.ebml_w.start_tag(tag_impls_impl);
1535+
encode_def_id(self.ebml_w, local_def(item.id));
1536+
self.ebml_w.end_tag();
1537+
}
1538+
_ => {}
1539+
}
1540+
visit::walk_item(self, item, ());
1541+
}
1542+
}
1543+
1544+
fn encode_impls(ecx: &EncodeContext,
1545+
crate: &Crate,
1546+
ebml_w: &mut writer::Encoder) {
1547+
ebml_w.start_tag(tag_impls);
1548+
1549+
{
1550+
let mut visitor = ImplVisitor {
1551+
ecx: ecx,
1552+
ebml_w: ebml_w,
1553+
};
1554+
visit::walk_crate(&mut visitor, crate, ());
1555+
}
1556+
1557+
ebml_w.end_tag();
1558+
}
1559+
15201560
fn encode_misc_info(ecx: &EncodeContext,
15211561
crate: &Crate,
15221562
ebml_w: &mut writer::Encoder) {
@@ -1581,6 +1621,7 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] {
15811621
dep_bytes: 0,
15821622
lang_item_bytes: 0,
15831623
link_args_bytes: 0,
1624+
impl_bytes: 0,
15841625
misc_bytes: 0,
15851626
item_bytes: 0,
15861627
index_bytes: 0,
@@ -1639,6 +1680,11 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] {
16391680
encode_link_args(&ecx, &mut ebml_w);
16401681
ecx.stats.link_args_bytes = *wr.pos - i;
16411682

1683+
// Encode the def IDs of impls, for coherence checking.
1684+
i = *wr.pos;
1685+
encode_impls(&ecx, crate, &mut ebml_w);
1686+
ecx.stats.impl_bytes = *wr.pos - i;
1687+
16421688
// Encode miscellaneous info.
16431689
i = *wr.pos;
16441690
encode_misc_info(&ecx, crate, &mut ebml_w);
@@ -1671,6 +1717,7 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] {
16711717
printfln!(" dep bytes: %u", ecx.stats.dep_bytes);
16721718
printfln!(" lang item bytes: %u", ecx.stats.lang_item_bytes);
16731719
printfln!(" link args bytes: %u", ecx.stats.link_args_bytes);
1720+
printfln!(" impl bytes: %u", ecx.stats.impl_bytes);
16741721
printfln!(" misc bytes: %u", ecx.stats.misc_bytes);
16751722
printfln!(" item bytes: %u", ecx.stats.item_bytes);
16761723
printfln!(" index bytes: %u", ecx.stats.index_bytes);

src/librustc/middle/typeck/coherence.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@
1515
// each trait in the system to its implementations.
1616

1717

18-
use metadata::csearch::{each_path, get_impl_trait};
18+
use metadata::csearch::{each_impl, get_impl_trait};
1919
use metadata::csearch;
2020
use metadata::cstore::iter_crate_data;
21-
use metadata::decoder::{dl_def, dl_field, dl_impl};
2221
use middle::ty::get;
2322
use middle::ty::{lookup_item_type, subst};
2423
use middle::ty::{substs, t, ty_bool, ty_bot, ty_box, ty_enum, ty_err};
@@ -680,9 +679,6 @@ impl CoherenceChecker {
680679
let tcx = self.crate_context.tcx;
681680
let implementation = @csearch::get_impl(tcx, impl_def_id);
682681

683-
debug!("coherence: adding impl from external crate: %s",
684-
ty::item_path_str(tcx, implementation.did));
685-
686682
// Make sure we don't visit the same implementation multiple times.
687683
if !impls_seen.insert(implementation.did) {
688684
// Skip this one.
@@ -752,15 +748,10 @@ impl CoherenceChecker {
752748

753749
let crate_store = self.crate_context.tcx.sess.cstore;
754750
do iter_crate_data(crate_store) |crate_number, _crate_metadata| {
755-
do each_path(crate_store, crate_number) |_, def_like, _| {
756-
match def_like {
757-
dl_impl(def_id) => {
758-
self.add_external_impl(&mut impls_seen, def_id)
759-
}
760-
dl_def(_) | dl_field => (), // Skip this.
761-
}
762-
true
763-
};
751+
do each_impl(crate_store, crate_number) |def_id| {
752+
assert_eq!(crate_number, def_id.crate);
753+
self.add_external_impl(&mut impls_seen, def_id)
754+
}
764755
}
765756
}
766757

src/libstd/rt/borrowck.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub struct BorrowRecord {
3838
}
3939

4040
fn try_take_task_borrow_list() -> Option<~[BorrowRecord]> {
41-
do Local::borrow::<Task, Option<~[BorrowRecord]>> |task| {
41+
do Local::borrow |task: &mut Task| {
4242
task.borrow_list.take()
4343
}
4444
}
@@ -50,7 +50,7 @@ fn swap_task_borrow_list(f: &fn(~[BorrowRecord]) -> ~[BorrowRecord]) {
5050
};
5151
let borrows = f(borrows);
5252
let borrows = Cell::new(borrows);
53-
do Local::borrow::<Task, ()> |task| {
53+
do Local::borrow |task: &mut Task| {
5454
task.borrow_list = Some(borrows.take());
5555
}
5656
}

src/libstd/rt/sched.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ impl Scheduler {
535535
let current_task: &mut Task = match sched.cleanup_job {
536536
Some(CleanupJob { task: ref task, _ }) => {
537537
let task_ptr: *~Task = task;
538-
transmute_mut_region(*transmute_mut_unsafe(task))
538+
transmute_mut_region(*transmute_mut_unsafe(task_ptr))
539539
}
540540
None => {
541541
rtabort!("no cleanup job");

0 commit comments

Comments
 (0)