Skip to content

Commit e187ba8

Browse files
committed
Added a verify_message method to Message.
1 parent afcdfbd commit e187ba8

File tree

2 files changed

+29
-13
lines changed

2 files changed

+29
-13
lines changed

src/message/mod.rs

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::fmt;
44
use std::mem;
55

66
use runtime::{Class, Imp, Object, Sel};
7+
use {Encode, EncodeArguments};
78

89
mod verify;
910

@@ -28,6 +29,7 @@ mod platform;
2829
mod platform;
2930

3031
use self::platform::{msg_send_fn, msg_send_super_fn};
32+
use self::verify::verify_message_signature;
3133

3234
/// Specifies the superclass of an instance.
3335
#[repr(C)]
@@ -61,10 +63,17 @@ pub unsafe trait Message {
6163
#[cfg(feature = "verify_message")]
6264
unsafe fn send_message<A, R>(&self, sel: Sel, args: A)
6365
-> 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 {
6668
send_message(self, sel, args)
6769
}
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+
}
6877
}
6978

7079
unsafe impl Message for Object { }
@@ -171,10 +180,8 @@ pub unsafe fn send_message<T, A, R>(obj: *const T, sel: Sel, args: A)
171180
#[cfg(feature = "verify_message")]
172181
pub unsafe fn send_message<T, A, R>(obj: *const T, sel: Sel, args: A)
173182
-> 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 {
178185
let cls = if obj.is_null() {
179186
return Err(MessageError(format!("Messaging {:?} to nil", sel)));
180187
} else {
@@ -210,10 +217,8 @@ pub unsafe fn send_super_message<T, A, R>(obj: *const T, superclass: &Class,
210217
#[cfg(feature = "verify_message")]
211218
pub unsafe fn send_super_message<T, A, R>(obj: *const T, superclass: &Class,
212219
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 {
217222
if obj.is_null() {
218223
return Err(MessageError(format!("Messaging {:?} to nil", sel)));
219224
}
@@ -225,8 +230,9 @@ pub unsafe fn send_super_message<T, A, R>(obj: *const T, superclass: &Class,
225230

226231
#[cfg(test)]
227232
mod tests {
228-
use runtime::Object;
229233
use test_utils;
234+
use runtime::Object;
235+
use super::Message;
230236

231237
#[test]
232238
fn test_send_message() {
@@ -281,4 +287,16 @@ mod tests {
281287
assert!(foo == 6);
282288
}
283289
}
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+
}
284302
}

src/message/verify.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![cfg_attr(not(feature = "verify_message"), allow(dead_code))]
2-
31
use runtime::{Class, Sel};
42
use {Encode, EncodeArguments};
53
use super::MessageError;

0 commit comments

Comments
 (0)