Skip to content

Commit aa024ac

Browse files
committed
Use a faked-up function as a key, because functions aren't identical cross-crate in Windows.
1 parent 0f996f7 commit aa024ac

File tree

3 files changed

+30
-10
lines changed

3 files changed

+30
-10
lines changed

src/libsyntax/ast.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,24 @@ fn deserialize_span<D>(_d: D) -> span {
3030
#[auto_serialize]
3131
type spanned<T> = {node: T, span: span};
3232

33+
34+
/* can't import macros yet, so this is copied from token.rs. See its comment
35+
* there. */
36+
macro_rules! interner_key (
37+
() => (unsafe::transmute::<(uint, uint), &fn(+@@token::ident_interner)>(
38+
(-3 as uint, 0u)))
39+
)
40+
3341
fn serialize_ident<S: serializer>(s: S, i: ident) {
34-
let intr = match unsafe{task::local_data_get(parse::token::interner_key)}{
42+
let intr = match unsafe{task::local_data_get(interner_key!())}{
3543
none => fail ~"serialization: TLS interner not set up",
3644
some(intr) => intr
3745
};
3846

3947
s.emit_str(*(*intr).get(i));
4048
}
4149
fn deserialize_ident<D: deserializer>(d: D) -> ident {
42-
let intr = match unsafe{task::local_data_get(parse::token::interner_key)}{
50+
let intr = match unsafe{task::local_data_get(interner_key!())}{
4351
none => fail ~"deserialization: TLS interner not set up",
4452
some(intr) => intr
4553
};

src/libsyntax/parse/token.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,14 @@ mod special_idents {
325325
type ident_interner = util::interner::interner<@~str>;
326326

327327
/** Key for thread-local data for sneaking interner information to the
328-
* serializer/deserializer. It sounds like a hack because it is one. */
329-
fn interner_key(+_x: @@ident_interner) { }
328+
* serializer/deserializer. It sounds like a hack because it is one.
329+
* Bonus ultra-hack: functions as keys don't work across crates,
330+
* so we have to use a unique number. See taskgroup_key! in task.rs
331+
* for another case of this. */
332+
macro_rules! interner_key (
333+
() => (unsafe::transmute::<(uint, uint), &fn(+@@token::ident_interner)>(
334+
(-3 as uint, 0u)))
335+
)
330336

331337
fn mk_ident_interner() -> ident_interner {
332338
/* the indices here must correspond to the numbers in special_idents */
@@ -343,8 +349,8 @@ fn mk_ident_interner() -> ident_interner {
343349
|x,y| str::eq(*x, *y), init_vec);
344350

345351
/* having multiple interners will just confuse the serializer */
346-
unsafe{ assert task::local_data_get(interner_key) == none };
347-
unsafe{ task::local_data_set(interner_key, @rv) };
352+
unsafe{ assert task::local_data_get(interner_key!()) == none };
353+
unsafe{ task::local_data_set(interner_key!(), @rv) };
348354
rv
349355
}
350356

src/rustdoc/extract.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,24 @@ import doc::item_utils;
55

66
export from_srv, extract, to_str, interner;
77

8+
9+
/* can't import macros yet, so this is copied from token.rs. See its comment
10+
* there. */
11+
macro_rules! interner_key (
12+
() => (unsafe::transmute::<(uint, uint),
13+
&fn(+@@syntax::parse::token::ident_interner)>((-3 as uint, 0u)))
14+
)
15+
816
// Hack; rather than thread an interner through everywhere, rely on
917
// thread-local data
1018
fn to_str(id: ast::ident) -> ~str {
11-
let intr = unsafe{ task::local_data_get(
12-
syntax::parse::token::interner_key) };
19+
let intr = unsafe{ task::local_data_get(interner_key!()) };
1320

1421
return *(*intr.get()).get(id);
1522
}
1623

1724
fn interner() -> syntax::parse::token::ident_interner {
18-
return *(unsafe{ task::local_data_get(
19-
syntax::parse::token::interner_key) }).get();
25+
return *(unsafe{ task::local_data_get(interner_key!()) }).get();
2026
}
2127

2228
fn from_srv(

0 commit comments

Comments
 (0)