Skip to content

Commit 8106a8d

Browse files
committed
Support msg_send_id![super, init]
1 parent a792820 commit 8106a8d

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

objc2/src/__macro_helpers.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use core::mem::ManuallyDrop;
2+
13
use crate::rc::{Id, Ownership};
24
use crate::runtime::{Class, Sel};
35
use crate::{Message, MessageArguments, MessageError, MessageReceiver};
@@ -108,6 +110,27 @@ impl<T: ?Sized + Message, O: Ownership> MsgSendId<Option<Id<T, O>>, Id<T, O>>
108110
}
109111
}
110112

113+
// Super: `init`. Takes a non-null object and returns a non-initialized object
114+
//
115+
// Should theoretically make it easy to use in declared `init` methods, once
116+
// they've received an ergonomics overhaul
117+
impl<T: ?Sized + Message, O: Ownership> MsgSendSuperId<Id<T, O>, Id<T, O>>
118+
for RetainSemantics<false, false, true, false>
119+
{
120+
#[inline(always)]
121+
unsafe fn send_super_message_id<A: MessageArguments>(
122+
obj: Id<T, O>,
123+
superclass: &Class,
124+
sel: Sel,
125+
args: A,
126+
) -> Result<Option<Id<T, O>>, MessageError> {
127+
let ptr = Id::consume_as_ptr(ManuallyDrop::new(obj));
128+
unsafe {
129+
MessageReceiver::send_super_message(ptr, superclass, sel, args).map(|r| Id::new(r))
130+
}
131+
}
132+
}
133+
111134
// `copy` and `mutableCopy`
112135
impl<T: MessageReceiver, U: ?Sized + Message, O: Ownership> MsgSendId<T, Id<U, O>>
113136
for RetainSemantics<false, false, false, true>
@@ -316,7 +339,11 @@ mod tests {
316339
// superclass, just to verify that the macro works.
317340
// TODO: Better solution!
318341
let cls = class!(NSObject);
319-
let obj: Id<Object, Owned> = unsafe { msg_send_id![cls, new].unwrap() };
342+
343+
let obj = unsafe { msg_send_id![cls, alloc] };
344+
345+
let obj = obj.unwrap(); // Required on super
346+
let obj: Id<Object, Owned> = unsafe { msg_send_id![super(obj, cls), init].unwrap() };
320347

321348
let _desc: Option<Id<Object, Shared>> =
322349
unsafe { msg_send_id![super(&obj, cls), description] };

0 commit comments

Comments
 (0)