Use a faked-up function as a key, because functions aren't identical cross-crate in Windows.

This commit is contained in:
Paul Stansifer
2012-08-24 12:19:19 -07:00
parent 0f996f70a6
commit aa024acae3
3 changed files with 30 additions and 10 deletions

View File

@@ -30,8 +30,16 @@ fn deserialize_span<D>(_d: D) -> span {
#[auto_serialize]
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) {
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",
some(intr) => intr
};
@@ -39,7 +47,7 @@ fn serialize_ident<S: serializer>(s: S, i: ident) {
s.emit_str(*(*intr).get(i));
}
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",
some(intr) => intr
};