@@ -27,6 +27,13 @@ pub trait __MsgSendId<T, U> {
27
27
sel : Sel ,
28
28
args : A ,
29
29
) -> Result < U , MessageError > ;
30
+
31
+ unsafe fn __send_super_message_id < A : MessageArguments > (
32
+ obj : T ,
33
+ superclass : & Class ,
34
+ sel : Sel ,
35
+ args : A ,
36
+ ) -> Result < U , MessageError > ;
30
37
}
31
38
32
39
impl < T : ?Sized + Message , O : Ownership > __MsgSendId < & ' _ Class , Id < Allocated < T > , O > >
@@ -43,6 +50,19 @@ impl<T: ?Sized + Message, O: Ownership> __MsgSendId<&'_ Class, Id<Allocated<T>,
43
50
. map ( |r| Id :: new ( r) . expect ( "Failed allocating" ) )
44
51
}
45
52
}
53
+
54
+ #[ inline( always) ]
55
+ unsafe fn __send_super_message_id < A : MessageArguments > (
56
+ cls : & Class ,
57
+ superclass : & Class ,
58
+ sel : Sel ,
59
+ args : A ,
60
+ ) -> Result < Id < Allocated < T > , O > , MessageError > {
61
+ unsafe {
62
+ MessageReceiver :: send_super_message ( & cls, superclass, sel, args)
63
+ . map ( |r| Id :: new ( r) . expect ( "Failed allocating" ) )
64
+ }
65
+ }
46
66
}
47
67
48
68
impl < T : ?Sized + Message , O : Ownership > __MsgSendId < Id < Allocated < T > , O > , Option < Id < T , O > > >
@@ -57,6 +77,19 @@ impl<T: ?Sized + Message, O: Ownership> __MsgSendId<Id<Allocated<T>, O>, Option<
57
77
let obj = ManuallyDrop :: new ( obj) ;
58
78
unsafe { MessageReceiver :: send_message ( & obj, sel, args) . map ( |r| Id :: new ( r) ) }
59
79
}
80
+
81
+ #[ inline( always) ]
82
+ unsafe fn __send_super_message_id < A : MessageArguments > (
83
+ obj : Id < Allocated < T > , O > ,
84
+ superclass : & Class ,
85
+ sel : Sel ,
86
+ args : A ,
87
+ ) -> Result < Option < Id < T , O > > , MessageError > {
88
+ let obj = ManuallyDrop :: new ( obj) ;
89
+ unsafe {
90
+ MessageReceiver :: send_super_message ( & obj, superclass, sel, args) . map ( |r| Id :: new ( r) )
91
+ }
92
+ }
60
93
}
61
94
62
95
impl < T : MessageReceiver , U : ?Sized + Message , O : Ownership > __MsgSendId < T , Option < Id < U , O > > >
@@ -70,6 +103,18 @@ impl<T: MessageReceiver, U: ?Sized + Message, O: Ownership> __MsgSendId<T, Optio
70
103
) -> Result < Option < Id < U , O > > , MessageError > {
71
104
unsafe { MessageReceiver :: send_message ( & obj, sel, args) . map ( |r| Id :: new ( r) ) }
72
105
}
106
+
107
+ #[ inline( always) ]
108
+ unsafe fn __send_super_message_id < A : MessageArguments > (
109
+ obj : T ,
110
+ superclass : & Class ,
111
+ sel : Sel ,
112
+ args : A ,
113
+ ) -> Result < Option < Id < U , O > > , MessageError > {
114
+ unsafe {
115
+ MessageReceiver :: send_super_message ( & obj, superclass, sel, args) . map ( |r| Id :: new ( r) )
116
+ }
117
+ }
73
118
}
74
119
75
120
impl < T : MessageReceiver , U : Message , O : Ownership > __MsgSendId < T , Option < Id < U , O > > >
@@ -87,4 +132,19 @@ impl<T: MessageReceiver, U: Message, O: Ownership> __MsgSendId<T, Option<Id<U, O
87
132
MessageReceiver :: send_message ( & obj, sel, args) . map ( |r| Id :: retain_autoreleased ( r) )
88
133
}
89
134
}
135
+
136
+ #[ inline( always) ]
137
+ unsafe fn __send_super_message_id < A : MessageArguments > (
138
+ obj : T ,
139
+ superclass : & Class ,
140
+ sel : Sel ,
141
+ args : A ,
142
+ ) -> Result < Option < Id < U , O > > , MessageError > {
143
+ // All code between the message send and the `retain_autoreleased`
144
+ // must be able to be optimized away for this to work.
145
+ unsafe {
146
+ MessageReceiver :: send_super_message ( & obj, superclass, sel, args)
147
+ . map ( |r| Id :: retain_autoreleased ( r) )
148
+ }
149
+ }
90
150
}
0 commit comments