Skip to content

Commit 7aa43b2

Browse files
committed
Make fmt use a bitmask instead of a vector of flags. Closes #1993.
1 parent 498b3ff commit 7aa43b2

File tree

3 files changed

+22
-26
lines changed

3 files changed

+22
-26
lines changed

mk/target.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
# the snapshot runtime (resp. corelib) rather than the runtime
1010
# (resp. corelib) from the working directory.
1111
USE_SNAPSHOT_RUNTIME=0
12-
USE_SNAPSHOT_CORELIB=0
12+
USE_SNAPSHOT_CORELIB=1
1313
USE_SNAPSHOT_STDLIB=0
1414

1515
define TARGET_STAGE_N

src/libcore/extfmt.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -264,19 +264,17 @@ mod ct {
264264
// conditions can be evaluated at compile-time. For now though it's cleaner to
265265
// implement it 0this way, I think.
266266
mod rt {
267-
enum flag {
268-
flag_left_justify,
269-
flag_left_zero_pad,
270-
flag_space_for_sign,
271-
flag_sign_always,
272-
flag_alternate,
273-
}
267+
const flag_none : u32 = 0u32;
268+
const flag_left_justify : u32 = 0b00000000000000000000000000000001u32;
269+
const flag_left_zero_pad : u32 = 0b00000000000000000000000000000010u32;
270+
const flag_space_for_sign : u32 = 0b00000000000000000000000000000100u32;
271+
const flag_sign_always : u32 = 0b00000000000000000000000000001000u32;
272+
const flag_alternate : u32 = 0b00000000000000000000000000010000u32;
273+
274274
enum count { count_is(int), count_implied, }
275275
enum ty { ty_default, ty_bits, ty_hex_upper, ty_hex_lower, ty_octal, }
276276

277-
// FIXME (#1993): May not want to use a vector here for flags; instead
278-
// just use a bool per flag.
279-
type conv = {flags: [flag]/~, width: count, precision: count, ty: ty};
277+
type conv = {flags: u32, width: count, precision: count, ty: ty};
280278

281279
fn conv_int(cv: conv, i: int) -> str {
282280
let radix = 10u;
@@ -307,7 +305,6 @@ mod rt {
307305
let s = if b { "true" } else { "false" };
308306
// run the boolean conversion through the string conversion logic,
309307
// giving it the same rules for precision, etc.
310-
311308
ret conv_str(cv, s);
312309
}
313310
fn conv_char(cv: conv, c: char) -> str {
@@ -430,9 +427,8 @@ mod rt {
430427
}
431428
ret padstr + s;
432429
}
433-
fn have_flag(flags: [flag]/~, f: flag) -> bool {
434-
for vec::each(flags) {|candidate| if candidate == f { ret true; } }
435-
ret false;
430+
fn have_flag(flags: u32, f: u32) -> bool {
431+
flags & f != 0
436432
}
437433
}
438434

src/libsyntax/ext/fmt.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,19 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span,
5050

5151
fn make_rt_conv_expr(cx: ext_ctxt, sp: span, cnv: conv) -> @ast::expr {
5252
fn make_flags(cx: ext_ctxt, sp: span, flags: [flag]/~) -> @ast::expr {
53-
let mut flagexprs: [@ast::expr]/~ = []/~;
53+
let mut tmp_expr = make_rt_path_expr(cx, sp, @"flag_none");
5454
for flags.each {|f|
55-
let mut fstr;
56-
alt f {
57-
flag_left_justify { fstr = "flag_left_justify"; }
58-
flag_left_zero_pad { fstr = "flag_left_zero_pad"; }
59-
flag_space_for_sign { fstr = "flag_space_for_sign"; }
60-
flag_sign_always { fstr = "flag_sign_always"; }
61-
flag_alternate { fstr = "flag_alternate"; }
62-
}
63-
vec::push(flagexprs, make_rt_path_expr(cx, sp, @fstr));
55+
let fstr = alt f {
56+
flag_left_justify { "flag_left_justify" }
57+
flag_left_zero_pad { "flag_left_zero_pad" }
58+
flag_space_for_sign { "flag_space_for_sign" }
59+
flag_sign_always { "flag_sign_always" }
60+
flag_alternate { "flag_alternate" }
61+
};
62+
tmp_expr = mk_binary(cx, sp, ast::bitor, tmp_expr,
63+
make_rt_path_expr(cx, sp, @fstr));
6464
}
65-
ret mk_uniq_vec_e(cx, sp, flagexprs);
65+
ret tmp_expr;
6666
}
6767
fn make_count(cx: ext_ctxt, sp: span, cnt: count) -> @ast::expr {
6868
alt cnt {

0 commit comments

Comments
 (0)