Skip to content

Commit 01f8bf4

Browse files
committed
Relax ?Sized bounds everywhere
Possible since Message: Sized
1 parent 8cdc355 commit 01f8bf4

23 files changed

+277
-240
lines changed

objc2-encode/src/encode.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -496,8 +496,8 @@ encode_pointer_impls!(
496496
/// well. So trying to do it quickly requires generating a polynomial amount of
497497
/// implementations, which IMO is overkill for such a small issue.
498498
///
499-
/// Using `?Sized` is probably not safe here because C functions can only take
500-
/// and return items with a known size.
499+
/// Using `?Sized` is not safe here because C functions can only take and
500+
/// return items with a known size.
501501
macro_rules! encode_fn_pointer_impl {
502502
(@ $FnTy: ty, $($Arg: ident),*) => {
503503
unsafe impl<Ret: Encode, $($Arg: Encode),*> Encode for $FnTy {

objc2/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
1717
determining the name of a specific class.
1818
* Allow directly specifying class name in declare_class! macro.
1919

20+
### Changed
21+
* **BREAKING**: Slightly changed when a type implements `?Sized` to support
22+
`extern type` in the future. In particular, `Message` now requires `Sized`.
23+
2024
### Removed
2125
* **BREAKING**: `MaybeUninit` no longer implements `IvarType` directly; use
2226
`Ivar::write` instead.

objc2/src/__macro_helpers.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::__sel_inner;
22
use crate::rc::{Allocated, Id, Ownership};
33
use crate::runtime::{Class, Object, Sel};
4-
use crate::{Message, MessageArguments, MessageReceiver};
4+
use crate::{Message, MessageArguments, MessageReceiver, Thin};
55

66
pub use crate::cache::CachedClass;
77
pub use crate::cache::CachedSel;
@@ -83,7 +83,7 @@ type Init = RetainSemantics<false, false, true, false>;
8383
type CopyOrMutCopy = RetainSemantics<false, false, false, true>;
8484
type Other = RetainSemantics<false, false, false, false>;
8585

86-
pub trait MsgSendId<T, U: ?Sized, O: Ownership> {
86+
pub trait MsgSendId<T, U: ?Sized + Thin, O: Ownership> {
8787
unsafe fn send_message_id<A: MessageArguments, R: MaybeUnwrap<U, O>>(
8888
obj: T,
8989
sel: Sel,
@@ -162,7 +162,7 @@ impl<T: MessageReceiver, U: ?Sized + Message, O: Ownership> MsgSendId<T, U, O> f
162162
}
163163
}
164164

165-
impl<T: MessageReceiver, U: Message, O: Ownership> MsgSendId<T, U, O> for Other {
165+
impl<T: MessageReceiver, U: ?Sized + Message, O: Ownership> MsgSendId<T, U, O> for Other {
166166
#[inline]
167167
#[track_caller]
168168
unsafe fn send_message_id<A: MessageArguments, R: MaybeUnwrap<U, O>>(
@@ -186,14 +186,14 @@ impl<T: MessageReceiver, U: Message, O: Ownership> MsgSendId<T, U, O> for Other
186186
}
187187
}
188188

189-
pub trait MaybeUnwrap<T: ?Sized, O: Ownership> {
189+
pub trait MaybeUnwrap<T: ?Sized + Thin, O: Ownership> {
190190
fn maybe_unwrap<'a, Failed: MsgSendIdFailed<'a>>(
191191
obj: Option<Id<T, O>>,
192192
args: Failed::Args,
193193
) -> Self;
194194
}
195195

196-
impl<T: ?Sized, O: Ownership> MaybeUnwrap<T, O> for Option<Id<T, O>> {
196+
impl<T: ?Sized + Thin, O: Ownership> MaybeUnwrap<T, O> for Option<Id<T, O>> {
197197
#[inline]
198198
#[track_caller]
199199
fn maybe_unwrap<'a, Failed: MsgSendIdFailed<'a>>(
@@ -204,7 +204,7 @@ impl<T: ?Sized, O: Ownership> MaybeUnwrap<T, O> for Option<Id<T, O>> {
204204
}
205205
}
206206

207-
impl<T: ?Sized, O: Ownership> MaybeUnwrap<T, O> for Id<T, O> {
207+
impl<T: ?Sized + Thin, O: Ownership> MaybeUnwrap<T, O> for Id<T, O> {
208208
#[inline]
209209
#[track_caller]
210210
fn maybe_unwrap<'a, Failed: MsgSendIdFailed<'a>>(

objc2/src/class_type.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ pub unsafe trait ClassType: Message {
6767
/// [`Deref`]: std::ops::Deref
6868
/// [`Deref::Target`]: std::ops::Deref::Target
6969
/// [`runtime::Object`]: crate::runtime::Object
70-
type Super: Message;
70+
type Super: ?Sized + Message;
7171

7272
/// The name of the Objective-C class that this type represents.
7373
const NAME: &'static str;

objc2/src/declare.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ use crate::encode::{Encode, EncodeArguments, Encoding, RefEncode};
127127
use crate::ffi;
128128
use crate::runtime::{Bool, Class, Imp, Object, Protocol, Sel};
129129
use crate::sel;
130-
use crate::Message;
130+
use crate::{Message, Thin};
131131

132132
pub use ivar::{InnerIvarType, Ivar, IvarType};
133133
pub use ivar_drop::IvarDrop;
@@ -142,7 +142,7 @@ pub(crate) mod private {
142142
/// function pointer types.
143143
pub trait MethodImplementation: private::Sealed {
144144
/// The callee type of the method.
145-
type Callee: RefEncode + ?Sized;
145+
type Callee: RefEncode + ?Sized + Thin;
146146
/// The return type of the method.
147147
type Ret: Encode;
148148
/// The argument types of the method.
@@ -156,14 +156,14 @@ macro_rules! method_decl_impl {
156156
(@<$($l:lifetime),*> T, $r:ident, $f:ty, $($t:ident),*) => {
157157
impl<$($l,)* T, $r, $($t),*> private::Sealed for $f
158158
where
159-
T: Message + ?Sized,
159+
T: ?Sized + Message,
160160
$r: Encode,
161161
$($t: Encode,)*
162162
{}
163163

164164
impl<$($l,)* T, $r, $($t),*> MethodImplementation for $f
165165
where
166-
T: Message + ?Sized,
166+
T: ?Sized + Message,
167167
$r: Encode,
168168
$($t: Encode,)*
169169
{
@@ -336,7 +336,7 @@ impl ClassBuilder {
336336
/// when the method is invoked from Objective-C.
337337
pub unsafe fn add_method<T, F>(&mut self, sel: Sel, func: F)
338338
where
339-
T: Message + ?Sized,
339+
T: ?Sized + Message,
340340
F: MethodImplementation<Callee = T>,
341341
{
342342
let encs = F::Args::ENCODINGS;

objc2/src/declare/ivar_drop.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ unsafe impl<T: Sized> InnerIvarType for IvarDrop<Option<Box<T>>> {
9898
}
9999
}
100100

101-
impl<T: Message, O: Ownership> super::ivar::private::Sealed for IvarDrop<Id<T, O>> {}
101+
impl<T: ?Sized + Message, O: Ownership> super::ivar::private::Sealed for IvarDrop<Id<T, O>> {}
102102
// SAFETY: `Id` is `NonNull<T>`, and hence safe to store as a pointer.
103103
//
104104
// The user ensures that the Id has been initialized in an `init` method
@@ -107,7 +107,7 @@ impl<T: Message, O: Ownership> super::ivar::private::Sealed for IvarDrop<Id<T, O
107107
// Note: We could technically do `impl InnerIvarType for Ivar<Id<T, O>>`
108108
// directly today, but since we can't do so for `Box` (because that is
109109
// `#[fundamental]`), I think it makes sense to handle them similarly.
110-
unsafe impl<T: Message, O: Ownership> InnerIvarType for IvarDrop<Id<T, O>> {
110+
unsafe impl<T: ?Sized + Message, O: Ownership> InnerIvarType for IvarDrop<Id<T, O>> {
111111
const __ENCODING: Encoding = <*const T as EncodeConvert>::__ENCODING;
112112

113113
type __Inner = Option<Id<T, O>>;
@@ -137,12 +137,15 @@ unsafe impl<T: Message, O: Ownership> InnerIvarType for IvarDrop<Id<T, O>> {
137137
}
138138
}
139139

140-
impl<T: Message, O: Ownership> super::ivar::private::Sealed for IvarDrop<Option<Id<T, O>>> {}
140+
impl<T: ?Sized + Message, O: Ownership> super::ivar::private::Sealed
141+
for IvarDrop<Option<Id<T, O>>>
142+
{
143+
}
141144
// SAFETY: `Id<T, O>` guarantees the null-pointer optimization.
142145
//
143146
// This is valid to initialize as all-zeroes, so the user doesn't have to do
144147
// anything to initialize it.
145-
unsafe impl<T: Message, O: Ownership> InnerIvarType for IvarDrop<Option<Id<T, O>>> {
148+
unsafe impl<T: ?Sized + Message, O: Ownership> InnerIvarType for IvarDrop<Option<Id<T, O>>> {
146149
const __ENCODING: Encoding = <*const T as EncodeConvert>::__ENCODING;
147150

148151
type __Inner = Option<Id<T, O>>;

objc2/src/foundation/array.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -52,29 +52,29 @@ __inner_extern_class!(
5252
// `T: PartialEq` bound correct because `NSArray` does deep (instead of
5353
// shallow) equality comparisons.
5454
#[derive(PartialEq, Eq, Hash)]
55-
pub struct NSArray<T: Message, O: Ownership = Shared> {
55+
pub struct NSArray<T: ?Sized + Message, O: Ownership = Shared> {
5656
item: PhantomData<Id<T, O>>,
5757
notunwindsafe: PhantomData<&'static mut ()>,
5858
}
5959

60-
unsafe impl<T: Message, O: Ownership> ClassType for NSArray<T, O> {
60+
unsafe impl<T: ?Sized + Message, O: Ownership> ClassType for NSArray<T, O> {
6161
type Super = NSObject;
6262
}
6363
);
6464

6565
// SAFETY: Same as Id<T, O> (which is what NSArray effectively stores).
66-
unsafe impl<T: Message + Sync + Send> Sync for NSArray<T, Shared> {}
67-
unsafe impl<T: Message + Sync + Send> Send for NSArray<T, Shared> {}
68-
unsafe impl<T: Message + Sync> Sync for NSArray<T, Owned> {}
69-
unsafe impl<T: Message + Send> Send for NSArray<T, Owned> {}
66+
unsafe impl<T: ?Sized + Message + Sync + Send> Sync for NSArray<T, Shared> {}
67+
unsafe impl<T: ?Sized + Message + Sync + Send> Send for NSArray<T, Shared> {}
68+
unsafe impl<T: ?Sized + Message + Sync> Sync for NSArray<T, Owned> {}
69+
unsafe impl<T: ?Sized + Message + Send> Send for NSArray<T, Owned> {}
7070

7171
// Also same as Id<T, O>
72-
impl<T: Message + RefUnwindSafe, O: Ownership> RefUnwindSafe for NSArray<T, O> {}
73-
impl<T: Message + RefUnwindSafe> UnwindSafe for NSArray<T, Shared> {}
74-
impl<T: Message + UnwindSafe> UnwindSafe for NSArray<T, Owned> {}
72+
impl<T: ?Sized + Message + RefUnwindSafe, O: Ownership> RefUnwindSafe for NSArray<T, O> {}
73+
impl<T: ?Sized + Message + RefUnwindSafe> UnwindSafe for NSArray<T, Shared> {}
74+
impl<T: ?Sized + Message + UnwindSafe> UnwindSafe for NSArray<T, Owned> {}
7575

7676
#[track_caller]
77-
pub(crate) unsafe fn with_objects<T: Message + ?Sized, R: Message, O: Ownership>(
77+
pub(crate) unsafe fn with_objects<T: ?Sized + Message, R: ?Sized + Message, O: Ownership>(
7878
cls: &Class,
7979
objects: &[&T],
8080
) -> Id<R, O> {
@@ -89,7 +89,7 @@ pub(crate) unsafe fn with_objects<T: Message + ?Sized, R: Message, O: Ownership>
8989

9090
extern_methods!(
9191
/// Generic creation methods.
92-
unsafe impl<T: Message, O: Ownership> NSArray<T, O> {
92+
unsafe impl<T: ?Sized + Message, O: Ownership> NSArray<T, O> {
9393
/// Get an empty array.
9494
pub fn new() -> Id<Self, Shared> {
9595
// SAFETY:
@@ -120,7 +120,7 @@ extern_methods!(
120120
}
121121

122122
/// Creation methods that produce shared arrays.
123-
unsafe impl<T: Message> NSArray<T, Shared> {
123+
unsafe impl<T: ?Sized + Message> NSArray<T, Shared> {
124124
pub fn from_slice(slice: &[Id<T, Shared>]) -> Id<Self, Shared> {
125125
// SAFETY: Taking `&T` would not be sound, since the `&T` could come
126126
// from an `Id<T, Owned>` that would now no longer be owned!
@@ -133,7 +133,7 @@ extern_methods!(
133133
}
134134

135135
/// Generic accessor methods.
136-
unsafe impl<T: Message, O: Ownership> NSArray<T, O> {
136+
unsafe impl<T: ?Sized + Message, O: Ownership> NSArray<T, O> {
137137
#[doc(alias = "count")]
138138
#[sel(count)]
139139
pub fn len(&self) -> usize;
@@ -200,7 +200,7 @@ extern_methods!(
200200
}
201201

202202
/// Accessor methods that work on shared arrays.
203-
unsafe impl<T: Message> NSArray<T, Shared> {
203+
unsafe impl<T: ?Sized + Message> NSArray<T, Shared> {
204204
#[doc(alias = "objectAtIndex:")]
205205
pub fn get_retained(&self, index: usize) -> Id<T, Shared> {
206206
let obj = self.get(index).unwrap();
@@ -217,7 +217,7 @@ extern_methods!(
217217
}
218218

219219
/// Accessor methods that work on owned arrays.
220-
unsafe impl<T: Message> NSArray<T, Owned> {
220+
unsafe impl<T: ?Sized + Message> NSArray<T, Owned> {
221221
#[doc(alias = "objectAtIndex:")]
222222
pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
223223
// TODO: Replace this check with catching the thrown NSRangeException
@@ -242,28 +242,28 @@ extern_methods!(
242242
/// This is implemented as a shallow copy.
243243
///
244244
/// As such, it is only possible when the array's contents are `Shared`.
245-
unsafe impl<T: Message> NSCopying for NSArray<T, Shared> {
245+
unsafe impl<T: ?Sized + Message> NSCopying for NSArray<T, Shared> {
246246
type Ownership = Shared;
247247
type Output = NSArray<T, Shared>;
248248
}
249249

250250
/// This is implemented as a shallow copy.
251-
unsafe impl<T: Message> NSMutableCopying for NSArray<T, Shared> {
251+
unsafe impl<T: ?Sized + Message> NSMutableCopying for NSArray<T, Shared> {
252252
type Output = NSMutableArray<T, Shared>;
253253
}
254254

255-
impl<T: Message> alloc::borrow::ToOwned for NSArray<T, Shared> {
255+
impl<T: ?Sized + Message> alloc::borrow::ToOwned for NSArray<T, Shared> {
256256
type Owned = Id<NSArray<T, Shared>, Shared>;
257257
fn to_owned(&self) -> Self::Owned {
258258
self.copy()
259259
}
260260
}
261261

262-
unsafe impl<T: Message, O: Ownership> NSFastEnumeration for NSArray<T, O> {
262+
unsafe impl<T: ?Sized + Message, O: Ownership> NSFastEnumeration for NSArray<T, O> {
263263
type Item = T;
264264
}
265265

266-
impl<'a, T: Message, O: Ownership> IntoIterator for &'a NSArray<T, O> {
266+
impl<'a, T: ?Sized + Message, O: Ownership> IntoIterator for &'a NSArray<T, O> {
267267
type Item = &'a T;
268268
type IntoIter = NSFastEnumerator<'a, NSArray<T, O>>;
269269

@@ -272,21 +272,21 @@ impl<'a, T: Message, O: Ownership> IntoIterator for &'a NSArray<T, O> {
272272
}
273273
}
274274

275-
impl<T: Message, O: Ownership> Index<usize> for NSArray<T, O> {
275+
impl<T: ?Sized + Message, O: Ownership> Index<usize> for NSArray<T, O> {
276276
type Output = T;
277277

278278
fn index(&self, index: usize) -> &T {
279279
self.get(index).unwrap()
280280
}
281281
}
282282

283-
impl<T: Message> IndexMut<usize> for NSArray<T, Owned> {
283+
impl<T: ?Sized + Message> IndexMut<usize> for NSArray<T, Owned> {
284284
fn index_mut(&mut self, index: usize) -> &mut T {
285285
self.get_mut(index).unwrap()
286286
}
287287
}
288288

289-
impl<T: Message, O: Ownership> DefaultId for NSArray<T, O> {
289+
impl<T: ?Sized + Message, O: Ownership> DefaultId for NSArray<T, O> {
290290
type Ownership = Shared;
291291

292292
#[inline]
@@ -295,7 +295,7 @@ impl<T: Message, O: Ownership> DefaultId for NSArray<T, O> {
295295
}
296296
}
297297

298-
impl<T: fmt::Debug + Message, O: Ownership> fmt::Debug for NSArray<T, O> {
298+
impl<T: ?Sized + fmt::Debug + Message, O: Ownership> fmt::Debug for NSArray<T, O> {
299299
#[inline]
300300
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
301301
f.debug_list().entries(self.iter_fast()).finish()

objc2/src/foundation/copying.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub unsafe trait NSCopying: Message {
2828
///
2929
/// This is usually `Self`, but e.g. `NSMutableString` returns `NSString`.
3030
/// TODO: Verify???
31-
type Output: Message;
31+
type Output: ?Sized + Message;
3232

3333
fn copy(&self) -> Id<Self::Output, Self::Ownership> {
3434
unsafe { msg_send_id![self, copy] }
@@ -40,7 +40,7 @@ pub unsafe trait NSCopying: Message {
4040
/// Note that the `mutableCopy` selector must return an owned object!
4141
pub unsafe trait NSMutableCopying: Message {
4242
/// TODO
43-
type Output: Message;
43+
type Output: ?Sized + Message;
4444

4545
fn mutable_copy(&self) -> Id<Self::Output, Owned> {
4646
unsafe { msg_send_id![self, mutableCopy] }

0 commit comments

Comments
 (0)