diff options
| author | bors <bors@rust-lang.org> | 2013-05-10 01:55:54 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-05-10 01:55:54 -0700 |
| commit | e9d0018abf8dd0c692db4cfe8f5d1bd1c150d643 (patch) | |
| tree | f52065d76f022ca0afe150daaa63c9ddc9157060 /src/libsyntax/parse | |
| parent | f04eb37c7ea19bbd2cff12d15816873e0a46fc86 (diff) | |
| parent | 1393c3a3f438c896083405dca501c8cf05767c65 (diff) | |
| download | rust-e9d0018abf8dd0c692db4cfe8f5d1bd1c150d643.tar.gz rust-e9d0018abf8dd0c692db4cfe8f5d1bd1c150d643.zip | |
auto merge of #6356 : dotdash/rust/strinterner, r=pcwalton
&str can be turned into @~str on demand, using to_owned(), so for strings, we can create a specialized interner that accepts &str for intern() and find() but stores and returns @~str.
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/lexer.rs | 44 | ||||
| -rw-r--r-- | src/libsyntax/parse/mod.rs | 12 | ||||
| -rw-r--r-- | src/libsyntax/parse/token.rs | 82 |
3 files changed, 69 insertions, 69 deletions
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs index 8956622a06b..764dec0eeb3 100644 --- a/src/libsyntax/parse/lexer.rs +++ b/src/libsyntax/parse/lexer.rs @@ -271,7 +271,7 @@ fn consume_any_line_comment(rdr: @mut StringReader) // but comments with only "/"s are not if !is_line_non_doc_comment(acc) { return Some(TokenAndSpan{ - tok: token::DOC_COMMENT(rdr.interner.intern(@acc)), + tok: token::DOC_COMMENT(rdr.interner.intern(acc)), sp: codemap::mk_sp(start_bpos, rdr.pos) }); } @@ -325,7 +325,7 @@ fn consume_block_comment(rdr: @mut StringReader) // but comments with only "*"s between two "/"s are not if !is_block_non_doc_comment(acc) { return Some(TokenAndSpan{ - tok: token::DOC_COMMENT(rdr.interner.intern(@acc)), + tok: token::DOC_COMMENT(rdr.interner.intern(acc)), sp: codemap::mk_sp(start_bpos, rdr.pos) }); } @@ -467,12 +467,12 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token { if c == '3' && n == '2' { bump(rdr); bump(rdr); - return token::LIT_FLOAT(rdr.interner.intern(@num_str), + return token::LIT_FLOAT(rdr.interner.intern(num_str), ast::ty_f32); } else if c == '6' && n == '4' { bump(rdr); bump(rdr); - return token::LIT_FLOAT(rdr.interner.intern(@num_str), + return token::LIT_FLOAT(rdr.interner.intern(num_str), ast::ty_f64); /* FIXME (#2252): if this is out of range for either a 32-bit or 64-bit float, it won't be noticed till the @@ -484,9 +484,9 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token { } if is_float { if is_machine_float { - return token::LIT_FLOAT(rdr.interner.intern(@num_str), ast::ty_f); + return token::LIT_FLOAT(rdr.interner.intern(num_str), ast::ty_f); } - return token::LIT_FLOAT_UNSUFFIXED(rdr.interner.intern(@num_str)); + return token::LIT_FLOAT_UNSUFFIXED(rdr.interner.intern(num_str)); } else { if str::len(num_str) == 0u { rdr.fatal(~"no valid digits found for number"); @@ -548,7 +548,7 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token { let is_mod_name = c == ':' && nextch(rdr) == ':'; // FIXME: perform NFKC normalization here. (Issue #2253) - return token::IDENT(rdr.interner.intern(@accum_str), is_mod_name); + return token::IDENT(rdr.interner.intern(accum_str), is_mod_name); } if is_dec_digit(c) { return scan_number(c, rdr); @@ -658,7 +658,7 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token { lifetime_name.push_char(rdr.curr); bump(rdr); } - return token::LIFETIME(rdr.interner.intern(@lifetime_name)); + return token::LIFETIME(rdr.interner.intern(lifetime_name)); } // Otherwise it is a character constant: @@ -731,7 +731,7 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token { } } bump(rdr); - return token::LIT_STR(rdr.interner.intern(@accum_str)); + return token::LIT_STR(rdr.interner.intern(accum_str)); } '-' => { if nextch(rdr) == '>' { @@ -799,7 +799,7 @@ mod test { let Env {interner: ident_interner, string_reader} = setup(~"/* my source file */ \ fn main() { io::println(~\"zebra\"); }\n"); - let id = ident_interner.intern(@~"fn"); + let id = ident_interner.intern("fn"); let tok1 = string_reader.next_token(); let tok2 = TokenAndSpan{ tok:token::IDENT(id, false), @@ -810,7 +810,7 @@ mod test { // read another token: let tok3 = string_reader.next_token(); let tok4 = TokenAndSpan{ - tok:token::IDENT(ident_interner.intern (@~"main"), false), + tok:token::IDENT(ident_interner.intern("main"), false), sp:span {lo:BytePos(24),hi:BytePos(28),expn_info: None}}; assert_eq!(tok3,tok4); // the lparen is already read: @@ -828,39 +828,39 @@ mod test { } // make the identifier by looking up the string in the interner - fn mk_ident (env: Env, id: ~str, is_mod_name: bool) -> token::Token { - token::IDENT (env.interner.intern(@id),is_mod_name) + fn mk_ident (env: Env, id: &str, is_mod_name: bool) -> token::Token { + token::IDENT (env.interner.intern(id),is_mod_name) } #[test] fn doublecolonparsing () { let env = setup (~"a b"); check_tokenization (env, - ~[mk_ident (env,~"a",false), - mk_ident (env,~"b",false)]); + ~[mk_ident (env,"a",false), + mk_ident (env,"b",false)]); } #[test] fn dcparsing_2 () { let env = setup (~"a::b"); check_tokenization (env, - ~[mk_ident (env,~"a",true), + ~[mk_ident (env,"a",true), token::MOD_SEP, - mk_ident (env,~"b",false)]); + mk_ident (env,"b",false)]); } #[test] fn dcparsing_3 () { let env = setup (~"a ::b"); check_tokenization (env, - ~[mk_ident (env,~"a",false), + ~[mk_ident (env,"a",false), token::MOD_SEP, - mk_ident (env,~"b",false)]); + mk_ident (env,"b",false)]); } #[test] fn dcparsing_4 () { let env = setup (~"a:: b"); check_tokenization (env, - ~[mk_ident (env,~"a",true), + ~[mk_ident (env,"a",true), token::MOD_SEP, - mk_ident (env,~"b",false)]); + mk_ident (env,"b",false)]); } #[test] fn character_a() { @@ -888,7 +888,7 @@ mod test { let env = setup(~"'abc"); let TokenAndSpan {tok, sp: _} = env.string_reader.next_token(); - let id = env.interner.intern(@~"abc"); + let id = env.interner.intern("abc"); assert_eq!(tok, token::LIFETIME(id)); } } diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index 0708b65864e..ce41d377346 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -375,13 +375,13 @@ mod test { assert!(i.len() < 100); for int::range(0,100-((i.len()).to_int())) |_dc| { - i.gensym(@~"dontcare"); + i.gensym("dontcare"); } - i.intern(@~"a"); - i.intern(@~"b"); - i.intern(@~"c"); - i.intern(@~"d"); - i.intern(@~"return"); + i.intern("a"); + i.intern("b"); + i.intern("c"); + i.intern("d"); + i.intern("return"); assert!(i.get(ast::ident{repr:101,ctxt:0}) == @~"b"); i } diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index fe7bd5b3bc1..4483cc42361 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -11,7 +11,7 @@ use ast; use ast_util; use parse::token; -use util::interner::Interner; +use util::interner::StrInterner; use util::interner; use core::cmp::Equiv; @@ -390,14 +390,14 @@ pub fn token_to_binop(tok: Token) -> Option<ast::binop> { } pub struct ident_interner { - priv interner: Interner<@~str>, + priv interner: StrInterner, } pub impl ident_interner { - fn intern(&self, val: @~str) -> ast::ident { + fn intern(&self, val: &str) -> ast::ident { ast::ident { repr: self.interner.intern(val), ctxt: 0 } } - fn gensym(&self, val: @~str) -> ast::ident { + fn gensym(&self, val: &str) -> ast::ident { ast::ident { repr: self.interner.gensym(val), ctxt: 0 } } fn get(&self, idx: ast::ident) -> @~str { @@ -421,45 +421,45 @@ pub fn mk_fresh_ident_interner() -> @ident_interner { // the indices here must correspond to the numbers in // special_idents. let init_vec = ~[ - @~"_", // 0 - @~"anon", // 1 - @~"", // 2 - @~"unary", // 3 - @~"!", // 4 - @~"[]", // 5 - @~"unary-", // 6 - @~"__extensions__", // 7 - @~"self", // 8 - @~"item", // 9 - @~"block", // 10 - @~"stmt", // 11 - @~"pat", // 12 - @~"expr", // 13 - @~"ty", // 14 - @~"ident", // 15 - @~"path", // 16 - @~"tt", // 17 - @~"matchers", // 18 - @~"str", // 19 - @~"TyVisitor", // 20 - @~"arg", // 21 - @~"descrim", // 22 - @~"__rust_abi", // 23 - @~"__rust_stack_shim", // 24 - @~"TyDesc", // 25 - @~"main", // 26 - @~"<opaque>", // 27 - @~"blk", // 28 - @~"static", // 29 - @~"intrinsic", // 30 - @~"__foreign_mod__", // 31 - @~"__field__", // 32 - @~"C", // 33 - @~"Self", // 34 + "_", // 0 + "anon", // 1 + "", // 2 + "unary", // 3 + "!", // 4 + "[]", // 5 + "unary-", // 6 + "__extensions__", // 7 + "self", // 8 + "item", // 9 + "block", // 10 + "stmt", // 11 + "pat", // 12 + "expr", // 13 + "ty", // 14 + "ident", // 15 + "path", // 16 + "tt", // 17 + "matchers", // 18 + "str", // 19 + "TyVisitor", // 20 + "arg", // 21 + "descrim", // 22 + "__rust_abi", // 23 + "__rust_stack_shim", // 24 + "TyDesc", // 25 + "main", // 26 + "<opaque>", // 27 + "blk", // 28 + "static", // 29 + "intrinsic", // 30 + "__foreign_mod__", // 31 + "__field__", // 32 + "C", // 33 + "Self", // 34 ]; let rv = @ident_interner { - interner: interner::Interner::prefill(init_vec) + interner: interner::StrInterner::prefill(init_vec) }; unsafe { task::local_data::local_data_set(interner_key!(), @rv); @@ -483,7 +483,7 @@ pub fn mk_ident_interner() -> @ident_interner { /* for when we don't care about the contents; doesn't interact with TLD or serialization */ pub fn mk_fake_ident_interner() -> @ident_interner { - @ident_interner { interner: interner::Interner::new() } + @ident_interner { interner: interner::StrInterner::new() } } /** |
