about summary refs log tree commit diff
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2013-08-15 23:16:59 +1000
committerHuon Wilson <dbau.pp+github@gmail.com>2013-08-16 14:37:24 +1000
commit3ad23552fbd463d97a3e26c900655b9d134516e4 (patch)
tree5507ee278d6cde91ab847d802f04ca372775b620
parent790e6bb3972c3b167a8e0314305740a20f62d2f0 (diff)
downloadrust-3ad23552fbd463d97a3e26c900655b9d134516e4.tar.gz
rust-3ad23552fbd463d97a3e26c900655b9d134516e4.zip
syntax: add a local_data_key macro that creates a key for access to the TLS.
This allows the internal implementation details of the TLS keys to be
changed without requiring the update of all the users. (Or, applying
changes that have to be applied for the keys to work correctly, e.g.
forcing LLVM to not merge these constants.)
-rw-r--r--src/libstd/local_data.rs4
-rw-r--r--src/libsyntax/ext/expand.rs11
-rw-r--r--src/test/compile-fail/core-tls-store-pointer.rs2
-rw-r--r--src/test/compile-fail/macro-local-data-key-priv.rs22
-rw-r--r--src/test/run-pass/macro-local-data-key.rs28
5 files changed, 64 insertions, 3 deletions
diff --git a/src/libstd/local_data.rs b/src/libstd/local_data.rs
index a73809d202c..4dbe61b0c49 100644
--- a/src/libstd/local_data.rs
+++ b/src/libstd/local_data.rs
@@ -24,8 +24,8 @@ wish to store.
 ~~~{.rust}
 use std::local_data;
 
-static key_int: local_data::Key<int> = &local_data::Key;
-static key_vector: local_data::Key<~[int]> = &local_data::Key;
+local_data_key!(key_int: int);
+local_data_key!(key_vector: ~[int]);
 
 local_data::set(key_int, 3);
 local_data::get(key_int, |opt| assert_eq!(opt, Some(&3)));
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index 1547446957e..49eb9f12212 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -957,6 +957,17 @@ pub fn std_macros() -> @str {
             println(fmt!($($arg),+))
         )
     )
+
+    // NOTE: use this after a snapshot lands to abstract the details
+    // of the TLS interface.
+    macro_rules! local_data_key (
+        ($name:ident: $ty:ty) => (
+            static $name: ::std::local_data::Key<$ty> = &::std::local_data::Key;
+        );
+        (pub $name:ident: $ty:ty) => (
+            pub static $name: ::std::local_data::Key<$ty> = &::std::local_data::Key;
+        )
+    )
 }";
 }
 
diff --git a/src/test/compile-fail/core-tls-store-pointer.rs b/src/test/compile-fail/core-tls-store-pointer.rs
index 576b1c452a5..4f60391892d 100644
--- a/src/test/compile-fail/core-tls-store-pointer.rs
+++ b/src/test/compile-fail/core-tls-store-pointer.rs
@@ -12,7 +12,7 @@
 
 use std::local_data;
 
-static key: local_data::Key<@&int> = &local_data::Key;
+local_data_key!(key: @&int)
 //~^ ERROR only 'static is allowed
 
 fn main() {}
diff --git a/src/test/compile-fail/macro-local-data-key-priv.rs b/src/test/compile-fail/macro-local-data-key-priv.rs
new file mode 100644
index 00000000000..a64c5c09584
--- /dev/null
+++ b/src/test/compile-fail/macro-local-data-key-priv.rs
@@ -0,0 +1,22 @@
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::local_data;
+
+// check that the local data keys are private by default.
+
+mod bar {
+    local_data_key!(baz: float)
+}
+
+fn main() {
+    local_data::set(bar::baz, -10.0);
+    //~^ ERROR unresolved name `bar::baz`
+}
diff --git a/src/test/run-pass/macro-local-data-key.rs b/src/test/run-pass/macro-local-data-key.rs
new file mode 100644
index 00000000000..b53d7b36d79
--- /dev/null
+++ b/src/test/run-pass/macro-local-data-key.rs
@@ -0,0 +1,28 @@
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::local_data;
+
+local_data_key!(foo: int)
+
+mod bar {
+    local_data_key!(pub baz: float)
+}
+
+fn main() {
+    local_data::get(foo, |x| assert!(x.is_none()));
+    local_data::get(bar::baz, |y| assert!(y.is_none()));
+
+    local_data::set(foo, 3);
+    local_data::set(bar::baz, -10.0);
+
+    local_data::get(foo, |x| assert_eq!(*x.unwrap(), 3));
+    local_data::get(bar::baz, |y| assert_eq!(*y.unwrap(), -10.0));
+}