@@ -4,6 +4,7 @@ use std::fmt;
4
4
use std:: mem;
5
5
6
6
use runtime:: { Class , Imp , Object , Sel } ;
7
+ use { Encode , EncodeArguments } ;
7
8
8
9
mod verify;
9
10
@@ -28,6 +29,7 @@ mod platform;
28
29
mod platform;
29
30
30
31
use self :: platform:: { msg_send_fn, msg_send_super_fn} ;
32
+ use self :: verify:: verify_message_signature;
31
33
32
34
/// Specifies the superclass of an instance.
33
35
#[ repr( C ) ]
@@ -61,10 +63,17 @@ pub unsafe trait Message {
61
63
#[ cfg( feature = "verify_message" ) ]
62
64
unsafe fn send_message < A , R > ( & self , sel : Sel , args : A )
63
65
-> Result < R , MessageError >
64
- where Self : Sized , A : MessageArguments + :: EncodeArguments ,
65
- R : Any + :: Encode {
66
+ where Self : Sized , A : MessageArguments + EncodeArguments ,
67
+ R : Any + Encode {
66
68
send_message ( self , sel, args)
67
69
}
70
+
71
+ fn verify_message < A , R > ( & self , sel : Sel ) -> Result < ( ) , MessageError >
72
+ where Self : Sized , A : MessageArguments + EncodeArguments ,
73
+ R : Any + Encode {
74
+ let obj = unsafe { & * ( self as * const _ as * const Object ) } ;
75
+ verify_message_signature :: < A , R > ( obj. class ( ) , sel)
76
+ }
68
77
}
69
78
70
79
unsafe impl Message for Object { }
@@ -171,10 +180,8 @@ pub unsafe fn send_message<T, A, R>(obj: *const T, sel: Sel, args: A)
171
180
#[ cfg( feature = "verify_message" ) ]
172
181
pub unsafe fn send_message < T , A , R > ( obj : * const T , sel : Sel , args : A )
173
182
-> Result < R , MessageError >
174
- where T : Message , A : MessageArguments + :: EncodeArguments ,
175
- R : Any + :: Encode {
176
- use self :: verify:: verify_message_signature;
177
-
183
+ where T : Message , A : MessageArguments + EncodeArguments ,
184
+ R : Any + Encode {
178
185
let cls = if obj. is_null ( ) {
179
186
return Err ( MessageError ( format ! ( "Messaging {:?} to nil" , sel) ) ) ;
180
187
} else {
@@ -210,10 +217,8 @@ pub unsafe fn send_super_message<T, A, R>(obj: *const T, superclass: &Class,
210
217
#[ cfg( feature = "verify_message" ) ]
211
218
pub unsafe fn send_super_message < T , A , R > ( obj : * const T , superclass : & Class ,
212
219
sel : Sel , args : A ) -> Result < R , MessageError >
213
- where T : Message , A : MessageArguments + :: EncodeArguments ,
214
- R : Any + :: Encode {
215
- use self :: verify:: verify_message_signature;
216
-
220
+ where T : Message , A : MessageArguments + EncodeArguments ,
221
+ R : Any + Encode {
217
222
if obj. is_null ( ) {
218
223
return Err ( MessageError ( format ! ( "Messaging {:?} to nil" , sel) ) ) ;
219
224
}
@@ -225,8 +230,9 @@ pub unsafe fn send_super_message<T, A, R>(obj: *const T, superclass: &Class,
225
230
226
231
#[ cfg( test) ]
227
232
mod tests {
228
- use runtime:: Object ;
229
233
use test_utils;
234
+ use runtime:: Object ;
235
+ use super :: Message ;
230
236
231
237
#[ test]
232
238
fn test_send_message ( ) {
@@ -281,4 +287,16 @@ mod tests {
281
287
assert ! ( foo == 6 ) ;
282
288
}
283
289
}
290
+
291
+ #[ test]
292
+ fn test_verify_message ( ) {
293
+ let obj = test_utils:: custom_object ( ) ;
294
+ assert ! ( obj. verify_message:: <( ) , u32 >( sel!( foo) ) . is_ok( ) ) ;
295
+ assert ! ( obj. verify_message:: <( u32 , ) , ( ) >( sel!( setFoo: ) ) . is_ok( ) ) ;
296
+
297
+ // Incorrect types
298
+ assert ! ( obj. verify_message:: <( ) , u64 >( sel!( setFoo: ) ) . is_err( ) ) ;
299
+ // Unimplemented selector
300
+ assert ! ( obj. verify_message:: <( u32 , ) , ( ) >( sel!( setFoo) ) . is_err( ) ) ;
301
+ }
284
302
}
0 commit comments