Skip to content

Commit 57f97bf

Browse files
committed
Remove hack to support CustomObject test utility
1 parent aabe354 commit 57f97bf

File tree

4 files changed

+51
-69
lines changed

4 files changed

+51
-69
lines changed

crates/objc2/src/declare/ivar.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ mod tests {
320320
use crate::declare::{IvarBool, IvarEncode};
321321
use crate::mutability::Mutable;
322322
use crate::rc::Id;
323-
use crate::runtime::{MessageReceiver, NSObject};
323+
use crate::runtime::NSObject;
324324
use crate::{declare_class, msg_send, msg_send_id, test_utils, ClassType};
325325

326326
struct TestIvar;
@@ -351,12 +351,7 @@ mod tests {
351351
let mut obj = test_utils::custom_object();
352352
let _: () = unsafe { msg_send![&mut obj, setFoo: 42u32] };
353353

354-
let obj = unsafe {
355-
obj.__as_raw_receiver()
356-
.cast::<IvarTestObject>()
357-
.as_ref()
358-
.unwrap()
359-
};
354+
let obj = unsafe { Id::as_ptr(&obj).cast::<IvarTestObject>().as_ref().unwrap() };
360355
assert_eq!(*obj.foo, 42);
361356
}
362357

crates/objc2/src/runtime/message.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -635,17 +635,6 @@ unsafe impl<'a> MessageReceiver for &'a AnyClass {
635635
}
636636
}
637637

638-
#[cfg(test)]
639-
mod test_utils_hack {
640-
use super::*;
641-
use crate::test_utils::CustomObject;
642-
643-
// TODO: Remove the need for this hack
644-
impl private::Sealed for &CustomObject {}
645-
impl private::Sealed for &mut CustomObject {}
646-
impl private::Sealed for ManuallyDrop<CustomObject> {}
647-
}
648-
649638
mod message_args_private {
650639
pub trait Sealed {}
651640
}

crates/objc2/src/runtime/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1544,7 +1544,7 @@ mod tests {
15441544
let object = test_utils::custom_object();
15451545
assert_eq!(
15461546
format!("{:?}", &*object),
1547-
format!("<CustomObject: {:p}>", &*object)
1547+
format!("CustomObject(<CustomObject: {:p}>)", &*object)
15481548
);
15491549
}
15501550

crates/objc2/src/test_utils.rs

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,54 @@
1-
use core::mem::ManuallyDrop;
21
use core::ops::{Deref, DerefMut};
32
use std::os::raw::c_char;
43
use std::sync::Once;
54

65
use crate::declare::{ClassBuilder, ProtocolBuilder};
7-
use crate::runtime::{AnyClass, AnyObject, AnyProtocol, MessageReceiver, Sel};
8-
use crate::{ffi, Encode, Encoding};
9-
use crate::{msg_send, sel};
6+
use crate::encode::{Encode, Encoding, RefEncode};
7+
use crate::rc::Id;
8+
use crate::runtime::{AnyClass, AnyObject, AnyProtocol, Sel};
9+
use crate::{ffi, msg_send, mutability, sel, ClassType, Message};
1010

1111
#[derive(Debug)]
12-
pub(crate) struct CustomObject {
13-
obj: *mut AnyObject,
14-
}
12+
#[repr(C)]
13+
pub(crate) struct CustomObject(AnyObject);
1514

