1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use super::conditional_try;
use crate::encode::Encode;
use crate::ffi;
use crate::runtime::{Class, Imp, Object, Sel};
use crate::MessageArguments;
#[cfg(target_arch = "x86")]
#[path = "x86.rs"]
mod arch;
#[cfg(target_arch = "x86_64")]
#[path = "x86_64.rs"]
mod arch;
#[cfg(target_arch = "arm")]
#[path = "arm.rs"]
mod arch;
#[cfg(target_arch = "aarch64")]
#[path = "arm64.rs"]
mod arch;
#[allow(clippy::missing_safety_doc)]
unsafe trait MsgSendFn: Encode {
const MSG_SEND: Imp;
const MSG_SEND_SUPER: Imp;
}
#[inline]
#[track_caller]
pub(crate) unsafe fn send_unverified<A, R>(receiver: *mut Object, sel: Sel, args: A) -> R
where
A: MessageArguments,
R: Encode,
{
let msg_send_fn = R::MSG_SEND;
unsafe { conditional_try(|| A::__invoke(msg_send_fn, receiver, sel, args)) }
}
#[inline]
#[track_caller]
pub(crate) unsafe fn send_super_unverified<A, R>(
receiver: *mut Object,
superclass: &Class,
sel: Sel,
args: A,
) -> R
where
A: MessageArguments,
R: Encode,
{
let superclass: *const Class = superclass;
let mut sup = ffi::objc_super {
receiver: receiver.cast(),
super_class: superclass.cast(),
};
let receiver: *mut ffi::objc_super = &mut sup;
let receiver = receiver.cast();
let msg_send_fn = R::MSG_SEND_SUPER;
unsafe { conditional_try(|| A::__invoke(msg_send_fn, receiver, sel, args)) }
}