1010
1111// helper for transmutation, shown below.
1212type RustClosure = ( int , int ) ;
13- struct Handler < T , U : Copy > {
13+ pub struct Handler < T , U > {
1414 handle : RustClosure ,
1515 prev : Option < @Handler < T , U > > ,
1616}
1717
18- struct Condition < T , U : Copy > {
18+ pub struct Condition < T , U > {
19+ name : & static /str ,
1920 key : task:: local_data:: LocalDataKey < Handler < T , U > >
2021}
2122
22- impl < T , U : Copy > Condition < T , U > {
23+ impl < T , U > Condition < T , U > {
2324
2425 fn trap ( & self , h : & self /fn ( & T ) ->U ) -> Trap /& self <T , U > {
2526 unsafe {
@@ -32,7 +33,9 @@ impl<T, U: Copy> Condition<T,U> {
3233
3334 fn raise ( t : & T ) -> U {
3435 do self . raise_default ( t) {
35- fail ~"Unhandled condition";
36+ fail fmt ! ( "Unhandled condition: %s: %?" ,
37+ self . name,
38+ t) ;
3639 }
3740 }
3841
@@ -65,13 +68,13 @@ impl<T, U: Copy> Condition<T,U> {
6568
6669
6770
68- struct Trap < T , U : Copy > {
71+ struct Trap < T , U > {
6972 cond : & Condition < T , U > ,
7073 handler : @Handler < T , U >
7174}
7275
73- impl < T , U : Copy > Trap < T , U > {
74- fn in < V : Copy > ( & self , inner : & self /fn ( ) -> V ) -> V {
76+ impl < T , U > Trap < T , U > {
77+ fn in < V > ( & self , inner : & self /fn ( ) -> V ) -> V {
7578 unsafe {
7679 let _g = Guard { cond : self . cond } ;
7780 debug ! ( "Trap: pushing handler to TLS" ) ;
@@ -81,7 +84,7 @@ impl<T, U: Copy> Trap<T,U> {
8184 }
8285}
8386
84- struct Guard < T , U : Copy > {
87+ struct Guard < T , U > {
8588 cond : & Condition < T , U > ,
8689 drop {
8790 unsafe {
@@ -105,21 +108,21 @@ struct Guard<T, U:Copy> {
105108#[ cfg( test) ]
106109mod test {
107110
108- fn sadness_key ( _x : @ Handler < int , int > ) { }
109- const sadness_condition : Condition < int , int > =
110- Condition { key : sadness_key } ;
111+ condition ! {
112+ sadness : int -> int ;
113+ }
111114
112115 fn trouble ( i : int ) {
113116 debug ! ( "trouble: raising conition" ) ;
114- let j = sadness_condition . raise ( & i) ;
117+ let j = sadness :: cond . raise ( & i) ;
115118 debug ! ( "trouble: handler recovered with %d" , j) ;
116119 }
117120
118121 fn nested_trap_test_inner ( ) {
119122
120123 let mut inner_trapped = false ;
121124
122- do sadness_condition . trap ( |_j| {
125+ do sadness :: cond . trap ( |_j| {
123126 debug ! ( "nested_trap_test_inner: in handler" ) ;
124127 inner_trapped = true ;
125128 0
@@ -136,7 +139,7 @@ mod test {
136139
137140 let mut outer_trapped = false ;
138141
139- do sadness_condition . trap ( |_j| {
142+ do sadness :: cond . trap ( |_j| {
140143 debug ! ( "nested_trap_test_outer: in handler" ) ;
141144 outer_trapped = true ; 0
142145 } ) . in {
@@ -152,12 +155,12 @@ mod test {
152155
153156 let mut inner_trapped = false ;
154157
155- do sadness_condition . trap ( |_j| {
158+ do sadness :: cond . trap ( |_j| {
156159 debug ! ( "nested_reraise_trap_test_inner: in handler" ) ;
157160 inner_trapped = true ;
158161 let i = 10 ;
159162 debug ! ( "nested_reraise_trap_test_inner: handler re-raising" ) ;
160- sadness_condition . raise ( & i)
163+ sadness :: cond . raise ( & i)
161164 } ) . in {
162165 debug ! ( "nested_reraise_trap_test_inner: in protected block" ) ;
163166 trouble ( 1 ) ;
@@ -171,7 +174,7 @@ mod test {
171174
172175 let mut outer_trapped = false ;
173176
174- do sadness_condition . trap ( |_j| {
177+ do sadness :: cond . trap ( |_j| {
175178 debug ! ( "nested_reraise_trap_test_outer: in handler" ) ;
176179 outer_trapped = true ; 0
177180 } ) . in {
@@ -187,9 +190,9 @@ mod test {
187190
188191 let mut trapped = false ;
189192
190- do sadness_condition . trap ( |j| {
193+ do sadness :: cond . trap ( |j| {
191194 debug ! ( "test_default: in handler" ) ;
192- sadness_condition . raise_default ( j, || { trapped=true ; 5 } )
195+ sadness :: cond . raise_default ( j, || { trapped=true ; 5 } )
193196 } ) . in {
194197 debug ! ( "test_default: in protected block" ) ;
195198 trouble ( 1 ) ;
0 commit comments