|
1 | | -use core::mem::size_of; |
| 1 | +use core::mem::{size_of, ManuallyDrop}; |
2 | 2 | use std::os::raw::c_int; |
3 | 3 |
|
4 | 4 | use objc2::rc::{autoreleasepool, AutoreleasePool, Id, Owned}; |
5 | | -use objc2::runtime::{Bool, Class, Protocol}; |
| 5 | +use objc2::runtime::{Bool, Class, Object, Protocol}; |
6 | 6 | #[cfg(feature = "malloc")] |
7 | 7 | use objc2::sel; |
8 | 8 | use objc2::{class, msg_send, msg_send_bool}; |
@@ -67,6 +67,22 @@ impl MyTestObject { |
67 | 67 | fn var2_ivar_mut(&mut self) -> &mut Bool { |
68 | 68 | unsafe { self.inner.ivar_mut("var2") } |
69 | 69 | } |
| 70 | + |
| 71 | + fn var3(&self) -> *mut Object { |
| 72 | + unsafe { msg_send![self, var3] } |
| 73 | + } |
| 74 | + |
| 75 | + fn set_var3(&mut self, obj: *mut Object) { |
| 76 | + unsafe { msg_send![self, setVar3: obj] } |
| 77 | + } |
| 78 | + |
| 79 | + fn var3_ivar(&self) -> &*mut Object { |
| 80 | + unsafe { self.inner.ivar("var3") } |
| 81 | + } |
| 82 | + |
| 83 | + fn var3_ivar_mut(&mut self) -> &mut *mut Object { |
| 84 | + unsafe { self.inner.ivar_mut("var3") } |
| 85 | + } |
70 | 86 | } |
71 | 87 |
|
72 | 88 | #[cfg(feature = "malloc")] |
@@ -112,6 +128,7 @@ fn test_class() { |
112 | 128 | isa: *const Class, |
113 | 129 | var1: c_int, |
114 | 130 | var2: Bool, |
| 131 | + var3: *mut NSObject, |
115 | 132 | } |
116 | 133 | size_of::<MyTestObjectLayout>() |
117 | 134 | }); |
@@ -158,4 +175,19 @@ fn test_object() { |
158 | 175 | *obj.var2_ivar_mut() = Bool::NO; |
159 | 176 | assert!(!obj.var2()); |
160 | 177 | assert!(obj.var2_ivar().is_false()); |
| 178 | + |
| 179 | + assert!(obj.var3().is_null()); |
| 180 | + assert!(obj.var3_ivar().is_null()); |
| 181 | + |
| 182 | + let obj2 = ManuallyDrop::new(NSObject::new()).as_ptr().cast::<Object>(); |
| 183 | + obj.set_var3(obj2); |
| 184 | + assert_eq!(obj.var3(), obj2); |
| 185 | + assert_eq!(*obj.var3_ivar(), obj2); |
| 186 | + |
| 187 | + let obj3 = ManuallyDrop::new(NSObject::new()).as_ptr().cast::<Object>(); |
| 188 | + *obj.var3_ivar_mut() = obj3; |
| 189 | + assert_ne!(obj.var3(), obj2); |
| 190 | + assert_ne!(*obj.var3_ivar(), obj2); |
| 191 | + assert_eq!(obj.var3(), obj3); |
| 192 | + assert_eq!(*obj.var3_ivar(), obj3); |
161 | 193 | } |
0 commit comments