|
| 1 | +use core::mem::ManuallyDrop; |
| 2 | + |
1 | 3 | use crate::rc::{Id, Ownership};
|
2 | 4 | use crate::runtime::{Class, Sel};
|
3 | 5 | use crate::{Message, MessageArguments, MessageError, MessageReceiver};
|
@@ -108,6 +110,27 @@ impl<T: ?Sized + Message, O: Ownership> MsgSendId<Option<Id<T, O>>, Id<T, O>>
|
108 | 110 | }
|
109 | 111 | }
|
110 | 112 |
|
| 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 | + |
111 | 134 | // `copy` and `mutableCopy`
|
112 | 135 | impl<T: MessageReceiver, U: ?Sized + Message, O: Ownership> MsgSendId<T, Id<U, O>>
|
113 | 136 | for RetainSemantics<false, false, false, true>
|
@@ -316,7 +339,11 @@ mod tests {
|
316 | 339 | // superclass, just to verify that the macro works.
|
317 | 340 | // TODO: Better solution!
|
318 | 341 | 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() }; |
320 | 347 |
|
321 | 348 | let _desc: Option<Id<Object, Shared>> =
|
322 | 349 | unsafe { msg_send_id![super(&obj, cls), description] };
|
|
0 commit comments