@@ -625,6 +625,12 @@ pub fn begin_panic_handler(info: &core::panic::PanicInfo<'_>) -> ! {
625
625
}
626
626
}
627
627
628
+ impl fmt:: Display for FormatStringPayload < ' _ > {
629
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
630
+ if let Some ( s) = & self . string { f. write_str ( s) } else { f. write_fmt ( * self . inner ) }
631
+ }
632
+ }
633
+
628
634
struct StaticStrPayload ( & ' static str ) ;
629
635
630
636
unsafe impl PanicPayload for StaticStrPayload {
@@ -637,21 +643,25 @@ pub fn begin_panic_handler(info: &core::panic::PanicInfo<'_>) -> ! {
637
643
}
638
644
}
639
645
646
+ impl fmt:: Display for StaticStrPayload {
647
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
648
+ f. write_str ( self . 0 )
649
+ }
650
+ }
651
+
640
652
let loc = info. location ( ) . unwrap ( ) ; // The current implementation always returns Some
641
653
let msg = info. message ( ) ;
642
654
crate :: sys_common:: backtrace:: __rust_end_short_backtrace ( move || {
643
655
if let Some ( s) = msg. as_str ( ) {
644
656
rust_panic_with_hook (
645
657
& mut StaticStrPayload ( s) ,
646
- Some ( msg) ,
647
658
loc,
648
659
info. can_unwind ( ) ,
649
660
info. force_no_backtrace ( ) ,
650
661
) ;
651
662
} else {
652
663
rust_panic_with_hook (
653
664
& mut FormatStringPayload { inner : & msg, string : None } ,
654
- Some ( msg) ,
655
665
loc,
656
666
info. can_unwind ( ) ,
657
667
info. force_no_backtrace ( ) ,
@@ -681,7 +691,6 @@ pub const fn begin_panic<M: Any + Send>(msg: M) -> ! {
681
691
return crate :: sys_common:: backtrace:: __rust_end_short_backtrace ( move || {
682
692
rust_panic_with_hook (
683
693
& mut Payload :: new ( msg) ,
684
- None ,
685
694
loc,
686
695
/* can_unwind */ true ,
687
696
/* force_no_backtrace */ false ,
@@ -719,6 +728,15 @@ pub const fn begin_panic<M: Any + Send>(msg: M) -> ! {
719
728
}
720
729
}
721
730
}
731
+
732
+ impl < A : Send + ' static > fmt:: Display for Payload < A > {
733
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
734
+ match & self . inner {
735
+ Some ( a) => f. write_str ( payload_as_str ( a) ) ,
736
+ None => process:: abort ( ) ,
737
+ }
738
+ }
739
+ }
722
740
}
723
741
724
742
fn payload_as_str ( payload : & dyn Any ) -> & str {
@@ -738,7 +756,6 @@ fn payload_as_str(payload: &dyn Any) -> &str {
738
756
/// abort or unwind.
739
757
fn rust_panic_with_hook (
740
758
payload : & mut dyn PanicPayload ,
741
- message : Option < fmt:: Arguments < ' _ > > ,
742
759
location : & Location < ' _ > ,
743
760
can_unwind : bool ,
744
761
force_no_backtrace : bool ,
@@ -765,11 +782,7 @@ fn rust_panic_with_hook(
765
782
panic_count:: MustAbort :: AlwaysAbort => {
766
783
// Unfortunately, this does not print a backtrace, because creating
767
784
// a `Backtrace` will allocate, which we must avoid here.
768
- if let Some ( message) = message {
769
- rtprintpanic ! ( "aborting due to panic at {location}:\n {message}\n " ) ;
770
- } else {
771
- rtprintpanic ! ( "aborting due to panic at {location}\n " ) ;
772
- }
785
+ rtprintpanic ! ( "aborting due to panic at {location}:\n {payload}\n " ) ;
773
786
}
774
787
}
775
788
crate :: sys:: abort_internal ( ) ;
@@ -825,6 +838,12 @@ pub fn rust_panic_without_hook(payload: Box<dyn Any + Send>) -> ! {
825
838
}
826
839
}
827
840
841
+ impl fmt:: Display for RewrapBox {
842
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
843
+ f. write_str ( payload_as_str ( & self . 0 ) )
844
+ }
845
+ }
846
+
828
847
rust_panic ( & mut RewrapBox ( payload) )
829
848
}
830
849
0 commit comments