10
10
11
11
// helper for transmutation, shown below.
12
12
type RustClosure = ( int , int ) ;
13
- struct Handler < T , U : Copy > {
13
+ pub struct Handler < T , U > {
14
14
handle : RustClosure ,
15
15
prev : Option < @Handler < T , U > > ,
16
16
}
17
17
18
- struct Condition < T , U : Copy > {
18
+ pub struct Condition < T , U > {
19
+ name : & static /str ,
19
20
key : task:: local_data:: LocalDataKey < Handler < T , U > >
20
21
}
21
22
22
- impl < T , U : Copy > Condition < T , U > {
23
+ impl < T , U > Condition < T , U > {
23
24
24
25
fn trap ( & self , h : & self /fn ( & T ) ->U ) -> Trap /& self <T , U > {
25
26
unsafe {
@@ -32,7 +33,9 @@ impl<T, U: Copy> Condition<T,U> {
32
33
33
34
fn raise ( t : & T ) -> U {
34
35
do self . raise_default ( t) {
35
- fail ~"Unhandled condition";
36
+ fail fmt ! ( "Unhandled condition: %s: %?" ,
37
+ self . name,
38
+ t) ;
36
39
}
37
40
}
38
41
@@ -65,13 +68,13 @@ impl<T, U: Copy> Condition<T,U> {
65
68
66
69
67
70
68
- struct Trap < T , U : Copy > {
71
+ struct Trap < T , U > {
69
72
cond : & Condition < T , U > ,
70
73
handler : @Handler < T , U >
71
74
}
72
75
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 {
75
78
unsafe {
76
79
let _g = Guard { cond : self . cond } ;
77
80
debug ! ( "Trap: pushing handler to TLS" ) ;
@@ -81,7 +84,7 @@ impl<T, U: Copy> Trap<T,U> {
81
84
}
82
85
}
83
86
84
- struct Guard < T , U : Copy > {
87
+ struct Guard < T , U > {
85
88
cond : & Condition < T , U > ,
86
89
drop {
87
90
unsafe {
@@ -105,21 +108,21 @@ struct Guard<T, U:Copy> {
105
108
#[ cfg( test) ]
106
109
mod test {
107
110
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
+ }
111
114
112
115
fn trouble ( i : int ) {
113
116
debug ! ( "trouble: raising conition" ) ;
114
- let j = sadness_condition . raise ( & i) ;
117
+ let j = sadness :: cond . raise ( & i) ;
115
118
debug ! ( "trouble: handler recovered with %d" , j) ;
116
119
}
117
120
118
121
fn nested_trap_test_inner ( ) {
119
122
120
123
let mut inner_trapped = false ;
121
124
122
- do sadness_condition . trap ( |_j| {
125
+ do sadness :: cond . trap ( |_j| {
123
126
debug ! ( "nested_trap_test_inner: in handler" ) ;
124
127
inner_trapped = true ;
125
128
0
@@ -136,7 +139,7 @@ mod test {
136
139
137
140
let mut outer_trapped = false ;
138
141
139
- do sadness_condition . trap ( |_j| {
142
+ do sadness :: cond . trap ( |_j| {
140
143
debug ! ( "nested_trap_test_outer: in handler" ) ;
141
144
outer_trapped = true ; 0
142
145
} ) . in {
@@ -152,12 +155,12 @@ mod test {
152
155
153
156
let mut inner_trapped = false ;
154
157
155
- do sadness_condition . trap ( |_j| {
158
+ do sadness :: cond . trap ( |_j| {
156
159
debug ! ( "nested_reraise_trap_test_inner: in handler" ) ;
157
160
inner_trapped = true ;
158
161
let i = 10 ;
159
162
debug ! ( "nested_reraise_trap_test_inner: handler re-raising" ) ;
160
- sadness_condition . raise ( & i)
163
+ sadness :: cond . raise ( & i)
161
164
} ) . in {
162
165
debug ! ( "nested_reraise_trap_test_inner: in protected block" ) ;
163
166
trouble ( 1 ) ;
@@ -171,7 +174,7 @@ mod test {
171
174
172
175
let mut outer_trapped = false ;
173
176
174
- do sadness_condition . trap ( |_j| {
177
+ do sadness :: cond . trap ( |_j| {
175
178
debug ! ( "nested_reraise_trap_test_outer: in handler" ) ;
176
179
outer_trapped = true ; 0
177
180
} ) . in {
@@ -187,9 +190,9 @@ mod test {
187
190
188
191
let mut trapped = false ;
189
192
190
- do sadness_condition . trap ( |j| {
193
+ do sadness :: cond . trap ( |j| {
191
194
debug ! ( "test_default: in handler" ) ;
192
- sadness_condition . raise_default ( j, || { trapped=true ; 5 } )
195
+ sadness :: cond . raise_default ( j, || { trapped=true ; 5 } )
193
196
} ) . in {
194
197
debug ! ( "test_default: in protected block" ) ;
195
198
trouble ( 1 ) ;
0 commit comments