Skip to content

Commit 9109614

Browse files
committed
Added a verify_message feature.
This fixes #10.
1 parent c6756b5 commit 9109614

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ exclude = [".gitignore", ".travis.yml", "ios-tests/**", "xtests/**"]
1414

1515
[features]
1616
exception = ["objc_exception"]
17+
verify_message = []
1718

1819
[dependencies]
1920
libc = ">= 0.1, < 0.3"

src/message.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ message_args_impl!(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k
176176

177177
#[doc(hidden)]
178178
#[inline(always)]
179+
#[cfg(not(feature = "verify_message"))]
179180
pub unsafe fn send_message<T, A, R>(obj: *const T, sel: Sel, args: A)
180181
-> Result<R, String>
181182
where T: Message, A: MessageArguments, R: Any {
@@ -184,12 +185,51 @@ pub unsafe fn send_message<T, A, R>(obj: *const T, sel: Sel, args: A)
184185

185186
#[doc(hidden)]
186187
#[inline(always)]
188+
#[cfg(feature = "verify_message")]
189+
pub unsafe fn send_message<T, A, R>(obj: *const T, sel: Sel, args: A)
190+
-> Result<R, String>
191+
where T: Message, A: MessageArguments + ::verify::EncodeArguments,
192+
R: Any + ::Encode {
193+
use verify::verify_message_signature;
194+
195+
let cls = if obj.is_null() {
196+
return Err(format!("Messaging {:?} to nil", sel));
197+
} else {
198+
(*(obj as *const Object)).class()
199+
};
200+
201+
verify_message_signature::<A, R>(cls, sel).map(|_| {
202+
args.send(obj as *mut T, sel)
203+
})
204+
}
205+
206+
#[doc(hidden)]
207+
#[inline(always)]
208+
#[cfg(not(feature = "verify_message"))]
187209
pub unsafe fn send_super_message<T, A, R>(obj: *const T, superclass: &Class,
188210
sel: Sel, args: A) -> Result<R, String>
189211
where T: Message, A: MessageArguments, R: Any {
190212
Ok(args.send_super(obj as *mut T, superclass, sel))
191213
}
192214

215+
#[doc(hidden)]
216+
#[inline(always)]
217+
#[cfg(feature = "verify_message")]
218+
pub unsafe fn send_super_message<T, A, R>(obj: *const T, superclass: &Class,
219+
sel: Sel, args: A) -> Result<R, String>
220+
where T: Message, A: MessageArguments + ::verify::EncodeArguments,
221+
R: Any + ::Encode {
222+
use verify::verify_message_signature;
223+
224+
if obj.is_null() {
225+
return Err(format!("Messaging {:?} to nil", sel));
226+
}
227+
228+
verify_message_signature::<A, R>(superclass, sel).map(|_| {
229+
args.send_super(obj as *mut T, superclass, sel)
230+
})
231+
}
232+
193233
#[cfg(test)]
194234
mod tests {
195235
use runtime::Object;

src/verify.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#![cfg_attr(not(feature = "verify_message"), allow(dead_code))]
2+
13
use runtime::{Class, Object, Sel};
24
use {Encode, Encoding};
35

0 commit comments

Comments
 (0)