diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index a1309e3ecef..10fac8d0e23 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -279,9 +279,18 @@ pure fn is_bar(t: token) -> bool { type ident_interner = util::interner::interner<@~str>; +mod special_idents { + const underscore : uint = 0u; + const anon : uint = 1u; + const destr : uint = 2u; // 'drop', but that's reserved +} + fn mk_ident_interner() -> ident_interner { - let rv = @interner::mk::<@~str>(|x| str::hash(*x), - |x,y| str::eq(*x, *y)); + /* the indices here must correspond to the numbers in special_idents */ + let init_vec = ~[@~"_", @~"anon", @~"drop"]; + + let rv = @interner::mk_prefill::<@~str>(|x| str::hash(*x), + |x,y| str::eq(*x, *y), init_vec); rv } diff --git a/src/libsyntax/util/interner.rs b/src/libsyntax/util/interner.rs index 9b7398d16c7..19b27be83e2 100644 --- a/src/libsyntax/util/interner.rs +++ b/src/libsyntax/util/interner.rs @@ -18,6 +18,15 @@ fn mk(+hasher: hashfn, +eqer: eqfn) -> interner { return hi as interner::; } +fn mk_prefill(hasher: hashfn, eqer: eqfn, + init: ~[T]) -> interner { + + let rv = mk(hasher, eqer); + for init.each() |v| { rv.intern(v); } + return rv; +} + + /* when traits can extend traits, we should extend index to get [] */ trait interner { fn intern(T) -> uint;