@@ -39,7 +39,8 @@ use syntax::attr;
39
39
use syntax:: attr:: AttrMetaMethods ;
40
40
use syntax:: diagnostic:: span_handler;
41
41
use syntax:: parse:: token:: special_idents;
42
- use syntax:: { ast_util, oldvisit} ;
42
+ use syntax:: ast_util;
43
+ use syntax:: visit;
43
44
use syntax:: parse:: token;
44
45
use syntax;
45
46
use writer = extra:: ebml:: writer;
@@ -1184,6 +1185,74 @@ fn encode_info_for_foreign_item(ecx: &EncodeContext,
1184
1185
ebml_w. end_tag ( ) ;
1185
1186
}
1186
1187
1188
+ fn my_visit_expr ( _e: @expr) { }
1189
+
1190
+ fn my_visit_item ( i : @item, items : ast_map:: map , ebml_w : & writer:: Encoder ,
1191
+ ecx_ptr : * int , index : @mut ~[ entry < i64 > ] ) {
1192
+ match items. get_copy ( & i. id ) {
1193
+ ast_map:: node_item( _, pt) => {
1194
+ let mut ebml_w = ebml_w. clone ( ) ;
1195
+ // See above
1196
+ let ecx : & EncodeContext = unsafe { cast:: transmute ( ecx_ptr) } ;
1197
+ encode_info_for_item ( ecx, & mut ebml_w, i, index, * pt) ;
1198
+ }
1199
+ _ => fail ! ( "bad item" )
1200
+ }
1201
+ }
1202
+
1203
+ fn my_visit_foreign_item ( ni : @foreign_item , items : ast_map:: map , ebml_w : & writer:: Encoder ,
1204
+ ecx_ptr : * int , index : @mut ~[ entry < i64 > ] ) {
1205
+ match items. get_copy ( & ni. id ) {
1206
+ ast_map:: node_foreign_item( _, abi, _, pt) => {
1207
+ debug ! ( "writing foreign item %s::%s" ,
1208
+ ast_map:: path_to_str(
1209
+ * pt,
1210
+ token:: get_ident_interner( ) ) ,
1211
+ token:: ident_to_str( & ni. ident) ) ;
1212
+
1213
+ let mut ebml_w = ebml_w. clone ( ) ;
1214
+ // See above
1215
+ let ecx : & EncodeContext = unsafe { cast:: transmute ( ecx_ptr) } ;
1216
+ encode_info_for_foreign_item ( ecx,
1217
+ & mut ebml_w,
1218
+ ni,
1219
+ index,
1220
+ pt,
1221
+ abi) ;
1222
+ }
1223
+ // case for separate item and foreign-item tables
1224
+ _ => fail ! ( "bad foreign item" )
1225
+ }
1226
+ }
1227
+
1228
+ struct EncodeVisitor {
1229
+ ebml_w_for_visit_item : writer:: Encoder ,
1230
+ ebml_w_for_visit_foreign_item : writer:: Encoder ,
1231
+ ecx_ptr : * int ,
1232
+ items : ast_map:: map ,
1233
+ index : @mut ~[ entry < i64 > ] ,
1234
+ }
1235
+
1236
+ impl visit:: Visitor < ( ) > for EncodeVisitor {
1237
+ fn visit_expr ( & mut self , ex: @expr, _: ( ) ) { my_visit_expr ( ex) ; }
1238
+ fn visit_item ( & mut self , i: @item, _: ( ) ) {
1239
+ visit:: walk_item ( self , i, ( ) ) ;
1240
+ my_visit_item ( i,
1241
+ self . items ,
1242
+ & self . ebml_w_for_visit_item ,
1243
+ self . ecx_ptr ,
1244
+ self . index ) ;
1245
+ }
1246
+ fn visit_foreign_item ( & mut self , ni : @foreign_item , _: ( ) ) {
1247
+ visit:: walk_foreign_item ( self , ni, ( ) ) ;
1248
+ my_visit_foreign_item ( ni,
1249
+ self . items ,
1250
+ & self . ebml_w_for_visit_foreign_item ,
1251
+ self . ecx_ptr ,
1252
+ self . index ) ;
1253
+ }
1254
+ }
1255
+
1187
1256
fn encode_info_for_items ( ecx : & EncodeContext ,
1188
1257
ebml_w : & mut writer:: Encoder ,
1189
1258
crate : & Crate )
@@ -1201,54 +1270,17 @@ fn encode_info_for_items(ecx: &EncodeContext,
1201
1270
let items = ecx. tcx . items ;
1202
1271
1203
1272
// See comment in `encode_side_tables_for_ii` in astencode
1204
- let ecx_ptr : * ( ) = unsafe { cast:: transmute ( ecx) } ;
1205
-
1206
- oldvisit:: visit_crate ( crate , ( ( ) , oldvisit:: mk_vt ( @oldvisit:: Visitor {
1207
- visit_expr : |_e, ( _cx, _v) | { } ,
1208
- visit_item : {
1209
- let ebml_w = ( * ebml_w) . clone ( ) ;
1210
- |i, ( cx, v) | {
1211
- oldvisit:: visit_item ( i, ( cx, v) ) ;
1212
- match items. get_copy ( & i. id ) {
1213
- ast_map:: node_item( _, pt) => {
1214
- let mut ebml_w = ebml_w. clone ( ) ;
1215
- // See above
1216
- let ecx : & EncodeContext = unsafe { cast:: transmute ( ecx_ptr) } ;
1217
- encode_info_for_item ( ecx, & mut ebml_w, i, index, * pt) ;
1218
- }
1219
- _ => fail ! ( "bad item" )
1220
- }
1221
- }
1222
- } ,
1223
- visit_foreign_item : {
1224
- let ebml_w = ( * ebml_w) . clone ( ) ;
1225
- |ni, ( cx, v) | {
1226
- oldvisit:: visit_foreign_item ( ni, ( cx, v) ) ;
1227
- match items. get_copy ( & ni. id ) {
1228
- ast_map:: node_foreign_item( _, abi, _, pt) => {
1229
- debug ! ( "writing foreign item %s::%s" ,
1230
- ast_map:: path_to_str(
1231
- * pt,
1232
- token:: get_ident_interner( ) ) ,
1233
- token:: ident_to_str( & ni. ident) ) ;
1234
-
1235
- let mut ebml_w = ebml_w. clone ( ) ;
1236
- // See above
1237
- let ecx : & EncodeContext = unsafe { cast:: transmute ( ecx_ptr) } ;
1238
- encode_info_for_foreign_item ( ecx,
1239
- & mut ebml_w,
1240
- ni,
1241
- index,
1242
- pt,
1243
- abi) ;
1244
- }
1245
- // case for separate item and foreign-item tables
1246
- _ => fail ! ( "bad foreign item" )
1247
- }
1248
- }
1249
- } ,
1250
- ..* oldvisit:: default_visitor ( )
1251
- } ) ) ) ;
1273
+ let ecx_ptr : * int = unsafe { cast:: transmute ( ecx) } ;
1274
+ let mut visitor = EncodeVisitor {
1275
+ index : index,
1276
+ items : items,
1277
+ ecx_ptr : ecx_ptr,
1278
+ ebml_w_for_visit_item : ( * ebml_w) . clone ( ) ,
1279
+ ebml_w_for_visit_foreign_item : ( * ebml_w) . clone ( ) ,
1280
+ } ;
1281
+
1282
+ visit:: walk_crate ( & mut visitor, crate , ( ) ) ;
1283
+
1252
1284
ebml_w. end_tag ( ) ;
1253
1285
return /*bad*/ ( * index) . clone ( ) ;
1254
1286
}
0 commit comments