@@ -654,6 +654,83 @@ pub mod custom_callable {
654
654
assert ! ( result. is_nil( ) ) ;
655
655
}
656
656
657
+ #[ itest]
658
+ fn callable_context_custom_panic ( ) {
659
+ let old_hook = std:: panic:: take_hook ( ) ;
660
+
661
+ let panic_message = Arc :: new ( Mutex :: new ( None ) ) ;
662
+ let panic_message_clone = panic_message. clone ( ) ;
663
+
664
+ std:: panic:: set_hook ( Box :: new ( move |panic_info| {
665
+ let error_message = godot:: private:: format_panic_message ( panic_info) ;
666
+ * panic_message_clone. lock ( ) . unwrap ( ) = Some ( error_message) ;
667
+ } ) ) ;
668
+
669
+ let received = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
670
+ let callable = Callable :: from_custom ( PanicCallable ( received) ) ;
671
+ callable. callv ( & varray ! [ ] ) ;
672
+
673
+ let function_name = if cfg ! ( debug_assertions) {
674
+ "test"
675
+ } else {
676
+ "<optimed out>"
677
+ } ;
678
+ let expected_msg = format ! ( "Context: <Callable>::{}" , function_name) ;
679
+
680
+ let panic_message = panic_message
681
+ . lock ( )
682
+ . unwrap ( )
683
+ . clone ( )
684
+ . expect ( "panic message absent" ) ;
685
+ let context_line = panic_message
686
+ . lines ( )
687
+ . last ( )
688
+ . expect ( "empty panic message" )
689
+ . trim ( ) ;
690
+
691
+ assert_eq ! ( context_line, expected_msg) ;
692
+
693
+ std:: panic:: set_hook ( old_hook) ;
694
+ }
695
+
696
+ #[ itest]
697
+ fn callable_context_rust_fn_panic ( ) {
698
+ let old_hook = std:: panic:: take_hook ( ) ;
699
+
700
+ let panic_message = Arc :: new ( Mutex :: new ( None ) ) ;
701
+ let panic_message_clone = panic_message. clone ( ) ;
702
+
703
+ std:: panic:: set_hook ( Box :: new ( move |panic_info| {
704
+ let error_message = godot:: private:: format_panic_message ( panic_info) ;
705
+ * panic_message_clone. lock ( ) . unwrap ( ) = Some ( error_message) ;
706
+ } ) ) ;
707
+
708
+ let callable = Callable :: from_local_fn ( "test" , |_args| -> Variant { panic ! ( "ahh" ) } ) ;
709
+ callable. callv ( & varray ! [ ] ) ;
710
+
711
+ let function_name = if cfg ! ( debug_assertions) {
712
+ "test"
713
+ } else {
714
+ "<optimed out>"
715
+ } ;
716
+ let expected_msg = format ! ( "Context: <Callable>::{}" , function_name) ;
717
+
718
+ let panic_message = panic_message
719
+ . lock ( )
720
+ . unwrap ( )
721
+ . clone ( )
722
+ . expect ( "panic message absent" ) ;
723
+ let context_line = panic_message
724
+ . lines ( )
725
+ . last ( )
726
+ . expect ( "empty panic message" )
727
+ . trim ( ) ;
728
+
729
+ assert_eq ! ( context_line, expected_msg) ;
730
+
731
+ std:: panic:: set_hook ( old_hook) ;
732
+ }
733
+
657
734
// ------------------------------------------------------------------------------------------------------------------------------------------
658
735
// Helper structs and functions for custom callables
659
736
0 commit comments