diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index 13b5d9cbc18a..63a4d3d4043f 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -72,6 +72,10 @@ fn mk_uniq_vec_e(cx: ext_ctxt, sp: span, exprs: [@ast::expr]/~) -> @ast::expr { mk_vstore_e(cx, sp, mk_vec_e(cx, sp, exprs), ast::vstore_uniq) } +fn mk_fixed_vec_e(cx: ext_ctxt, sp: span, exprs: [@ast::expr]/~) -> + @ast::expr { + mk_vstore_e(cx, sp, mk_vec_e(cx, sp, exprs), ast::vstore_fixed(none)) +} fn mk_rec_e(cx: ext_ctxt, sp: span, fields: [{ident: ast::ident, ex: @ast::expr}]/~) -> diff --git a/src/libsyntax/ext/fmt.rs b/src/libsyntax/ext/fmt.rs index c324455e6cc6..09ebc0b79cd6 100644 --- a/src/libsyntax/ext/fmt.rs +++ b/src/libsyntax/ext/fmt.rs @@ -117,6 +117,7 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span, let args = [cnv_expr, arg]/~; ret mk_call(cx, arg.span, path, args); } + fn make_new_conv(cx: ext_ctxt, sp: span, cnv: conv, arg: @ast::expr) -> @ast::expr { // FIXME: Move validation code into core::extfmt (Issue #2249) @@ -243,13 +244,12 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span, } let fmt_sp = args[0].span; let mut n = 0u; - let mut tmp_expr = mk_str(cx, sp, ""); - let nargs = vec::len::<@ast::expr>(args); + let mut piece_exprs = []/~; + let nargs = args.len(); for pieces.each {|pc| alt pc { piece_string(s) { - let s_expr = mk_str(cx, fmt_sp, s); - tmp_expr = mk_binary(cx, fmt_sp, ast::add, tmp_expr, s_expr); + vec::push(piece_exprs, mk_str(cx, fmt_sp, s)); } piece_conv(conv) { n += 1u; @@ -262,7 +262,7 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span, log_conv(conv); let arg_expr = args[n]; let c_expr = make_new_conv(cx, fmt_sp, conv, arg_expr); - tmp_expr = mk_binary(cx, fmt_sp, ast::add, tmp_expr, c_expr); + vec::push(piece_exprs, c_expr); } } } @@ -273,7 +273,9 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span, (sp, #fmt["too many arguments to #fmt. found %u, expected %u", nargs, expected_nargs]); } - ret tmp_expr; + + let arg_vec = mk_fixed_vec_e(cx, fmt_sp, piece_exprs); + ret mk_call(cx, fmt_sp, [@"str", @"concat"]/~, [arg_vec]/~); } // // Local Variables: