@@ -219,28 +219,28 @@ fn object_from_instance_id_unrelated_type() {
219
219
220
220
#[ itest]
221
221
fn object_new_has_instance_id ( ) {
222
- let obj = Gd :: < SignalEmitter > :: new_default ( ) ; // type doesn't matter, just Object-derived
222
+ let obj = Gd :: < ObjPayload > :: new_default ( ) ;
223
223
let _id = obj. instance_id ( ) ;
224
224
obj. free ( ) ;
225
225
}
226
226
227
227
#[ itest]
228
228
fn object_dynamic_free ( ) {
229
- let mut obj = Gd :: < SignalEmitter > :: new_default ( ) ;
229
+ let mut obj = Gd :: < ObjPayload > :: new_default ( ) ;
230
230
let id = obj. instance_id ( ) ;
231
231
232
232
obj. call ( "free" . into ( ) , & [ ] ) ;
233
233
234
234
assert_eq ! (
235
- Gd :: <SignalEmitter >:: try_from_instance_id( id) ,
235
+ Gd :: <ObjPayload >:: try_from_instance_id( id) ,
236
236
None ,
237
237
"dynamic free() call must destroy object"
238
238
) ;
239
239
}
240
240
241
241
#[ itest]
242
242
fn object_user_bind_after_free ( ) {
243
- let obj = Gd :: new ( SignalEmitter { } ) ; // type doesn't matter, just Object-derived
243
+ let obj = Gd :: new ( ObjPayload { } ) ;
244
244
let copy = obj. clone ( ) ;
245
245
obj. free ( ) ;
246
246
@@ -251,7 +251,7 @@ fn object_user_bind_after_free() {
251
251
252
252
#[ itest]
253
253
fn object_user_free_during_bind ( ) {
254
- let obj = Gd :: new ( SignalEmitter { } ) ; // type doesn't matter, just Object-derived
254
+ let obj = Gd :: new ( ObjPayload { } ) ;
255
255
let guard = obj. bind ( ) ;
256
256
257
257
let copy = obj. clone ( ) ; // TODO clone allowed while bound?
@@ -277,7 +277,7 @@ fn object_user_dynamic_free_during_bind() {
277
277
// 3. Holding a guard (GdRef/GdMut) across function calls -- not possible, guard's lifetime is coupled to a Gd and cannot be stored in
278
278
// fields or global variables due to that.
279
279
280
- let obj = Gd :: new ( SignalEmitter { } ) ; // type doesn't matter, just Object-derived
280
+ let obj = Gd :: new ( ObjPayload { } ) ;
281
281
let guard = obj. bind ( ) ;
282
282
283
283
let mut copy = obj. clone ( ) ; // TODO clone allowed while bound?
@@ -298,7 +298,7 @@ fn object_user_dynamic_free_during_bind() {
298
298
299
299
#[ itest]
300
300
fn object_user_call_after_free ( ) {
301
- let obj = Gd :: new ( SignalEmitter { } ) ; // type doesn't matter, just Object-derived
301
+ let obj = Gd :: new ( ObjPayload { } ) ;
302
302
let mut copy = obj. clone ( ) ;
303
303
obj. free ( ) ;
304
304
@@ -716,7 +716,7 @@ fn object_engine_refcounted_free() {
716
716
717
717
#[ itest]
718
718
fn object_user_double_free ( ) {
719
- let mut obj = Gd :: < SignalEmitter > :: new_default ( ) ;
719
+ let mut obj = Gd :: < ObjPayload > :: new_default ( ) ;
720
720
let obj2 = obj. clone ( ) ;
721
721
obj. call ( "free" . into ( ) , & [ ] ) ;
722
722
@@ -787,6 +787,18 @@ fn object_get_scene_tree(ctx: &TestContext) {
787
787
788
788
// ----------------------------------------------------------------------------------------------------------------------------------------------
789
789
790
+ #[ derive( GodotClass ) ]
791
+ #[ class( init, base=Object ) ]
792
+ struct ObjPayload { }
793
+
794
+ #[ godot_api]
795
+ impl ObjPayload {
796
+ #[ signal]
797
+ fn do_use ( ) ;
798
+ }
799
+
800
+ // ----------------------------------------------------------------------------------------------------------------------------------------------
801
+
790
802
#[ inline( never) ] // force to move "out of scope", can trigger potential dangling pointer errors
791
803
fn user_refc_instance ( ) -> Gd < RefcPayload > {
792
804
let value: i16 = 17943 ;
@@ -927,24 +939,14 @@ impl DoubleUse {
927
939
}
928
940
}
929
941
930
- #[ derive( GodotClass ) ]
931
- #[ class( init, base=Object ) ]
932
- struct SignalEmitter { }
933
-
934
- #[ godot_api]
935
- impl SignalEmitter {
936
- #[ signal]
937
- fn do_use ( ) ;
938
- }
939
-
940
942
/// Test that Godot can call a method that takes `&self`, while there already exists an immutable reference
941
943
/// to that type acquired through `bind`.
942
944
///
943
945
/// This test is not signal-specific, the original bug would happen whenever Godot would call a method that takes `&self`.
944
946
#[ itest]
945
947
fn double_use_reference ( ) {
946
948
let double_use: Gd < DoubleUse > = Gd :: new_default ( ) ;
947
- let emitter: Gd < SignalEmitter > = Gd :: new_default ( ) ;
949
+ let emitter: Gd < ObjPayload > = Gd :: new_default ( ) ;
948
950
949
951
emitter
950
952
. clone ( )
0 commit comments