1 use std::any::{Any, TypeId};
2 use std::mem;
3 
4 use runtime::Imp;
5 
6 extern {
objc_msgSend()7     fn objc_msgSend();
objc_msgSend_stret()8     fn objc_msgSend_stret();
9 
objc_msgSendSuper()10     fn objc_msgSendSuper();
objc_msgSendSuper_stret()11     fn objc_msgSendSuper_stret();
12 }
13 
msg_send_fn<R: Any>() -> Imp14 pub fn msg_send_fn<R: Any>() -> Imp {
15     // Double-word sized fundamental data types don't use stret,
16     // but any composite type larger than 4 bytes does.
17     // <http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf>
18 
19     let type_id = TypeId::of::<R>();
20     if mem::size_of::<R>() <= 4 ||
21             type_id == TypeId::of::<i64>() ||
22             type_id == TypeId::of::<u64>() ||
23             type_id == TypeId::of::<f64>() {
24         objc_msgSend
25     } else {
26         objc_msgSend_stret
27     }
28 }
29 
msg_send_super_fn<R: Any>() -> Imp30 pub fn msg_send_super_fn<R: Any>() -> Imp {
31     let type_id = TypeId::of::<R>();
32     if mem::size_of::<R>() <= 4 ||
33             type_id == TypeId::of::<i64>() ||
34             type_id == TypeId::of::<u64>() ||
35             type_id == TypeId::of::<f64>() {
36         objc_msgSendSuper
37     } else {
38         objc_msgSendSuper_stret
39     }
40 }
41