@@ -30,7 +30,7 @@ pub struct WeakId<T: ?Sized> {
30
30
item : PhantomData < Id < T , Shared > > ,
31
31
}
32
32
33
- impl < T : Message > WeakId < T > {
33
+ impl < T : Message + ? Sized + ptr :: Thin > WeakId < T > {
34
34
/// Construct a new [`WeakId`] referencing the given shared [`Id`].
35
35
#[ doc( alias = "objc_initWeak" ) ]
36
36
pub fn new ( obj : & Id < T , Shared > ) -> Self {
@@ -45,7 +45,8 @@ impl<T: Message> WeakId<T> {
45
45
///
46
46
/// The object must be valid or null.
47
47
unsafe fn new_inner ( obj : * mut T ) -> Self {
48
- let inner = Box :: new ( UnsafeCell :: new ( ptr:: null_mut ( ) ) ) ;
48
+ let null = ptr:: from_raw_parts_mut ( ptr:: null_mut ( ) , ( ) ) ;
49
+ let inner = Box :: new ( UnsafeCell :: new ( null) ) ;
49
50
// SAFETY: `ptr` will never move, and the caller verifies `obj`
50
51
let _ = unsafe { ffi:: objc_initWeak ( inner. get ( ) as _ , obj as _ ) } ;
51
52
Self {
@@ -64,7 +65,8 @@ impl<T: Message> WeakId<T> {
64
65
#[ inline]
65
66
pub fn load ( & self ) -> Option < Id < T , Shared > > {
66
67
let ptr: * mut * mut ffi:: objc_object = self . inner . get ( ) as _ ;
67
- let obj = unsafe { ffi:: objc_loadWeakRetained ( ptr) } as * mut T ;
68
+ let obj = unsafe { ffi:: objc_loadWeakRetained ( ptr) } as * mut ( ) ;
69
+ let obj: * mut T = ptr:: from_raw_parts_mut ( obj, ( ) ) ;
68
70
NonNull :: new ( obj) . map ( |obj| unsafe { Id :: new ( obj) } )
69
71
}
70
72
}
@@ -77,12 +79,12 @@ impl<T: ?Sized> Drop for WeakId<T> {
77
79
}
78
80
}
79
81
80
- // TODO: Add ?Sized
81
- impl < T > Clone for WeakId < T > {
82
+ impl < T : ?Sized + ptr:: Thin > Clone for WeakId < T > {
82
83
/// Makes a clone of the `WeakId` that points to the same object.
83
84
#[ doc( alias = "objc_copyWeak" ) ]
84
85
fn clone ( & self ) -> Self {
85
- let ptr = Box :: new ( UnsafeCell :: new ( ptr:: null_mut ( ) ) ) ;
86
+ let null = ptr:: from_raw_parts_mut ( ptr:: null_mut ( ) , ( ) ) ;
87
+ let ptr = Box :: new ( UnsafeCell :: new ( null) ) ;
86
88
unsafe { ffi:: objc_copyWeak ( ptr. get ( ) as _ , self . inner . get ( ) as _ ) } ;
87
89
Self {
88
90
inner : ptr,
@@ -91,14 +93,14 @@ impl<T> Clone for WeakId<T> {
91
93
}
92
94
}
93
95
94
- // TODO: Add ?Sized
95
- impl < T : Message > Default for WeakId < T > {
96
+ impl < T : Message + ?Sized + ptr:: Thin > Default for WeakId < T > {
96
97
/// Constructs a new `WeakId<T>` that doesn't reference any object.
97
98
///
98
99
/// Calling [`Self::load`] on the return value always gives [`None`].
99
100
fn default ( ) -> Self {
101
+ let null = ptr:: from_raw_parts_mut ( ptr:: null_mut ( ) , ( ) ) ;
100
102
// SAFETY: The pointer is null
101
- unsafe { Self :: new_inner ( ptr :: null_mut ( ) ) }
103
+ unsafe { Self :: new_inner ( null ) }
102
104
}
103
105
}
104
106
0 commit comments