Skip to content

Commit 1045636

Browse files
committed
Test ivar access of type id on a class created by Objective-C
1 parent f5b83fd commit 1045636

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

tests/extern/test_object.m

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
@interface MyTestObject: NSObject <NSObject> {
44
int var1;
55
BOOL var2;
6+
id var3;
67
}
78

89
+ (instancetype) getAutoreleasedInstance;
@@ -12,6 +13,9 @@ - (int) var1;
1213
- (void) addToVar1: (int) number;
1314

1415
- (BOOL) var2;
16+
17+
- (id) var3;
18+
- (void) setVar3: (id) obj;
1519
@end
1620

1721

@@ -21,6 +25,7 @@ - (id)init {
2125
if (self) {
2226
var1 = 42;
2327
var2 = YES;
28+
// var3 = nil;
2429
}
2530
return self;
2631
}
@@ -44,4 +49,12 @@ - (void) addToVar1: (int) number {
4449
- (BOOL) var2 {
4550
return var2;
4651
}
52+
53+
- (id) var3 {
54+
return var3;
55+
}
56+
57+
- (void) setVar3: (id) obj {
58+
var3 = obj;
59+
}
4760
@end

tests/src/test_object.rs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use core::mem::size_of;
1+
use core::mem::{size_of, ManuallyDrop};
22
use std::os::raw::c_int;
33

44
use objc2::rc::{autoreleasepool, AutoreleasePool, Id, Owned};
5-
use objc2::runtime::{Bool, Class, Protocol};
5+
use objc2::runtime::{Bool, Class, Object, Protocol};
66
#[cfg(feature = "malloc")]
77
use objc2::sel;
88
use objc2::{class, msg_send, msg_send_bool};
@@ -67,6 +67,22 @@ impl MyTestObject {
6767
fn var2_ivar_mut(&mut self) -> &mut Bool {
6868
unsafe { self.inner.ivar_mut("var2") }
6969
}
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+
}
7086
}
7187

7288
#[cfg(feature = "malloc")]
@@ -112,6 +128,7 @@ fn test_class() {
112128
isa: *const Class,
113129
var1: c_int,
114130
var2: Bool,
131+
var3: *mut NSObject,
115132
}
116133
size_of::<MyTestObjectLayout>()
117134
});
@@ -158,4 +175,19 @@ fn test_object() {
158175
*obj.var2_ivar_mut() = Bool::NO;
159176
assert!(!obj.var2());
160177
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);
161193
}

0 commit comments

Comments
 (0)