makepad_objc_sys/
lib.rs

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//#[cfg(test)]
20//mod test_utils;
21
22
23
24#[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}