Skip to content

Commit e9382ef

Browse files
committedJun 28, 2012
Have #fmt use str::concat to build up the string instead of using binary +. Closes #2746.
1 parent b2b4981 commit e9382ef

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed
 

‎src/libsyntax/ext/build.rs

+4
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ fn mk_uniq_vec_e(cx: ext_ctxt, sp: span, exprs: [@ast::expr]/~) ->
7272
@ast::expr {
7373
mk_vstore_e(cx, sp, mk_vec_e(cx, sp, exprs), ast::vstore_uniq)
7474
}
75+
fn mk_fixed_vec_e(cx: ext_ctxt, sp: span, exprs: [@ast::expr]/~) ->
76+
@ast::expr {
77+
mk_vstore_e(cx, sp, mk_vec_e(cx, sp, exprs), ast::vstore_fixed(none))
78+
}
7579

7680
fn mk_rec_e(cx: ext_ctxt, sp: span,
7781
fields: [{ident: ast::ident, ex: @ast::expr}]/~) ->

‎src/libsyntax/ext/fmt.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span,
117117
let args = [cnv_expr, arg]/~;
118118
ret mk_call(cx, arg.span, path, args);
119119
}
120+
120121
fn make_new_conv(cx: ext_ctxt, sp: span, cnv: conv, arg: @ast::expr) ->
121122
@ast::expr {
122123
// FIXME: Move validation code into core::extfmt (Issue #2249)
@@ -243,13 +244,12 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span,
243244
}
244245
let fmt_sp = args[0].span;
245246
let mut n = 0u;
246-
let mut tmp_expr = mk_str(cx, sp, "");
247-
let nargs = vec::len::<@ast::expr>(args);
247+
let mut piece_exprs = []/~;
248+
let nargs = args.len();
248249
for pieces.each {|pc|
249250
alt pc {
250251
piece_string(s) {
251-
let s_expr = mk_str(cx, fmt_sp, s);
252-
tmp_expr = mk_binary(cx, fmt_sp, ast::add, tmp_expr, s_expr);
252+
vec::push(piece_exprs, mk_str(cx, fmt_sp, s));
253253
}
254254
piece_conv(conv) {
255255
n += 1u;
@@ -262,7 +262,7 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span,
262262
log_conv(conv);
263263
let arg_expr = args[n];
264264
let c_expr = make_new_conv(cx, fmt_sp, conv, arg_expr);
265-
tmp_expr = mk_binary(cx, fmt_sp, ast::add, tmp_expr, c_expr);
265+
vec::push(piece_exprs, c_expr);
266266
}
267267
}
268268
}
@@ -273,7 +273,9 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span,
273273
(sp, #fmt["too many arguments to #fmt. found %u, expected %u",
274274
nargs, expected_nargs]);
275275
}
276-
ret tmp_expr;
276+
277+
let arg_vec = mk_fixed_vec_e(cx, fmt_sp, piece_exprs);
278+
ret mk_call(cx, fmt_sp, [@"str", @"concat"]/~, [arg_vec]/~);
277279
}
278280
//
279281
// Local Variables:

0 commit comments

Comments
 (0)
Please sign in to comment.