diff options
| author | Paul Stansifer <paul.stansifer@gmail.com> | 2012-08-24 12:19:19 -0700 |
|---|---|---|
| committer | Paul Stansifer <paul.stansifer@gmail.com> | 2012-08-24 12:20:06 -0700 |
| commit | aa024acae3912d7d58e38fdd8185a115f2ab4e8f (patch) | |
| tree | 36cefa71f5f06625d56ac31e7cb604ae8afdffe4 /src/libsyntax/parse | |
| parent | 0f996f70a632d1427801f20935a69a57fbb3679e (diff) | |
| download | rust-aa024acae3912d7d58e38fdd8185a115f2ab4e8f.tar.gz rust-aa024acae3912d7d58e38fdd8185a115f2ab4e8f.zip | |
Use a faked-up function as a key, because functions aren't identical cross-crate in Windows.
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/token.rs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 8eb9270efe2..759d99511fe 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -325,8 +325,14 @@ mod special_idents { type ident_interner = util::interner::interner<@~str>; /** Key for thread-local data for sneaking interner information to the - * serializer/deserializer. It sounds like a hack because it is one. */ -fn interner_key(+_x: @@ident_interner) { } + * serializer/deserializer. It sounds like a hack because it is one. + * 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 { /* 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); /* having multiple interners will just confuse the serializer */ - unsafe{ assert task::local_data_get(interner_key) == none }; - unsafe{ task::local_data_set(interner_key, @rv) }; + unsafe{ assert task::local_data_get(interner_key!()) == none }; + unsafe{ task::local_data_set(interner_key!(), @rv) }; rv } |
