@@ -49,6 +49,23 @@ impl<T: ?Sized + Message, O: Ownership> MsgSendId<&'_ Class, Id<T, O>>
49
49
}
50
50
}
51
51
52
+ // Super: `new`, TODO: Can this ever happen?
53
+ impl < T : ?Sized + Message , O : Ownership > MsgSendSuperId < & ' _ Class , Id < T , O > >
54
+ for Assert < true , false , false , false >
55
+ {
56
+ #[ inline( always) ]
57
+ unsafe fn send_super_message_id < A : MessageArguments > (
58
+ obj : & Class ,
59
+ superclass : & Class ,
60
+ sel : Sel ,
61
+ args : A ,
62
+ ) -> Result < Option < Id < T , O > > , MessageError > {
63
+ unsafe {
64
+ MessageReceiver :: send_super_message ( obj, superclass, sel, args) . map ( |r| Id :: new ( r) )
65
+ }
66
+ }
67
+ }
68
+
52
69
// `alloc`, should mark the return value as "allocated, not initialized" somehow
53
70
impl < T : ?Sized + Message , O : Ownership > MsgSendId < & ' _ Class , Id < T , O > >
54
71
for Assert < false , true , false , false >
@@ -63,6 +80,23 @@ impl<T: ?Sized + Message, O: Ownership> MsgSendId<&'_ Class, Id<T, O>>
63
80
}
64
81
}
65
82
83
+ // Super: `alloc`, TODO: Can this ever happen?
84
+ impl < T : ?Sized + Message , O : Ownership > MsgSendSuperId < & ' _ Class , Id < T , O > >
85
+ for Assert < false , true , false , false >
86
+ {
87
+ #[ inline( always) ]
88
+ unsafe fn send_super_message_id < A : MessageArguments > (
89
+ cls : & Class ,
90
+ superclass : & Class ,
91
+ sel : Sel ,
92
+ args : A ,
93
+ ) -> Result < Option < Id < T , O > > , MessageError > {
94
+ unsafe {
95
+ MessageReceiver :: send_super_message ( cls, superclass, sel, args) . map ( |r| Id :: new ( r) )
96
+ }
97
+ }
98
+ }
99
+
66
100
// `init`, should mark the input value as "allocated, not initialized" somehow
67
101
//
68
102
// The generic bound allows `init` to take both `Option<Id>` and `Id`.
@@ -121,6 +155,23 @@ impl<T: MessageReceiver, U: ?Sized + Message, O: Ownership> MsgSendId<T, Id<U, O
121
155
}
122
156
}
123
157
158
+ // Super: `copy` and `mutableCopy`. TODO: Will this ever happen?
159
+ impl < T : MessageReceiver , U : ?Sized + Message , O : Ownership > MsgSendSuperId < T , Id < U , O > >
160
+ for Assert < false , false , false , true >
161
+ {
162
+ #[ inline( always) ]
163
+ unsafe fn send_super_message_id < A : MessageArguments > (
164
+ obj : T ,
165
+ superclass : & Class ,
166
+ sel : Sel ,
167
+ args : A ,
168
+ ) -> Result < Option < Id < U , O > > , MessageError > {
169
+ unsafe {
170
+ MessageReceiver :: send_super_message ( obj, superclass, sel, args) . map ( |r| Id :: new ( r) )
171
+ }
172
+ }
173
+ }
174
+
124
175
// All other selectors
125
176
impl < T : MessageReceiver , U : Message , O : Ownership > MsgSendId < T , Id < U , O > >
126
177
for Assert < false , false , false , false >
@@ -260,17 +311,25 @@ mod tests {
260
311
}
261
312
262
313
#[ test]
314
+ #[ ignore = "TMP" ]
263
315
fn test_msg_send_super_id ( ) {
264
316
// We send the messages to the class itself instead of it's actual
265
317
// superclass, just to verify that the macro works.
266
318
// TODO: Better solution!
267
319
let cls = class ! ( NSObject ) ;
268
320
269
- let obj = unsafe { msg_send_id ! [ cls, alloc] } ;
321
+ let _obj: Id < Object , Owned > = unsafe { msg_send_id ! [ super ( cls, cls) , new] . unwrap ( ) } ;
322
+
323
+ let obj = unsafe { msg_send_id ! [ super ( cls, cls) , alloc] } ;
270
324
271
325
let obj = obj. unwrap ( ) ; // Required on super
272
326
let obj: Id < Object , Owned > = unsafe { msg_send_id ! [ super ( obj, cls) , init] . unwrap ( ) } ;
273
327
328
+ let _copy: Id < Object , Shared > = unsafe { msg_send_id ! [ super ( & obj, cls) , copy] . unwrap ( ) } ;
329
+
330
+ let _mutable_copy: Id < Object , Shared > =
331
+ unsafe { msg_send_id ! [ super ( & obj, cls) , mutableCopy] . unwrap ( ) } ;
332
+
274
333
let _desc: Option < Id < Object , Shared > > =
275
334
unsafe { msg_send_id ! [ super ( & obj, cls) , description] } ;
276
335
}
0 commit comments