@@ -10,6 +10,7 @@ import std::option::none;
10
10
import driver:: session:: session;
11
11
import util:: common;
12
12
import util:: common:: new_str_hash;
13
+ import util:: interner;
13
14
14
15
state type reader = state obj {
15
16
fn is_eof( ) -> bool;
@@ -19,15 +20,15 @@ state type reader = state obj {
19
20
fn bump ( ) ;
20
21
fn mark ( ) ;
21
22
fn get_mark_chpos ( ) -> uint ;
22
- fn add_str ( str ) -> token:: str_num ;
23
- fn get_str ( token:: str_num ) -> str ;
23
+ fn get_interner ( ) -> @interner:: interner [ str ] ;
24
24
fn get_chpos ( ) -> uint ;
25
25
fn get_filemap ( ) -> codemap:: filemap ;
26
26
fn err ( str m) ;
27
27
} ;
28
28
29
29
fn new_reader ( session sess, io:: reader rdr,
30
- codemap:: filemap filemap) -> reader {
30
+ codemap:: filemap filemap,
31
+ @interner:: interner[ str] itr ) -> reader {
31
32
32
33
state obj reader ( session sess,
33
34
str file,
@@ -37,7 +38,8 @@ fn new_reader(session sess, io::reader rdr,
37
38
mutable uint mark_chpos,
38
39
mutable uint chpos,
39
40
mutable vec[ str] strs,
40
- codemap:: filemap fm) {
41
+ codemap:: filemap fm,
42
+ @interner:: interner[ str] itr) {
41
43
42
44
fn is_eof ( ) -> bool {
43
45
ret ch == -1 as char ;
@@ -78,14 +80,7 @@ fn new_reader(session sess, io::reader rdr,
78
80
}
79
81
}
80
82
81
- fn add_str ( str s) -> token:: str_num {
82
- strs += vec ( s) ;
83
- ret _vec:: len[ str] ( strs) - 1 u;
84
- }
85
-
86
- fn get_str ( token:: str_num i) -> str {
87
- ret strs. ( i) ;
88
- }
83
+ fn get_interner ( ) -> @interner:: interner [ str ] { ret itr; }
89
84
90
85
fn get_filemap ( ) -> codemap:: filemap {
91
86
ret fm;
@@ -99,7 +94,7 @@ fn new_reader(session sess, io::reader rdr,
99
94
let vec[ str] strs = vec ( ) ;
100
95
auto rd = reader ( sess, file, _str:: byte_len ( file) , 0 u, -1 as char ,
101
96
filemap. start_pos , filemap. start_pos ,
102
- strs, filemap) ;
97
+ strs, filemap, itr ) ;
103
98
rd. init ( ) ;
104
99
ret rd;
105
100
}
@@ -387,28 +382,30 @@ fn scan_number(char c, reader rdr) -> token::token {
387
382
if ( c == '3' && n == '2' ) {
388
383
rdr. bump ( ) ; rdr. bump ( ) ;
389
384
ret token:: LIT_MACH_FLOAT ( util:: common:: ty_f32,
390
- rdr. add_str ( float_str) ) ;
385
+ interner :: intern [ str ] ( * rdr. get_interner ( ) , float_str) ) ;
391
386
}
392
387
else if ( c == '6' && n == '4' ) {
393
388
rdr. bump ( ) ; rdr. bump ( ) ;
394
389
ret token:: LIT_MACH_FLOAT ( util:: common:: ty_f64,
395
- rdr. add_str ( float_str) ) ;
390
+ interner :: intern [ str ] ( * rdr. get_interner ( ) , float_str) ) ;
396
391
/* FIXME: if this is out of range for either a 32-bit or
397
392
64-bit float, it won't be noticed till the back-end */
398
393
}
399
394
}
400
395
else {
401
- ret token:: LIT_FLOAT ( rdr. add_str ( float_str) ) ;
396
+ ret token:: LIT_FLOAT ( interner:: intern[ str] ( * rdr. get_interner ( ) ,
397
+ float_str) ) ;
402
398
}
403
399
}
404
400
405
401
auto maybe_exponent = scan_exponent ( rdr) ;
406
402
alt ( maybe_exponent) {
407
403
case ( some[ str] ( ?s) ) {
408
- ret token:: LIT_FLOAT ( rdr. add_str ( dec_str + s) ) ;
404
+ ret token:: LIT_FLOAT ( interner:: intern[ str] ( * rdr. get_interner ( ) ,
405
+ dec_str + s) ) ;
409
406
}
410
407
case ( none[ str] ) {
411
- ret token:: LIT_INT ( accum_int) ;
408
+ ret token:: LIT_INT ( accum_int) ;
412
409
}
413
410
}
414
411
}
@@ -471,7 +468,8 @@ fn next_token(reader rdr) -> token::token {
471
468
}
472
469
473
470
auto is_mod_name = c == ':' && rdr. next ( ) == ':' ;
474
- ret token:: IDENT ( rdr. add_str ( accum_str) , is_mod_name) ;
471
+ ret token:: IDENT ( interner:: intern[ str] ( * rdr. get_interner ( ) ,
472
+ accum_str) , is_mod_name) ;
475
473
}
476
474
477
475
if ( is_dec_digit ( c) ) {
@@ -671,7 +669,8 @@ fn next_token(reader rdr) -> token::token {
671
669
rdr. bump ( ) ;
672
670
}
673
671
rdr. bump ( ) ;
674
- ret token:: LIT_STR ( rdr. add_str ( accum_str) ) ;
672
+ ret token:: LIT_STR ( interner:: intern[ str] ( * rdr. get_interner ( ) ,
673
+ accum_str) ) ;
675
674
}
676
675
677
676
case ( '-' ) {
@@ -801,7 +800,8 @@ fn read_block_comment(reader rdr) -> cmnt {
801
800
802
801
fn gather_comments ( session sess, str path ) -> vec[ cmnt ] {
803
802
auto srdr = io:: file_reader ( path) ;
804
- auto rdr = new_reader ( sess, srdr, codemap:: new_filemap ( path, 0 u) ) ;
803
+ auto itr = @interner:: mk_interner[ str] ( _str:: hash, _str:: eq) ;
804
+ auto rdr = new_reader ( sess, srdr, codemap:: new_filemap ( path, 0 u) , itr) ;
805
805
let vec[ cmnt] comments = vec ( ) ;
806
806
while ( !rdr. is_eof ( ) ) {
807
807
while ( true ) {
0 commit comments