@@ -36,7 +36,7 @@ pub struct TtReader {
36
36
stack : @mut TtFrame ,
37
37
/* for MBE-style macro transcription */
38
38
priv interpolations : RefCell < HashMap < Ident , @named_match > > ,
39
- repeat_idx : ~[ uint ] ,
39
+ priv repeat_idx : RefCell < ~[ uint ] > ,
40
40
repeat_len : ~[ uint ] ,
41
41
/* cached: */
42
42
cur_tok : Token ,
@@ -63,7 +63,7 @@ pub fn new_tt_reader(sp_diag: @mut SpanHandler,
63
63
None => RefCell :: new ( HashMap :: new ( ) ) ,
64
64
Some ( x) => RefCell :: new ( x) ,
65
65
} ,
66
- repeat_idx : ~[ ] ,
66
+ repeat_idx : RefCell :: new ( ~[ ] ) ,
67
67
repeat_len : ~[ ] ,
68
68
/* dummy values, never read: */
69
69
cur_tok : EOF ,
@@ -111,7 +111,8 @@ fn lookup_cur_matched_by_matched(r: &mut TtReader,
111
111
matched_seq( ref ads, _) => ads[ * idx]
112
112
}
113
113
}
114
- r. repeat_idx . iter ( ) . fold ( start, red)
114
+ let repeat_idx = r. repeat_idx . borrow ( ) ;
115
+ repeat_idx. get ( ) . iter ( ) . fold ( start, red)
115
116
}
116
117
117
118
fn lookup_cur_matched ( r : & mut TtReader , name : Ident ) -> @named_match {
@@ -186,8 +187,10 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
186
187
}
187
188
188
189
/* done with this set; pop or repeat? */
189
- if ! r. stack . dotdotdoted
190
- || { * r. repeat_idx . last ( ) == * r. repeat_len . last ( ) - 1 } {
190
+ if ! r. stack . dotdotdoted || {
191
+ let repeat_idx = r. repeat_idx . borrow ( ) ;
192
+ * repeat_idx. get ( ) . last ( ) == * r. repeat_len . last ( ) - 1
193
+ } {
191
194
192
195
match r. stack . up {
193
196
None => {
@@ -196,8 +199,11 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
196
199
}
197
200
Some ( tt_f) => {
198
201
if r. stack . dotdotdoted {
199
- r. repeat_idx . pop ( ) ;
200
- r. repeat_len . pop ( ) ;
202
+ {
203
+ let mut repeat_idx = r. repeat_idx . borrow_mut ( ) ;
204
+ repeat_idx. get ( ) . pop ( ) ;
205
+ r. repeat_len . pop ( ) ;
206
+ }
201
207
}
202
208
203
209
r. stack = tt_f;
@@ -207,7 +213,10 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
207
213
208
214
} else { /* repeat */
209
215
r. stack . idx = 0 u;
210
- r. repeat_idx [ r. repeat_idx . len ( ) - 1 u] += 1 u;
216
+ {
217
+ let mut repeat_idx = r. repeat_idx . borrow_mut ( ) ;
218
+ repeat_idx. get ( ) [ repeat_idx. get ( ) . len ( ) - 1 u] += 1 u;
219
+ }
211
220
match r. stack . sep . clone ( ) {
212
221
Some ( tk) => {
213
222
r. cur_tok = tk; /* repeat same span, I guess */
@@ -264,15 +273,18 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
264
273
r. stack . idx += 1 u;
265
274
return tt_next_token ( r) ;
266
275
} else {
267
- r. repeat_len . push ( len) ;
268
- r. repeat_idx . push ( 0 u) ;
269
- r. stack = @mut TtFrame {
270
- forest : tts,
271
- idx : 0 u,
272
- dotdotdoted : true ,
273
- sep : sep,
274
- up : Some ( r. stack )
275
- } ;
276
+ {
277
+ let mut repeat_idx = r. repeat_idx . borrow_mut ( ) ;
278
+ r. repeat_len . push ( len) ;
279
+ repeat_idx. get ( ) . push ( 0 u) ;
280
+ r. stack = @mut TtFrame {
281
+ forest : tts,
282
+ idx : 0 u,
283
+ dotdotdoted : true ,
284
+ sep : sep,
285
+ up : Some ( r. stack )
286
+ } ;
287
+ }
276
288
}
277
289
}
278
290
}
0 commit comments