Skip to content

Commit 999f692

Browse files
committed
getting rid of interner_key! macro
1 parent fc4f304 commit 999f692

File tree

9 files changed

+60
-125
lines changed

9 files changed

+60
-125
lines changed

src/librustdoc/extract.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,18 @@ use doc;
1717
use core::local_data::local_data_get;
1818
use syntax::ast;
1919
use syntax;
20-
21-
/* can't import macros yet, so this is copied from token.rs. See its comment
22-
* there. */
23-
macro_rules! interner_key (
24-
() => (cast::transmute::<(uint, uint),
25-
&fn(v: @@syntax::parse::token::ident_interner)>((-3 as uint, 0u)))
26-
)
20+
use syntax::parse::token::{ident_interner};
21+
use syntax::parse::token;
2722

2823
// Hack; rather than thread an interner through everywhere, rely on
2924
// thread-local data
3025
pub fn to_str(id: ast::ident) -> ~str {
31-
let intr = unsafe{ local_data_get(interner_key!()) };
32-
33-
return copy *(*intr.get()).get(id);
26+
let intr = token::get_ident_interner();
27+
return copy *(*intr).get(id);
3428
}
3529

36-
pub fn interner() -> @syntax::parse::token::ident_interner {
37-
return *(unsafe{ local_data_get(interner_key!()) }).get();
30+
pub fn interner() -> @ident_interner {
31+
return token::get_ident_interner();
3832
}
3933

4034
pub fn from_srv(

src/libsyntax/ast.rs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313
use codemap::{span, spanned};
1414
use abi::AbiSet;
1515
use opt_vec::OptVec;
16+
use parse::token::get_ident_interner;
1617

1718
use core::cast;
18-
use core::option::{None, Option, Some};
19+
use core::option::{Option};
1920
use core::to_bytes;
2021
use core::to_bytes::IterBytes;
2122
use core::to_str::ToStr;
@@ -67,7 +68,7 @@ pub enum SyntaxContext_ {
6768
// in the "from" slot. In essence, they're all
6869
// pointers to a single "rename" event node.
6970
Rename (ident,Name,SyntaxContext),
70-
IllegalCtxt()
71+
IllegalCtxt()
7172
}
7273

7374
// a name represents an identifier
@@ -78,27 +79,14 @@ pub type Mrk = uint;
7879

7980
impl<S:Encoder> Encodable<S> for ident {
8081
fn encode(&self, s: &mut S) {
81-
unsafe {
82-
let intr =
83-
match local_data::local_data_get(interner_key!()) {
84-
None => fail!("encode: TLS interner not set up"),
85-
Some(intr) => intr
86-
};
87-
88-
s.emit_str(*(*intr).get(*self));
89-
}
82+
let intr = get_ident_interner();
83+
s.emit_str(*(*intr).get(*self));
9084
}
9185
}
9286

9387
impl<D:Decoder> Decodable<D> for ident {
9488
fn decode(d: &mut D) -> ident {
95-
let intr = match unsafe {
96-
local_data::local_data_get(interner_key!())
97-
} {
98-
None => fail!("decode: TLS interner not set up"),
99-
Some(intr) => intr
100-
};
101-
89+
let intr = get_ident_interner();
10290
(*intr).intern(d.read_str())
10391
}
10492
}

src/libsyntax/ext/expand.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,7 @@ mod test {
806806
};
807807
let table = @mut new_sctable();
808808
let a_name = 100; // enforced by testing_interner
809-
let a2_name = sess.interner.gensym(@~"a2").repr;
809+
let a2_name = sess.interner.gensym("a2").repr;
810810
let renamer = new_ident_renamer(ast::ident{repr:a_name,ctxt:empty_ctxt},
811811
a2_name,table);
812812
let renamed_ast = fun_to_ident_folder(renamer).fold_item(item_ast).get();

src/libsyntax/parse/lexer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,7 @@ mod test {
786786
fn setup(teststr: ~str) -> Env {
787787
let cm = CodeMap::new();
788788
let fm = cm.new_filemap(~"zebra.rs", @teststr);
789-
let ident_interner = token::mk_ident_interner(); // interner::mk();
789+
let ident_interner = token::get_ident_interner();
790790
let span_handler =
791791
diagnostic::mk_span_handler(diagnostic::mk_handler(None),@cm);
792792
Env {

src/libsyntax/parse/mod.rs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use diagnostic::{span_handler, mk_span_handler, mk_handler, Emitter};
1919
use parse::attr::parser_attr;
2020
use parse::lexer::reader;
2121
use parse::parser::Parser;
22-
use parse::token::{ident_interner, mk_ident_interner};
22+
use parse::token::{ident_interner, get_ident_interner};
2323

2424
use core::io;
2525
use core::option::{None, Option, Some};
@@ -59,7 +59,7 @@ pub fn new_parse_sess(demitter: Option<Emitter>) -> @mut ParseSess {
5959
cm: cm,
6060
next_id: 1,
6161
span_diagnostic: mk_span_handler(mk_handler(demitter), cm),
62-
interner: mk_ident_interner(),
62+
interner: get_ident_interner(),
6363
}
6464
}
6565

@@ -70,7 +70,7 @@ pub fn new_parse_sess_special_handler(sh: @span_handler,
7070
cm: cm,
7171
next_id: 1,
7272
span_diagnostic: sh,
73-
interner: mk_ident_interner(),
73+
interner: get_ident_interner(),
7474
}
7575
}
7676

@@ -352,8 +352,8 @@ mod test {
352352
use opt_vec;
353353
use ast;
354354
use abi;
355-
use ast_util::new_ident;
356355
use parse::parser::Parser;
356+
use parse::token::intern;
357357
use util::parser_testing::{string_to_tts_and_sess,string_to_parser};
358358
use util::parser_testing::{string_to_expr, string_to_item};
359359
use util::parser_testing::{string_to_stmt};
@@ -378,8 +378,8 @@ mod test {
378378
}
379379

380380
// convert a vector of uints to a vector of ast::idents
381-
fn ints_to_idents(ids: ~[uint]) -> ~[ast::ident] {
382-
ids.map(|u| new_ident(*u))
381+
fn ints_to_idents(ids: ~[~str]) -> ~[ast::ident] {
382+
ids.map(|u| intern(*u))
383383
}
384384

385385
#[test] fn path_exprs_1 () {
@@ -388,7 +388,7 @@ mod test {
388388
callee_id:2,
389389
node:ast::expr_path(@ast::Path {span:sp(0,1),
390390
global:false,
391-
idents:~[new_ident(100)],
391+
idents:~[intern("a")],
392392
rp:None,
393393
types:~[]}),
394394
span:sp(0,1)})
@@ -398,11 +398,12 @@ mod test {
398398
assert_eq!(string_to_expr(@~"::a::b"),
399399
@ast::expr{id:1,
400400
callee_id:2,
401-
node:ast::expr_path(@ast::Path {span:sp(0,6),
402-
global:true,
403-
idents:ints_to_idents(~[100,101]),
404-
rp:None,
405-
types:~[]}),
401+
node:ast::expr_path(
402+
@ast::Path {span:sp(0,6),
403+
global:true,
404+
idents:ints_to_idents(~[~"a",~"b"]),
405+
rp:None,
406+
types:~[]}),
406407
span:sp(0,6)})
407408
}
408409
@@ -451,7 +452,7 @@ mod test {
451452
node:ast::expr_path(
452453
@ast::Path{span:sp(7,8),
453454
global:false,
454-
idents:~[new_ident(103)],
455+
idents:~[intern("d")],
455456
rp:None,
456457
types:~[]
457458
}),
@@ -469,7 +470,7 @@ mod test {
469470
@ast::Path{
470471
span:sp(0,1),
471472
global:false,
472-
idents:~[new_ident(101)],
473+
idents:~[intern("b")],
473474
rp:None,
474475
types: ~[]}),
475476
span: sp(0,1)},
@@ -490,7 +491,7 @@ mod test {
490491
@ast::Path{
491492
span:sp(0,1),
492493
global:false,
493-
idents:~[new_ident(101)],
494+
idents:~[intern("b")],
494495
rp: None,
495496
types: ~[]},
496497
None // no idea
@@ -509,7 +510,7 @@ mod test {
509510
span:sp(4,4), // this is bizarre...
510511
// check this in the original parser?
511512
global:false,
512-
idents:~[new_ident(105)],
513+
idents:~[intern("int")],
513514
rp: None,
514515
types: ~[]},
515516
2),
@@ -519,7 +520,7 @@ mod test {
519520
@ast::Path{
520521
span:sp(0,1),
521522
global:false,
522-
idents:~[new_ident(101)],
523+
idents:~[intern("b")],
523524
rp: None,
524525
types: ~[]},
525526
None // no idea
@@ -535,7 +536,7 @@ mod test {
535536
// assignment order of the node_ids.
536537
assert_eq!(string_to_item(@~"fn a (b : int) { b; }"),
537538
Some(
538-
@ast::item{ident:new_ident(100),
539+
@ast::item{ident:intern("a"),
539540
attrs:~[],
540541
id: 10, // fixme
541542
node: ast::item_fn(ast::fn_decl{
@@ -545,7 +546,7 @@ mod test {
545546
node: ast::ty_path(@ast::Path{
546547
span:sp(10,13),
547548
global:false,
548-
idents:~[new_ident(106)],
549+
idents:~[intern("int")],
549550
rp: None,
550551
types: ~[]},
551552
2),
@@ -556,7 +557,7 @@ mod test {
556557
@ast::Path{
557558
span:sp(6,7),
558559
global:false,
559-
idents:~[new_ident(101)],
560+
idents:~[intern("b")],
560561
rp: None,
561562
types: ~[]},
562563
None // no idea
@@ -587,7 +588,7 @@ mod test {
587588
@ast::Path{
588589
span:sp(17,18),
589590
global:false,
590-
idents:~[new_ident(101)],
591+
idents:~[intern("b")],
591592
rp:None,
592593
types: ~[]}),
593594
span: sp(17,18)},

src/libsyntax/parse/token.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -411,8 +411,7 @@ pub impl ident_interner {
411411
}
412412

413413
// return a fresh interner, preloaded with special identifiers.
414-
// EFFECT: stores this interner in TLS
415-
pub fn mk_fresh_ident_interner() -> @ident_interner {
414+
fn mk_fresh_ident_interner() -> @ident_interner {
416415
// the indices here must correspond to the numbers in
417416
// special_idents.
418417
let init_vec = ~[
@@ -453,23 +452,27 @@ pub fn mk_fresh_ident_interner() -> @ident_interner {
453452
"Self", // 34
454453
];
455454

456-
let rv = @ident_interner {
455+
@ident_interner {
457456
interner: interner::StrInterner::prefill(init_vec)
458-
};
459-
unsafe {
460-
local_data::local_data_set(interner_key!(), @rv);
461457
}
462-
rv
463458
}
464459

465460
// if an interner exists in TLS, return it. Otherwise, prepare a
466461
// fresh one.
467-
pub fn mk_ident_interner() -> @ident_interner {
462+
pub fn get_ident_interner() -> @ident_interner {
468463
unsafe {
469-
match local_data::local_data_get(interner_key!()) {
464+
let key =
465+
(cast::transmute::<(uint, uint),
466+
&fn(v: @@::parse::token::ident_interner)>(
467+
(-3 as uint, 0u)));
468+
match local_data::local_data_get(key) {
470469
Some(interner) => *interner,
471470
None => {
472-
mk_fresh_ident_interner()
471+
let interner = mk_fresh_ident_interner();
472+
unsafe {
473+
local_data::local_data_set(key, @interner);
474+
}
475+
interner
473476
}
474477
}
475478
}
@@ -481,6 +484,12 @@ pub fn mk_fake_ident_interner() -> @ident_interner {
481484
@ident_interner { interner: interner::StrInterner::new() }
482485
}
483486

487+
// maps a string to its interned representation
488+
pub fn intern(str : &str) -> ast::ident {
489+
let interner = get_ident_interner();
490+
interner.intern(str)
491+
}
492+
484493
/**
485494
* All the valid words that have meaning in the Rust language.
486495
*

src/libsyntax/syntax.rc

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@
2525

2626
extern mod std;
2727

28-
// allow the interner_key macro
29-
// to escape this module:
30-
#[macro_escape]
3128
pub mod util {
3229
pub mod interner;
3330
#[cfg(test)]

src/libsyntax/util/interner.rs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212
// allows bidirectional lookup; i.e. given a value, one can easily find the
1313
// type, and vice versa.
1414

15-
// allow the interner_key macro to escape this module:
16-
#[macro_escape];
17-
1815
use core::cmp::Equiv;
1916
use core::hashmap::HashMap;
2017
use syntax::parse::token::StringRef;
@@ -78,6 +75,8 @@ pub impl<T:Eq + IterBytes + Hash + Const + Copy> Interner<T> {
7875
}
7976
}
8077

78+
// A StrInterner differs from Interner<String> in that it accepts
79+
// borrowed pointers rather than @ ones, resulting in less allocation.
8180
pub struct StrInterner {
8281
priv map: @mut HashMap<@~str, uint>,
8382
priv vect: @mut ~[@~str],
@@ -133,17 +132,6 @@ pub impl StrInterner {
133132
}
134133
}
135134

136-
/* Key for thread-local data for sneaking interner information to the
137-
* encoder/decoder. It sounds like a hack because it is one.
138-
* Bonus ultra-hack: functions as keys don't work across crates,
139-
* so we have to use a unique number. See taskgroup_key! in task.rs
140-
* for another case of this. */
141-
macro_rules! interner_key (
142-
() => (cast::transmute::<(uint, uint),
143-
&fn(v: @@::parse::token::ident_interner)>(
144-
(-3 as uint, 0u)))
145-
)
146-
147135
#[cfg(test)]
148136
mod tests {
149137
use super::*;

0 commit comments

Comments
 (0)