@@ -15,6 +15,7 @@ use godot::obj::{Inherits, Share};
15
15
use godot:: sys:: GodotFfi ;
16
16
17
17
use std:: cell:: RefCell ;
18
+ use std:: mem;
18
19
use std:: rc:: Rc ;
19
20
20
21
// TODO:
@@ -33,6 +34,39 @@ fn object_construct_value() {
33
34
assert_eq ! ( obj. bind( ) . value, 222 ) ;
34
35
}
35
36
37
+ // TODO(#23): DerefMut on Gd pointer may be used to break subtyping relations
38
+ #[ itest( skip) ]
39
+ fn object_subtype_swap ( ) {
40
+ let mut a: Gd < Node > = Node :: new_alloc ( ) ;
41
+ let mut b: Gd < Node3D > = Node3D :: new_alloc ( ) ;
42
+
43
+ /*
44
+ let a_id = a.instance_id();
45
+ let b_id = b.instance_id();
46
+ let a_class = a.get_class();
47
+ let b_class = b.get_class();
48
+
49
+ dbg!(a_id);
50
+ dbg!(b_id);
51
+ dbg!(&a_class);
52
+ dbg!(&b_class);
53
+ println!("..swap..");
54
+ */
55
+
56
+ mem:: swap ( & mut * a, & mut * b) ;
57
+
58
+ /*
59
+ dbg!(a_id);
60
+ dbg!(b_id);
61
+ dbg!(&a_class);
62
+ dbg!(&b_class);
63
+ */
64
+
65
+ // This should not panic
66
+ a. free ( ) ;
67
+ b. free ( ) ;
68
+ }
69
+
36
70
#[ itest]
37
71
fn object_user_roundtrip_return ( ) {
38
72
let value: i16 = 17943 ;
@@ -192,6 +226,31 @@ fn object_engine_eq() {
192
226
b1. free ( ) ;
193
227
}
194
228
229
+ #[ itest]
230
+ fn object_dead_eq ( ) {
231
+ let a = Node3D :: new_alloc ( ) ;
232
+ let b = Node3D :: new_alloc ( ) ;
233
+ let b2 = b. share ( ) ;
234
+
235
+ // Destroy b1 without consuming it
236
+ b. share ( ) . free ( ) ;
237
+
238
+ {
239
+ let lhs = a. share ( ) ;
240
+ expect_panic ( "Gd::eq() panics when one operand is dead" , move || {
241
+ let _ = lhs == b;
242
+ } ) ;
243
+ }
244
+ {
245
+ let rhs = a. share ( ) ;
246
+ expect_panic ( "Gd::ne() panics when one operand is dead" , move || {
247
+ let _ = b2 != rhs;
248
+ } ) ;
249
+ }
250
+
251
+ a. free ( ) ;
252
+ }
253
+
195
254
#[ itest]
196
255
fn object_user_convert_variant ( ) {
197
256
let value: i16 = 17943 ;
@@ -485,7 +544,7 @@ fn object_engine_refcounted_free() {
485
544
let node = RefCounted :: new ( ) ;
486
545
let node2 = node. share ( ) . upcast :: < Object > ( ) ;
487
546
488
- expect_panic ( "calling free() on RefCounted obj " , || node2. free ( ) )
547
+ expect_panic ( "calling free() on RefCounted object " , || node2. free ( ) )
489
548
}
490
549
491
550
#[ itest]
0 commit comments