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 = &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 or the MIT license +// , 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 or the MIT license +// , 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)); +}