@@ -15,6 +15,7 @@ use middle::ty;
15
15
use middle:: typeck;
16
16
use util:: ppaux;
17
17
18
+ use std:: cell:: RefCell ;
18
19
use syntax:: ast:: * ;
19
20
use syntax:: codemap;
20
21
use syntax:: { ast_util, ast_map} ;
@@ -215,7 +216,7 @@ struct env {
215
216
sess : Session ,
216
217
ast_map : ast_map:: map ,
217
218
def_map : resolve:: DefMap ,
218
- idstack : @mut ~[ NodeId ]
219
+ idstack : @RefCell < ~[ NodeId ] > ,
219
220
}
220
221
221
222
struct CheckItemRecursionVisitor {
@@ -233,7 +234,7 @@ pub fn check_item_recursion(sess: Session,
233
234
sess : sess,
234
235
ast_map : ast_map,
235
236
def_map : def_map,
236
- idstack : @mut ~[ ]
237
+ idstack : @RefCell :: new ( ~[ ] ) ,
237
238
} ;
238
239
239
240
let mut visitor = CheckItemRecursionVisitor { env : env } ;
@@ -242,12 +243,19 @@ pub fn check_item_recursion(sess: Session,
242
243
243
244
impl Visitor < ( ) > for CheckItemRecursionVisitor {
244
245
fn visit_item ( & mut self , it : @item, _: ( ) ) {
245
- if self . env . idstack . iter ( ) . any ( |x| x == & ( it. id ) ) {
246
- self . env . sess . span_fatal ( self . env . root_it . span , "recursive constant" ) ;
246
+ {
247
+ let mut idstack = self . env . idstack . borrow_mut ( ) ;
248
+ if idstack. get ( ) . iter ( ) . any ( |x| x == & ( it. id ) ) {
249
+ self . env . sess . span_fatal ( self . env . root_it . span ,
250
+ "recursive constant" ) ;
251
+ }
252
+ idstack. get ( ) . push ( it. id ) ;
247
253
}
248
- self . env . idstack . push ( it. id ) ;
249
254
visit:: walk_item ( self , it, ( ) ) ;
250
- self . env . idstack . pop ( ) ;
255
+ {
256
+ let mut idstack = self . env . idstack . borrow_mut ( ) ;
257
+ idstack. get ( ) . pop ( ) ;
258
+ }
251
259
}
252
260
253
261
fn visit_expr ( & mut self , e : @Expr , _: ( ) ) {
0 commit comments