@@ -39,6 +39,7 @@ use syntax::attr::AttrMetaMethods;
3939use syntax:: diagnostic:: span_handler;
4040use syntax:: parse:: token:: special_idents;
4141use syntax:: ast_util;
42+ use syntax:: visit:: Visitor ;
4243use syntax:: visit;
4344use syntax:: parse:: token;
4445use syntax;
@@ -72,6 +73,7 @@ struct Stats {
7273 dep_bytes : uint ,
7374 lang_item_bytes : uint ,
7475 link_args_bytes : uint ,
76+ impl_bytes : uint ,
7577 misc_bytes : uint ,
7678 item_bytes : uint ,
7779 index_bytes : uint ,
@@ -1221,7 +1223,10 @@ struct EncodeVisitor {
12211223}
12221224
12231225impl visit:: Visitor < ( ) > for EncodeVisitor {
1224- fn visit_expr ( & mut self , ex: @expr, _: ( ) ) { my_visit_expr ( ex) ; }
1226+ fn visit_expr ( & mut self , ex: @expr, _: ( ) ) {
1227+ visit:: walk_expr ( self , ex, ( ) ) ;
1228+ my_visit_expr ( ex) ;
1229+ }
12251230 fn visit_item ( & mut self , i: @item, _: ( ) ) {
12261231 visit:: walk_item ( self , i, ( ) ) ;
12271232 my_visit_item ( i,
@@ -1510,6 +1515,41 @@ fn encode_link_args(ecx: &EncodeContext, ebml_w: &mut writer::Encoder) {
15101515 ebml_w. end_tag ( ) ;
15111516}
15121517
1518+ struct ImplVisitor < ' self > {
1519+ ecx : & ' self EncodeContext < ' self > ,
1520+ ebml_w : & ' self mut writer:: Encoder ,
1521+ }
1522+
1523+ impl < ' self > Visitor < ( ) > for ImplVisitor < ' self > {
1524+ fn visit_item ( & mut self , item : @item, _: ( ) ) {
1525+ match item. node {
1526+ item_impl( * ) => {
1527+ self . ebml_w . start_tag ( tag_impls_impl) ;
1528+ encode_def_id ( self . ebml_w , local_def ( item. id ) ) ;
1529+ self . ebml_w . end_tag ( ) ;
1530+ }
1531+ _ => { }
1532+ }
1533+ visit:: walk_item ( self , item, ( ) ) ;
1534+ }
1535+ }
1536+
1537+ fn encode_impls ( ecx : & EncodeContext ,
1538+ crate : & Crate ,
1539+ ebml_w : & mut writer:: Encoder ) {
1540+ ebml_w. start_tag ( tag_impls) ;
1541+
1542+ {
1543+ let mut visitor = ImplVisitor {
1544+ ecx : ecx,
1545+ ebml_w : ebml_w,
1546+ } ;
1547+ visit:: walk_crate ( & mut visitor, crate , ( ) ) ;
1548+ }
1549+
1550+ ebml_w. end_tag ( ) ;
1551+ }
1552+
15131553fn encode_misc_info ( ecx : & EncodeContext ,
15141554 crate : & Crate ,
15151555 ebml_w : & mut writer:: Encoder ) {
@@ -1574,6 +1614,7 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] {
15741614 dep_bytes : 0 ,
15751615 lang_item_bytes : 0 ,
15761616 link_args_bytes : 0 ,
1617+ impl_bytes : 0 ,
15771618 misc_bytes : 0 ,
15781619 item_bytes : 0 ,
15791620 index_bytes : 0 ,
@@ -1632,6 +1673,11 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] {
16321673 encode_link_args ( & ecx, & mut ebml_w) ;
16331674 ecx. stats . link_args_bytes = * wr. pos - i;
16341675
1676+ // Encode the def IDs of impls, for coherence checking.
1677+ i = * wr. pos ;
1678+ encode_impls ( & ecx, crate , & mut ebml_w) ;
1679+ ecx. stats . impl_bytes = * wr. pos - i;
1680+
16351681 // Encode miscellaneous info.
16361682 i = * wr. pos ;
16371683 encode_misc_info ( & ecx, crate , & mut ebml_w) ;
@@ -1664,6 +1710,7 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] {
16641710 printfln ! ( " dep bytes: %u" , ecx. stats. dep_bytes) ;
16651711 printfln ! ( " lang item bytes: %u" , ecx. stats. lang_item_bytes) ;
16661712 printfln ! ( " link args bytes: %u" , ecx. stats. link_args_bytes) ;
1713+ printfln ! ( " impl bytes: %u" , ecx. stats. impl_bytes) ;
16671714 printfln ! ( " misc bytes: %u" , ecx. stats. misc_bytes) ;
16681715 printfln ! ( " item bytes: %u" , ecx. stats. item_bytes) ;
16691716 printfln ! ( " index bytes: %u" , ecx. stats. index_bytes) ;
0 commit comments