@@ -106,6 +106,7 @@ impl<T: 'static> fmt::Debug for LocalKey<T> {
106
106
}
107
107
}
108
108
109
+ #[ cfg( not( stage0) ) ]
109
110
/// Declare a new thread local storage key of type `std::thread::LocalKey`.
110
111
///
111
112
/// # Syntax
@@ -145,6 +146,7 @@ macro_rules! thread_local {
145
146
) ;
146
147
}
147
148
149
+ #[ cfg( not( stage0) ) ]
148
150
#[ doc( hidden) ]
149
151
#[ unstable( feature = "thread_local_internals" ,
150
152
reason = "should not be necessary" ,
@@ -177,6 +179,71 @@ macro_rules! __thread_local_inner {
177
179
}
178
180
}
179
181
182
+ #[ cfg( stage0) ]
183
+ /// Declare a new thread local storage key of type `std::thread::LocalKey`.
184
+ #[ macro_export]
185
+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
186
+ #[ allow_internal_unstable]
187
+ macro_rules! thread_local {
188
+ // rule 0: empty (base case for the recursion)
189
+ ( ) => { } ;
190
+
191
+ // rule 1: process multiple declarations where the first one is private
192
+ ( $( #[ $attr: meta] ) * static $name: ident: $t: ty = $init: expr; $( $rest: tt) * ) => (
193
+ thread_local!( $( #[ $attr] ) * static $name: $t = $init) ; // go to rule 2
194
+ thread_local!( $( $rest) * ) ;
195
+ ) ;
196
+
197
+ // rule 2: handle a single private declaration
198
+ ( $( #[ $attr: meta] ) * static $name: ident: $t: ty = $init: expr) => (
199
+ $( #[ $attr] ) * static $name: $crate:: thread:: LocalKey <$t> =
200
+ __thread_local_inner!( $t, $init) ;
201
+ ) ;
202
+
203
+ // rule 3: handle multiple declarations where the first one is public
204
+ ( $( #[ $attr: meta] ) * pub static $name: ident: $t: ty = $init: expr; $( $rest: tt) * ) => (
205
+ thread_local!( $( #[ $attr] ) * pub static $name: $t = $init) ; // go to rule 4
206
+ thread_local!( $( $rest) * ) ;
207
+ ) ;
208
+
209
+ // rule 4: handle a single public declaration
210
+ ( $( #[ $attr: meta] ) * pub static $name: ident: $t: ty = $init: expr) => (
211
+ $( #[ $attr] ) * pub static $name: $crate:: thread:: LocalKey <$t> =
212
+ __thread_local_inner!( $t, $init) ;
213
+ ) ;
214
+ }
215
+
216
+ #[ cfg( stage0) ]
217
+ #[ doc( hidden) ]
218
+ #[ unstable( feature = "thread_local_internals" ,
219
+ reason = "should not be necessary" ,
220
+ issue = "0" ) ]
221
+ #[ macro_export]
222
+ #[ allow_internal_unstable]
223
+ macro_rules! __thread_local_inner {
224
+ ( $t: ty, $init: expr) => { {
225
+ fn __init( ) -> $t { $init }
226
+
227
+ fn __getit( ) -> $crate:: option:: Option <
228
+ & ' static $crate:: cell:: UnsafeCell <
229
+ $crate:: option:: Option <$t>>>
230
+ {
231
+ #[ thread_local]
232
+ #[ cfg( target_thread_local) ]
233
+ static __KEY: $crate:: thread:: __FastLocalKeyInner<$t> =
234
+ $crate:: thread:: __FastLocalKeyInner:: new( ) ;
235
+
236
+ #[ cfg( not( target_thread_local) ) ]
237
+ static __KEY: $crate:: thread:: __OsLocalKeyInner<$t> =
238
+ $crate:: thread:: __OsLocalKeyInner:: new( ) ;
239
+
240
+ __KEY. get( )
241
+ }
242
+
243
+ $crate:: thread:: LocalKey :: new( __getit, __init)
244
+ } }
245
+ }
246
+
180
247
/// Indicator of the state of a thread local storage key.
181
248
#[ unstable( feature = "thread_local_state" ,
182
249
reason = "state querying was recently added" ,
0 commit comments