@@ -6,16 +6,17 @@ import ext::base::*;
6
6
import ext:: build:: * ;
7
7
import parse:: parser;
8
8
import parse:: parser:: parse_from_source_str;
9
+ import dvec:: { dvec, extensions} ;
9
10
10
11
import print:: * ;
11
12
import io:: * ;
12
13
13
14
import codemap:: span;
14
15
15
16
type aq_ctxt = @{ lo : uint ,
16
- mut gather : [ { lo : uint , hi : uint ,
17
- e : @ast:: expr ,
18
- constr : str } ] } ;
17
+ gather : dvec < { lo: uint , hi : uint ,
18
+ e : @ast:: expr ,
19
+ constr : str } > } ;
19
20
enum fragment {
20
21
from_expr( @ast:: expr ) ,
21
22
from_ty( @ast:: ty )
@@ -101,20 +102,22 @@ fn gather_anti_quotes<N: qq_helper>(lo: uint, node: N) -> aq_ctxt
101
102
visit_ty : { |node, &&cx, v |
102
103
visit_aq ( node, "from_ty" , cx, v) }
103
104
with * default_visitor ( ) } ;
104
- let cx = @{ lo: lo, mut gather: [ ] } ;
105
+ let cx = @{ lo: lo, gather: dvec ( ) } ;
105
106
node. visit ( cx, mk_vt ( v) ) ;
106
107
// FIXME: Maybe this is an overkill (merge_sort), it might be better
107
108
// to just keep the gather array in sorted order ... (Issue #2250)
108
- cx. gather = std:: sort:: merge_sort ( { |a, b| a. lo < b. lo } , copy cx. gather ) ;
109
+ cx. gather . swap { |v|
110
+ vec:: to_mut ( std:: sort:: merge_sort ( { |a, b| a. lo < b. lo } , v) )
111
+ } ;
109
112
ret cx;
110
113
}
111
114
112
115
fn visit_aq < T : qq_helper > ( node : T , constr : str , & & cx: aq_ctxt , v : vt < aq_ctxt > )
113
116
{
114
117
alt ( node. extract_mac ( ) ) {
115
118
some ( mac_aq ( sp, e) ) {
116
- cx. gather += [ { lo: sp. lo - cx. lo , hi: sp. hi - cx. lo ,
117
- e: e, constr: constr} ] ;
119
+ cx. gather . push ( { lo: sp. lo - cx. lo , hi: sp. hi - cx. lo ,
120
+ e: e, constr: constr} ) ;
118
121
}
119
122
_ { node. visit ( cx, v) ; }
120
123
}
@@ -196,7 +199,7 @@ fn finish<T: qq_helper>
196
199
let qcx = gather_anti_quotes ( sp. lo , node) ;
197
200
let cx = qcx;
198
201
199
- uint:: range ( 1 u, vec :: len ( cx. gather ) ) { |i|
202
+ uint:: range ( 1 u, cx. gather . len ( ) ) { |i|
200
203
assert cx. gather [ i-1 u] . lo < cx. gather [ i] . lo ;
201
204
// ^^ check that the vector is sorted
202
205
assert cx. gather [ i-1 u] . hi <= cx. gather [ i] . lo ;
@@ -207,7 +210,7 @@ fn finish<T: qq_helper>
207
210
enum state { active, skip( uint ) , blank} ;
208
211
let mut state = active;
209
212
let mut i = 0 u, j = 0 u;
210
- let g_len = vec :: len ( cx. gather ) ;
213
+ let g_len = cx. gather . len ( ) ;
211
214
str:: chars_iter ( * str) { |ch|
212
215
if ( j < g_len && i == cx. gather [ j] . lo ) {
213
216
assert ch == '$' ;
@@ -261,7 +264,7 @@ fn finish<T: qq_helper>
261
264
rcall = mk_call ( cx, sp,
262
265
[ "syntax" , "ext" , "qquote" , "replace" ] ,
263
266
[ pcall,
264
- mk_vec_e ( cx, sp, vec :: map ( gather) { |g|
267
+ mk_vec_e ( cx, sp, qcx . gather . map_to_vec { |g|
265
268
mk_call ( cx, sp,
266
269
[ "syntax" , "ext" , "qquote" , g. constr ] ,
267
270
[ g. e ] ) } ) ,
0 commit comments