about summary refs log tree commit diff
diff options
context:
space:
mode:
-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));
+}