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:
bors 2013-08-16 08:05:10 -07:00
commit a1674b6150
5 changed files with 64 additions and 3 deletions

View file

@ -24,8 +24,8 @@ wish to store.
~~~{.rust} ~~~{.rust}
use std::local_data; use std::local_data;
static key_int: local_data::Key<int> = &local_data::Key; local_data_key!(key_int: int);
static key_vector: local_data::Key<~[int]> = &local_data::Key; local_data_key!(key_vector: ~[int]);
local_data::set(key_int, 3); local_data::set(key_int, 3);
local_data::get(key_int, |opt| assert_eq!(opt, Some(&3))); local_data::get(key_int, |opt| assert_eq!(opt, Some(&3)));

View file

@ -957,6 +957,17 @@ pub fn std_macros() -> @str {
println(fmt!($($arg),+)) 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;
)
)
}"; }";
} }

View file

@ -12,7 +12,7 @@
use std::local_data; use std::local_data;
static key: local_data::Key<@&int> = &local_data::Key; local_data_key!(key: @&int)
//~^ ERROR only 'static is allowed //~^ ERROR only 'static is allowed
fn main() {} fn main() {}

View 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`
}

View 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));
}