Use a faked-up function as a key, because functions aren't identical cross-crate in Windows.
This commit is contained in:
parent
0f996f70a6
commit
aa024acae3
3 changed files with 30 additions and 10 deletions
|
@ -30,8 +30,16 @@ fn deserialize_span<D>(_d: D) -> span {
|
||||||
#[auto_serialize]
|
#[auto_serialize]
|
||||||
type spanned<T> = {node: T, span: span};
|
type spanned<T> = {node: T, span: span};
|
||||||
|
|
||||||
|
|
||||||
|
/* can't import macros yet, so this is copied from token.rs. See its comment
|
||||||
|
* there. */
|
||||||
|
macro_rules! interner_key (
|
||||||
|
() => (unsafe::transmute::<(uint, uint), &fn(+@@token::ident_interner)>(
|
||||||
|
(-3 as uint, 0u)))
|
||||||
|
)
|
||||||
|
|
||||||
fn serialize_ident<S: serializer>(s: S, i: ident) {
|
fn serialize_ident<S: serializer>(s: S, i: ident) {
|
||||||
let intr = match unsafe{task::local_data_get(parse::token::interner_key)}{
|
let intr = match unsafe{task::local_data_get(interner_key!())}{
|
||||||
none => fail ~"serialization: TLS interner not set up",
|
none => fail ~"serialization: TLS interner not set up",
|
||||||
some(intr) => intr
|
some(intr) => intr
|
||||||
};
|
};
|
||||||
|
@ -39,7 +47,7 @@ fn serialize_ident<S: serializer>(s: S, i: ident) {
|
||||||
s.emit_str(*(*intr).get(i));
|
s.emit_str(*(*intr).get(i));
|
||||||
}
|
}
|
||||||
fn deserialize_ident<D: deserializer>(d: D) -> ident {
|
fn deserialize_ident<D: deserializer>(d: D) -> ident {
|
||||||
let intr = match unsafe{task::local_data_get(parse::token::interner_key)}{
|
let intr = match unsafe{task::local_data_get(interner_key!())}{
|
||||||
none => fail ~"deserialization: TLS interner not set up",
|
none => fail ~"deserialization: TLS interner not set up",
|
||||||
some(intr) => intr
|
some(intr) => intr
|
||||||
};
|
};
|
||||||
|
|
|
@ -325,8 +325,14 @@ mod special_idents {
|
||||||
type ident_interner = util::interner::interner<@~str>;
|
type ident_interner = util::interner::interner<@~str>;
|
||||||
|
|
||||||
/** Key for thread-local data for sneaking interner information to the
|
/** Key for thread-local data for sneaking interner information to the
|
||||||
* serializer/deserializer. It sounds like a hack because it is one. */
|
* serializer/deserializer. It sounds like a hack because it is one.
|
||||||
fn interner_key(+_x: @@ident_interner) { }
|
* Bonus ultra-hack: functions as keys don't work across crates,
|
||||||
|
* so we have to use a unique number. See taskgroup_key! in task.rs
|
||||||
|
* for another case of this. */
|
||||||
|
macro_rules! interner_key (
|
||||||
|
() => (unsafe::transmute::<(uint, uint), &fn(+@@token::ident_interner)>(
|
||||||
|
(-3 as uint, 0u)))
|
||||||
|
)
|
||||||
|
|
||||||
fn mk_ident_interner() -> ident_interner {
|
fn mk_ident_interner() -> ident_interner {
|
||||||
/* the indices here must correspond to the numbers in special_idents */
|
/* the indices here must correspond to the numbers in special_idents */
|
||||||
|
@ -343,8 +349,8 @@ fn mk_ident_interner() -> ident_interner {
|
||||||
|x,y| str::eq(*x, *y), init_vec);
|
|x,y| str::eq(*x, *y), init_vec);
|
||||||
|
|
||||||
/* having multiple interners will just confuse the serializer */
|
/* having multiple interners will just confuse the serializer */
|
||||||
unsafe{ assert task::local_data_get(interner_key) == none };
|
unsafe{ assert task::local_data_get(interner_key!()) == none };
|
||||||
unsafe{ task::local_data_set(interner_key, @rv) };
|
unsafe{ task::local_data_set(interner_key!(), @rv) };
|
||||||
rv
|
rv
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,18 +5,24 @@ import doc::item_utils;
|
||||||
|
|
||||||
export from_srv, extract, to_str, interner;
|
export from_srv, extract, to_str, interner;
|
||||||
|
|
||||||
|
|
||||||
|
/* can't import macros yet, so this is copied from token.rs. See its comment
|
||||||
|
* there. */
|
||||||
|
macro_rules! interner_key (
|
||||||
|
() => (unsafe::transmute::<(uint, uint),
|
||||||
|
&fn(+@@syntax::parse::token::ident_interner)>((-3 as uint, 0u)))
|
||||||
|
)
|
||||||
|
|
||||||
// Hack; rather than thread an interner through everywhere, rely on
|
// Hack; rather than thread an interner through everywhere, rely on
|
||||||
// thread-local data
|
// thread-local data
|
||||||
fn to_str(id: ast::ident) -> ~str {
|
fn to_str(id: ast::ident) -> ~str {
|
||||||
let intr = unsafe{ task::local_data_get(
|
let intr = unsafe{ task::local_data_get(interner_key!()) };
|
||||||
syntax::parse::token::interner_key) };
|
|
||||||
|
|
||||||
return *(*intr.get()).get(id);
|
return *(*intr.get()).get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn interner() -> syntax::parse::token::ident_interner {
|
fn interner() -> syntax::parse::token::ident_interner {
|
||||||
return *(unsafe{ task::local_data_get(
|
return *(unsafe{ task::local_data_get(interner_key!()) }).get();
|
||||||
syntax::parse::token::interner_key) }).get();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from_srv(
|
fn from_srv(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue