auto merge of #8534 : huonw/rust/tls-key-macro, r=alexcrichton
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.)
This commit is contained in:
commit
a1674b6150
5 changed files with 64 additions and 3 deletions
|
@ -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)));
|
||||
|
|
|
@ -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;
|
||||
)
|
||||
)
|
||||
}";
|
||||
}
|
||||
|
||||
|
|
|
@ -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() {}
|
||||
|
|
22
src/test/compile-fail/macro-local-data-key-priv.rs
Normal file
22
src/test/compile-fail/macro-local-data-key-priv.rs
Normal file
|
@ -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`
|
||||
}
|
28
src/test/run-pass/macro-local-data-key.rs
Normal file
28
src/test/run-pass/macro-local-data-key.rs
Normal file
|
@ -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));
|
||||
}
|
Loading…
Reference in a new issue