1
2mod malloc_buf;
3
4pub use encode::{Encode, EncodeArguments, Encoding};
5pub use message::{Message, MessageArguments, MessageError};
6
7pub use message::send_message as __send_message;
8pub use message::send_super_message as __send_super_message;
9
10#[macro_use]
11mod macros;
12
13pub mod runtime;
14pub mod declare;
15pub mod rc;
16mod encode;
17mod message;
18
19#[macro_export]
25macro_rules!objc_block {
26 (move | $ ( $ arg_ident: ident: $ arg_ty: ty), * | $ (: $ return_ty: ty) ? $ body: block) => {
27 {
28 #[repr(C)]
29 struct BlockDescriptor {
30 reserved: std::os::raw::c_ulong,
31 size: std::os::raw::c_ulong,
32 copy_helper: extern "C" fn(*mut std::os::raw::c_void, *const std::os::raw::c_void),
33 dispose_helper: extern "C" fn(*mut std::os::raw::c_void),
34 }
35
36 static DESCRIPTOR: BlockDescriptor = BlockDescriptor {
37 reserved: 0,
38 size: std::mem::size_of::<BlockLiteral>() as std::os::raw::c_ulong,
39 copy_helper,
40 dispose_helper,
41 };
42
43 #[allow(unused_unsafe)]
44 extern "C" fn copy_helper(dst: *mut std::os::raw::c_void, src: *const std::os::raw::c_void) {
45 unsafe {
46 std::ptr::write(
47 &mut (*(dst as *mut BlockLiteral)).inner as *mut _,
48 (&*(src as *const BlockLiteral)).inner.clone()
49 );
50 }
51 }
52
53 #[allow(unused_unsafe)]
54 extern "C" fn dispose_helper(src: *mut std::os::raw::c_void) {
55 unsafe {
56 std::ptr::drop_in_place(src as *mut BlockLiteral);
57 }
58 }
59
60 #[allow(unused_unsafe)]
61 extern "C" fn invoke(literal: *mut BlockLiteral, $ ( $ arg_ident: $ arg_ty), *) $ ( -> $ return_ty) ? {
62 let literal = unsafe {&mut *literal};
63 literal.inner.lock().unwrap()( $ ( $ arg_ident), *)
64 }
65
66 #[repr(C)]
67 struct BlockLiteral {
68 isa: *const std::os::raw::c_void,
69 flags: std::os::raw::c_int,
70 reserved: std::os::raw::c_int,
71 invoke: extern "C" fn(*mut BlockLiteral, $ ( $ arg_ty), *) $ ( -> $ return_ty) ?,
72 descriptor: *const BlockDescriptor,
73 inner: ::std::sync::Arc<::std::sync::Mutex<dyn Fn( $ ( $ arg_ty), *) $ ( -> $ return_ty) ? >>,
74 }
75
76 #[allow(unused_unsafe)]
77 BlockLiteral {
78 isa: unsafe {_NSConcreteStackBlock.as_ptr() as *const std::os::raw::c_void},
79 flags: 1 << 25,
80 reserved: 0,
81 invoke,
82 descriptor: &DESCRIPTOR,
83 inner: ::std::sync::Arc::new(::std::sync::Mutex::new(move | $ ( $ arg_ident: $ arg_ty), * | {
84 $ body
85 }))
86 }
87 }
88 }
89}
90
91
92
93#[macro_export]
94macro_rules!objc_block_invoke {
95 ( $ inp: expr, invoke ( $ ( ($ arg_ident: expr): $ arg_ty: ty), *) $ ( -> $ return_ty: ty) ?) => {
96 {
97 #[repr(C)]
98 struct BlockLiteral {
99 isa: *const std::os::raw::c_void,
100 flags: std::os::raw::c_int,
101 reserved: std::os::raw::c_int,
102 invoke: extern "C" fn(*mut BlockLiteral, $ ( $ arg_ty), *) $ ( -> $ return_ty) ?,
103 }
104
105 let block: &mut BlockLiteral = &mut *( $ inp as *mut _);
106 (block.invoke)(block, $ ( $ arg_ident), *)
107 }
108 }
109}