about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorPaul Stansifer <paul.stansifer@gmail.com>2012-08-24 12:19:19 -0700
committerPaul Stansifer <paul.stansifer@gmail.com>2012-08-24 12:20:06 -0700
commitaa024acae3912d7d58e38fdd8185a115f2ab4e8f (patch)
tree36cefa71f5f06625d56ac31e7cb604ae8afdffe4 /src/libsyntax
parent0f996f70a632d1427801f20935a69a57fbb3679e (diff)
downloadrust-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')
-rw-r--r--src/libsyntax/ast.rs12
-rw-r--r--src/libsyntax/parse/token.rs14
2 files changed, 20 insertions, 6 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index b921fbf5a28..4cc161e1b5c 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -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
     };
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
 }