@@ -83,16 +83,16 @@ pub unsafe fn pop<T: 'static>(key: Key<T>) -> Option<T> {
83
83
* table until explicitly removed.
84
84
*/
85
85
#[ cfg( stage0) ]
86
- pub unsafe fn get < T : ' static > ( key : Key < @T > ) -> Option < @T > {
87
- local_get ( Handle :: new ( ) , key, |loc| loc . map ( | & x| * x ) )
86
+ pub unsafe fn get < T : ' static , U > ( key : Key < @T > , f : & fn ( Option < & @T > ) -> U ) -> U {
87
+ local_get ( Handle :: new ( ) , key, f )
88
88
}
89
89
/**
90
90
* Retrieve a task-local data value. It will also be kept alive in the
91
91
* table until explicitly removed.
92
92
*/
93
93
#[ cfg( not( stage0) ) ]
94
- pub unsafe fn get < T : ' static > ( key : Key < @ T > ) -> Option < @ T > {
95
- local_get ( Handle :: new ( ) , key, |loc| loc . map ( | & x| * x ) )
94
+ pub unsafe fn get < T : ' static , U > ( key : Key < T > , f : & fn ( Option < & T > ) -> U ) -> U {
95
+ local_get ( Handle :: new ( ) , key, f )
96
96
}
97
97
/**
98
98
* Store a value in task-local data. If this key already has a value,
@@ -142,16 +142,16 @@ fn test_tls_multitask() {
142
142
set ( my_key, @~"parent data") ;
143
143
do task:: spawn {
144
144
// TLS shouldn't carry over.
145
- assert!( get ( my_key) . is_none ( ) ) ;
145
+ assert!( get ( my_key, |k| k . map ( | & k| * k ) ) . is_none ( ) ) ;
146
146
set ( my_key, @~"child data") ;
147
- assert ! ( * ( get( my_key) . get( ) ) ==
147
+ assert ! ( * ( get( my_key, |k| k . map ( | & k| * k ) ) . get( ) ) ==
148
148
~"child data");
149
149
// should be cleaned up for us
150
150
}
151
151
// Must work multiple times
152
- assert!(*(get(my_key).get()) == ~" parent data");
153
- assert!(*(get(my_key).get()) == ~" parent data");
154
- assert!(*(get(my_key).get()) == ~" parent data");
152
+ assert!(*(get(my_key, |k| k.map(|&k| *k) ).get()) == ~" parent data");
153
+ assert!(*(get(my_key, |k| k.map(|&k| *k) ).get()) == ~" parent data");
154
+ assert!(*(get(my_key, |k| k.map(|&k| *k) ).get()) == ~" parent data");
155
155
}
156
156
}
157
157
@@ -161,7 +161,7 @@ fn test_tls_overwrite() {
161
161
fn my_key(_x: @~str) { }
162
162
set(my_key, @~" first data");
163
163
set(my_key, @~" next data"); // Shouldn't leak.
164
- assert!(*(get(my_key).get()) == ~" next data");
164
+ assert!(*(get(my_key, |k| k.map(|&k| *k) ).get()) == ~" next data");
165
165
}
166
166
}
167
167
@@ -170,7 +170,7 @@ fn test_tls_pop() {
170
170
unsafe {
171
171
fn my_key(_x: @~str) { }
172
172
set(my_key, @~" weasel");
173
- assert!(*(pop(my_key).get()) == ~" weasel");
173
+ assert!(*(pop(my_key, |k| k.map(|&k| *k) ).get()) == ~" weasel");
174
174
// Pop must remove the data from the map.
175
175
assert!(pop(my_key).is_none());
176
176
}
0 commit comments