@@ -40,6 +40,7 @@ use syntax::attr::AttrMetaMethods;
4040use syntax:: diagnostic:: span_handler;
4141use syntax:: parse:: token:: special_idents;
4242use syntax:: ast_util;
43+ use syntax:: visit:: Visitor ;
4344use syntax:: visit;
4445use syntax:: parse:: token;
4546use 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
12301232impl 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+
15201560fn 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) ;
0 commit comments