From 7e43a31f0885353d7d028014261913f79e531f83 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 20 May 2011 13:57:09 -0700 Subject: [PATCH] rustc: Move the interner to a new module intended to be used for general data structures --- src/comp/front/lexer.rs | 4 ++-- src/comp/front/parser.rs | 4 ++-- src/comp/front/token.rs | 2 +- src/comp/middle/ty.rs | 4 ++-- src/comp/rustc.rc | 2 +- src/comp/util/data.rs | 44 +++++++++++++++++++++++++++++++++++++++ src/comp/util/interner.rs | 42 ------------------------------------- 7 files changed, 52 insertions(+), 50 deletions(-) create mode 100644 src/comp/util/data.rs delete mode 100644 src/comp/util/interner.rs diff --git a/src/comp/front/lexer.rs b/src/comp/front/lexer.rs index b459c8e4792b..069e9b3b83c4 100644 --- a/src/comp/front/lexer.rs +++ b/src/comp/front/lexer.rs @@ -10,7 +10,7 @@ import std::option::none; import driver::session::session; import util::common; import util::common::new_str_hash; -import util::interner; +import util::data::interner; state type reader = state obj { fn is_eof() -> bool; @@ -800,7 +800,7 @@ fn read_block_comment(&reader rdr) -> cmnt { fn gather_comments(session sess, str path) -> vec[cmnt] { auto srdr = io::file_reader(path); - auto itr = @interner::mk_interner[str](str::hash, str::eq); + auto itr = @interner::mk[str](str::hash, str::eq); auto rdr = new_reader(sess, srdr, codemap::new_filemap(path, 0u), itr); let vec[cmnt] comments = []; while (!rdr.is_eof()) { diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index b59e70604c54..1774762dcf86 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -11,7 +11,7 @@ import util::common; import util::common::filename; import util::common::span; import util::common::new_str_hash; -import util::interner; +import util::data::interner; tag restriction { UNRESTRICTED; @@ -165,7 +165,7 @@ fn new_parser(session::session sess, auto srdr = io::file_reader(path); auto filemap = codemap::new_filemap(path, pos); vec::push[codemap::filemap](sess.get_codemap().files, filemap); - auto itr = @interner::mk_interner[str](str::hash, str::eq); + auto itr = @interner::mk[str](str::hash, str::eq); auto rdr = lexer::new_reader(sess, srdr, filemap, itr); // Make sure npos points at first actual token: lexer::consume_any_whitespace(rdr); diff --git a/src/comp/front/token.rs b/src/comp/front/token.rs index 41b8f30d6283..7c778ccaad38 100644 --- a/src/comp/front/token.rs +++ b/src/comp/front/token.rs @@ -1,7 +1,7 @@ import util::common::ty_mach; import util::common::ty_mach_to_str; import util::common::new_str_hash; -import util::interner; +import util::data::interner; import std::int; import std::uint; import std::str; diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index f50443c2a41a..67fb829d4ad7 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -34,7 +34,7 @@ import util::common::new_def_hash; import util::common::span; import middle::tstate::ann::ts_ann; -import util::interner; +import util::data::interner; // Data types @@ -232,7 +232,7 @@ fn mk_ctxt(session::session s, resolve::def_map dm) -> ctxt { common::new_def_hash[ty::ty_param_count_and_ty](); auto items = common::new_def_hash[any_item](); - auto ts = @interner::mk_interner[raw_t](hash_raw_ty, eq_raw_ty); + auto ts = @interner::mk[raw_t](hash_raw_ty, eq_raw_ty); auto cx = rec(ts = ts, diff --git a/src/comp/rustc.rc b/src/comp/rustc.rc index 7d35b24c08f4..d9a9b8dea9c5 100644 --- a/src/comp/rustc.rc +++ b/src/comp/rustc.rc @@ -62,7 +62,7 @@ mod driver { mod util { mod common; - mod interner; + mod data; } auth front::creader::load_crate = unsafe; diff --git a/src/comp/util/data.rs b/src/comp/util/data.rs new file mode 100644 index 000000000000..301297ba3432 --- /dev/null +++ b/src/comp/util/data.rs @@ -0,0 +1,44 @@ +// An "interner" is a data structure that associates values with uint tags and +// allows bidirectional lookup; i.e. given a value, one can easily find the +// type, and vice versa. + +import std::vec; +import std::map; +import std::map::hashmap; +import std::map::hashfn; +import std::map::eqfn; +import std::option; +import std::option::none; +import std::option::some; + +mod interner { + type interner[T] = rec( + hashmap[T,uint] map, + mutable vec[T] vect, + hashfn[T] hasher, + eqfn[T] eqer + ); + + fn mk[T](hashfn[T] hasher, eqfn[T] eqer) -> interner[T] { + auto m = map::mk_hashmap[T,uint](hasher, eqer); + let vec[T] vect = []; + ret rec(map=m, mutable vect=vect, hasher=hasher, eqer=eqer); + } + + fn intern[T](&interner[T] itr, &T val) -> uint { + alt (itr.map.find(val)) { + case (some[uint](?idx)) { ret idx; } + case (none[uint]) { + auto new_idx = vec::len[T](itr.vect); + itr.map.insert(val, new_idx); + itr.vect += [val]; + ret new_idx; + } + } + } + + fn get[T](&interner[T] itr, uint idx) -> T { + ret itr.vect.(idx); + } +} + diff --git a/src/comp/util/interner.rs b/src/comp/util/interner.rs deleted file mode 100644 index 60d6b3102f0e..000000000000 --- a/src/comp/util/interner.rs +++ /dev/null @@ -1,42 +0,0 @@ -// An "interner" is a data structure that associates values with uint tags and -// allows bidirectional lookup; i.e. given a value, one can easily find the -// type, and vice versa. - -import std::vec; -import std::map; -import std::map::hashmap; -import std::map::hashfn; -import std::map::eqfn; -import std::option; -import std::option::none; -import std::option::some; - -type interner[T] = rec( - hashmap[T,uint] map, - mutable vec[T] vect, - hashfn[T] hasher, - eqfn[T] eqer -); - -fn mk_interner[T](hashfn[T] hasher, eqfn[T] eqer) -> interner[T] { - auto m = map::mk_hashmap[T,uint](hasher, eqer); - let vec[T] vect = []; - ret rec(map=m, mutable vect=vect, hasher=hasher, eqer=eqer); -} - -fn intern[T](&interner[T] itr, &T val) -> uint { - alt (itr.map.find(val)) { - case (some[uint](?idx)) { ret idx; } - case (none[uint]) { - auto new_idx = vec::len[T](itr.vect); - itr.map.insert(val, new_idx); - itr.vect += [val]; - ret new_idx; - } - } -} - -fn get[T](&interner[T] itr, uint idx) -> T { - ret itr.vect.(idx); -} -