@@ -83,16 +83,16 @@ pub unsafe fn pop<T: 'static>(key: Key<T>) -> Option<T> {
8383 * table until explicitly removed.
8484 */
8585#[ 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 )
8888}
8989/**
9090 * Retrieve a task-local data value. It will also be kept alive in the
9191 * table until explicitly removed.
9292 */
9393#[ 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 )
9696}
9797/**
9898 * Store a value in task-local data. If this key already has a value,
@@ -142,16 +142,16 @@ fn test_tls_multitask() {
142142 set ( my_key, @~"parent data") ;
143143 do task:: spawn {
144144 // TLS shouldn't carry over.
145- assert!( get ( my_key) . is_none ( ) ) ;
145+ assert!( get ( my_key, |k| k . map ( | & k| * k ) ) . is_none ( ) ) ;
146146 set ( my_key, @~"child data") ;
147- assert ! ( * ( get( my_key) . get( ) ) ==
147+ assert ! ( * ( get( my_key, |k| k . map ( | & k| * k ) ) . get( ) ) ==
148148 ~"child data");
149149 // should be cleaned up for us
150150 }
151151 // 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");
155155 }
156156}
157157
@@ -161,7 +161,7 @@ fn test_tls_overwrite() {
161161 fn my_key(_x: @~str) { }
162162 set(my_key, @~" first data");
163163 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");
165165 }
166166}
167167
@@ -170,7 +170,7 @@ fn test_tls_pop() {
170170 unsafe {
171171 fn my_key(_x: @~str) { }
172172 set(my_key, @~" weasel");
173- assert!(*(pop(my_key).get()) == ~" weasel");
173+ assert!(*(pop(my_key, |k| k.map(|&k| *k) ).get()) == ~" weasel");
174174 // Pop must remove the data from the map.
175175 assert!(pop(my_key).is_none());
176176 }
0 commit comments