@@ -219,28 +219,28 @@ fn object_from_instance_id_unrelated_type() {
219219
220220#[ itest]
221221fn 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 ( ) ;
223223 let _id = obj. instance_id ( ) ;
224224 obj. free ( ) ;
225225}
226226
227227#[ itest]
228228fn object_dynamic_free ( ) {
229- let mut obj = Gd :: < SignalEmitter > :: new_default ( ) ;
229+ let mut obj = Gd :: < ObjPayload > :: new_default ( ) ;
230230 let id = obj. instance_id ( ) ;
231231
232232 obj. call ( "free" . into ( ) , & [ ] ) ;
233233
234234 assert_eq ! (
235- Gd :: <SignalEmitter >:: try_from_instance_id( id) ,
235+ Gd :: <ObjPayload >:: try_from_instance_id( id) ,
236236 None ,
237237 "dynamic free() call must destroy object"
238238 ) ;
239239}
240240
241241#[ itest]
242242fn object_user_bind_after_free ( ) {
243- let obj = Gd :: new ( SignalEmitter { } ) ; // type doesn't matter, just Object-derived
243+ let obj = Gd :: new ( ObjPayload { } ) ;
244244 let copy = obj. clone ( ) ;
245245 obj. free ( ) ;
246246
@@ -251,7 +251,7 @@ fn object_user_bind_after_free() {
251251
252252#[ itest]
253253fn object_user_free_during_bind ( ) {
254- let obj = Gd :: new ( SignalEmitter { } ) ; // type doesn't matter, just Object-derived
254+ let obj = Gd :: new ( ObjPayload { } ) ;
255255 let guard = obj. bind ( ) ;
256256
257257 let copy = obj. clone ( ) ; // TODO clone allowed while bound?
@@ -277,7 +277,7 @@ fn object_user_dynamic_free_during_bind() {
277277 // 3. Holding a guard (GdRef/GdMut) across function calls -- not possible, guard's lifetime is coupled to a Gd and cannot be stored in
278278 // fields or global variables due to that.
279279
280- let obj = Gd :: new ( SignalEmitter { } ) ; // type doesn't matter, just Object-derived
280+ let obj = Gd :: new ( ObjPayload { } ) ;
281281 let guard = obj. bind ( ) ;
282282
283283 let mut copy = obj. clone ( ) ; // TODO clone allowed while bound?
@@ -298,7 +298,7 @@ fn object_user_dynamic_free_during_bind() {
298298
299299#[ itest]
300300fn object_user_call_after_free ( ) {
301- let obj = Gd :: new ( SignalEmitter { } ) ; // type doesn't matter, just Object-derived
301+ let obj = Gd :: new ( ObjPayload { } ) ;
302302 let mut copy = obj. clone ( ) ;
303303 obj. free ( ) ;
304304
@@ -716,7 +716,7 @@ fn object_engine_refcounted_free() {
716716
717717#[ itest]
718718fn object_user_double_free ( ) {
719- let mut obj = Gd :: < SignalEmitter > :: new_default ( ) ;
719+ let mut obj = Gd :: < ObjPayload > :: new_default ( ) ;
720720 let obj2 = obj. clone ( ) ;
721721 obj. call ( "free" . into ( ) , & [ ] ) ;
722722
@@ -787,6 +787,18 @@ fn object_get_scene_tree(ctx: &TestContext) {
787787
788788// ----------------------------------------------------------------------------------------------------------------------------------------------
789789
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+
790802#[ inline( never) ] // force to move "out of scope", can trigger potential dangling pointer errors
791803fn user_refc_instance ( ) -> Gd < RefcPayload > {
792804 let value: i16 = 17943 ;
@@ -927,24 +939,14 @@ impl DoubleUse {
927939 }
928940}
929941
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-
940942/// Test that Godot can call a method that takes `&self`, while there already exists an immutable reference
941943/// to that type acquired through `bind`.
942944///
943945/// This test is not signal-specific, the original bug would happen whenever Godot would call a method that takes `&self`.
944946#[ itest]
945947fn double_use_reference ( ) {
946948 let double_use: Gd < DoubleUse > = Gd :: new_default ( ) ;
947- let emitter: Gd < SignalEmitter > = Gd :: new_default ( ) ;
949+ let emitter: Gd < ObjPayload > = Gd :: new_default ( ) ;
948950
949951 emitter
950952 . clone ( )
0 commit comments