Skip to content

Commit 7e43a31

Browse files
committed
rustc: Move the interner to a new module intended to be used for general data structures
1 parent 02b995f commit 7e43a31

File tree

7 files changed

+52
-50
lines changed

7 files changed

+52
-50
lines changed

src/comp/front/lexer.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import std::option::none;
1010
import driver::session::session;
1111
import util::common;
1212
import util::common::new_str_hash;
13-
import util::interner;
13+
import util::data::interner;
1414

1515
state type reader = state obj {
1616
fn is_eof() -> bool;
@@ -800,7 +800,7 @@ fn read_block_comment(&reader rdr) -> cmnt {
800800

801801
fn gather_comments(session sess, str path) -> vec[cmnt] {
802802
auto srdr = io::file_reader(path);
803-
auto itr = @interner::mk_interner[str](str::hash, str::eq);
803+
auto itr = @interner::mk[str](str::hash, str::eq);
804804
auto rdr = new_reader(sess, srdr, codemap::new_filemap(path, 0u), itr);
805805
let vec[cmnt] comments = [];
806806
while (!rdr.is_eof()) {

src/comp/front/parser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import util::common;
1111
import util::common::filename;
1212
import util::common::span;
1313
import util::common::new_str_hash;
14-
import util::interner;
14+
import util::data::interner;
1515

1616
tag restriction {
1717
UNRESTRICTED;
@@ -165,7 +165,7 @@ fn new_parser(session::session sess,
165165
auto srdr = io::file_reader(path);
166166
auto filemap = codemap::new_filemap(path, pos);
167167
vec::push[codemap::filemap](sess.get_codemap().files, filemap);
168-
auto itr = @interner::mk_interner[str](str::hash, str::eq);
168+
auto itr = @interner::mk[str](str::hash, str::eq);
169169
auto rdr = lexer::new_reader(sess, srdr, filemap, itr);
170170
// Make sure npos points at first actual token:
171171
lexer::consume_any_whitespace(rdr);

src/comp/front/token.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import util::common::ty_mach;
22
import util::common::ty_mach_to_str;
33
import util::common::new_str_hash;
4-
import util::interner;
4+
import util::data::interner;
55
import std::int;
66
import std::uint;
77
import std::str;

src/comp/middle/ty.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import util::common::new_def_hash;
3434
import util::common::span;
3535
import middle::tstate::ann::ts_ann;
3636

37-
import util::interner;
37+
import util::data::interner;
3838

3939
// Data types
4040

@@ -232,7 +232,7 @@ fn mk_ctxt(session::session s, resolve::def_map dm) -> ctxt {
232232
common::new_def_hash[ty::ty_param_count_and_ty]();
233233

234234
auto items = common::new_def_hash[any_item]();
235-
auto ts = @interner::mk_interner[raw_t](hash_raw_ty, eq_raw_ty);
235+
auto ts = @interner::mk[raw_t](hash_raw_ty, eq_raw_ty);
236236

237237
auto cx =
238238
rec(ts = ts,

src/comp/rustc.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ mod driver {
6262

6363
mod util {
6464
mod common;
65-
mod interner;
65+
mod data;
6666
}
6767

6868
auth front::creader::load_crate = unsafe;

src/comp/util/data.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// An "interner" is a data structure that associates values with uint tags and
2+
// allows bidirectional lookup; i.e. given a value, one can easily find the
3+
// type, and vice versa.
4+
5+
import std::vec;
6+
import std::map;
7+
import std::map::hashmap;
8+
import std::map::hashfn;
9+
import std::map::eqfn;
10+
import std::option;
11+
import std::option::none;
12+
import std::option::some;
13+
14+
mod interner {
15+
type interner[T] = rec(
16+
hashmap[T,uint] map,
17+
mutable vec[T] vect,
18+
hashfn[T] hasher,
19+
eqfn[T] eqer
20+
);
21+
22+
fn mk[T](hashfn[T] hasher, eqfn[T] eqer) -> interner[T] {
23+
auto m = map::mk_hashmap[T,uint](hasher, eqer);
24+
let vec[T] vect = [];
25+
ret rec(map=m, mutable vect=vect, hasher=hasher, eqer=eqer);
26+
}
27+
28+
fn intern[T](&interner[T] itr, &T val) -> uint {
29+
alt (itr.map.find(val)) {
30+
case (some[uint](?idx)) { ret idx; }
31+
case (none[uint]) {
32+
auto new_idx = vec::len[T](itr.vect);
33+
itr.map.insert(val, new_idx);
34+
itr.vect += [val];
35+
ret new_idx;
36+
}
37+
}
38+
}
39+
40+
fn get[T](&interner[T] itr, uint idx) -> T {
41+
ret itr.vect.(idx);
42+
}
43+
}
44+

src/comp/util/interner.rs

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)