16-
impl CustomObject {
17-
fn new(class: &AnyClass) -> Self {
18-
let ptr: *const AnyClass = class;
19-
let obj = unsafe { ffi::class_createInstance(ptr.cast(), 0) }.cast();
20-
CustomObject { obj }
21-
}
15+
unsafe impl RefEncode for CustomObject {
16+
const ENCODING_REF: Encoding = Encoding::Object;
2217
}
2318

24-
unsafe impl MessageReceiver for &CustomObject {
25-
type __Inner = AnyObject;
19+
unsafe impl Message for CustomObject {}
2620

27-
#[inline]
28-
fn __as_raw_receiver(self) -> *mut AnyObject {
29-
self.obj
30-
}
31-
}
21+
unsafe impl ClassType for CustomObject {
22+
type Super = AnyObject;
23+
24+
type Mutability = mutability::Mutable;
3225

33-
unsafe impl MessageReceiver for &mut CustomObject {
34-
type __Inner = AnyObject;
26+
const NAME: &'static str = "CustomObject";
3527

36-
#[inline]
37-
fn __as_raw_receiver(self) -> *mut AnyObject {
38-
self.obj
28+
fn class() -> &'static AnyClass {
29+
custom_class()
3930
}
40-
}
4131

42-
unsafe impl MessageReceiver for ManuallyDrop<CustomObject> {
43-
type __Inner = AnyObject;
32+
fn as_super(&self) -> &Self::Super {
33+
&self.0
34+
}
4435

45-
#[inline]
46-
fn __as_raw_receiver(self) -> *mut AnyObject {
47-
self.obj
36+
fn as_super_mut(&mut self) -> &mut Self::Super {
37+
&mut self.0
4838
}
4939
}
5040

5141
impl Deref for CustomObject {
5242
type Target = AnyObject;
5343

5444
fn deref(&self) -> &AnyObject {
55-
unsafe { self.obj.as_ref().unwrap_unchecked() }
45+
&self.0
5646
}
5747
}
5848

5949
impl DerefMut for CustomObject {
6050
fn deref_mut(&mut self) -> &mut AnyObject {
61-
unsafe { self.obj.as_mut().unwrap_unchecked() }
62-
}
63-
}
64-
65-
impl Drop for CustomObject {
66-
fn drop(&mut self) {
67-
unsafe {
68-
#[allow(deprecated)]
69-
ffi::object_dispose(self.obj.cast());
70-
}
51+
&mut self.0
7152
}
7253
}
7354

@@ -105,8 +86,10 @@ pub(crate) fn custom_class() -> &'static AnyClass {
10586
builder.add_ivar::<u32>("_foo");
10687

10788
unsafe extern "C" fn custom_obj_release(this: *mut AnyObject, _cmd: Sel) {
108-
// Drop the value
109-
let _ = CustomObject { obj: this };
89+
unsafe {
90+
#[allow(deprecated)]
91+
ffi::object_dispose(this.cast());
92+
}
11093
}
11194

11295
extern "C" fn custom_obj_set_foo(this: &mut AnyObject, _cmd: Sel, foo: u32) {
@@ -172,8 +155,21 @@ pub(crate) fn custom_class() -> &'static AnyClass {
172155
}
173156

174157
unsafe {
175-
let release: unsafe extern "C" fn(_, _) = custom_obj_release;
176-
builder.add_method(sel!(release), release);
158+
// On GNUStep 2.0, it is required to have `dealloc` methods for some reason
159+
if cfg!(all(feature = "gnustep-2-0", not(feature = "gnustep-2-1"))) {
160+
unsafe extern "C" fn forward_to_dealloc(this: *mut AnyObject, _cmd: Sel) {
161+
unsafe { msg_send![this, dealloc] }
162+
}
163+
164+
let release: unsafe extern "C" fn(_, _) = forward_to_dealloc;
165+
builder.add_method(sel!(release), release);
166+
167+
let release: unsafe extern "C" fn(_, _) = custom_obj_release;
168+
builder.add_method(sel!(dealloc), release);
169+
} else {
170+
let release: unsafe extern "C" fn(_, _) = custom_obj_release;
171+
builder.add_method(sel!(release), release);
172+
}
177173

178174
let set_foo: extern "C" fn(_, _, _) = custom_obj_set_foo;
179175
builder.add_method(sel!(setFoo:), set_foo);
@@ -237,8 +233,9 @@ pub(crate) fn custom_subprotocol() -> &'static AnyProtocol {
237233
AnyProtocol::get("CustomSubProtocol").unwrap()
238234
}
239235

240-
pub(crate) fn custom_object() -> CustomObject {
241-
CustomObject::new(custom_class())
236+
pub(crate) fn custom_object() -> Id<CustomObject> {
237+
let ptr: *const AnyClass = custom_class();
238+
unsafe { Id::new(ffi::class_createInstance(ptr.cast(), 0).cast()) }.unwrap()
242239
}
243240

244241
pub(crate) fn custom_subclass() -> &'static AnyClass {
@@ -270,6 +267,7 @@ pub(crate) fn custom_subclass() -> &'static AnyClass {
270267
AnyClass::get("CustomSubclassObject").unwrap()
271268
}
272269

273-
pub(crate) fn custom_subclass_object() -> CustomObject {
274-
CustomObject::new(custom_subclass())
270+
pub(crate) fn custom_subclass_object() -> Id<CustomObject> {
271+
let ptr: *const AnyClass = custom_subclass();
272+
unsafe { Id::new(ffi::class_createInstance(ptr.cast(), 0).cast()) }.unwrap()
275273
}

0 commit comments

Comments
 (0)