File tree 3 files changed +11
-10
lines changed
3 files changed +11
-10
lines changed Original file line number Diff line number Diff line change 14
14
#![ feature( core_intrinsics) ]
15
15
#![ feature( nll) ]
16
16
#![ feature( panic_runtime) ]
17
+ #![ feature( std_internals) ]
17
18
#![ feature( staged_api) ]
18
19
#![ feature( rustc_attrs) ]
19
20
#![ feature( asm) ]
20
21
21
22
use core:: any:: Any ;
23
+ use core:: panic:: BoxMeUp ;
22
24
23
25
#[ rustc_std_internal_symbol]
24
26
#[ allow( improper_ctypes_definitions) ]
@@ -28,7 +30,7 @@ pub unsafe extern "C" fn __rust_panic_cleanup(_: *mut u8) -> *mut (dyn Any + Sen
28
30
29
31
// "Leak" the payload and shim to the relevant abort on the platform in question.
30
32
#[ rustc_std_internal_symbol]
31
- pub unsafe extern "C" fn __rust_start_panic ( _payload : usize ) -> u32 {
33
+ pub unsafe extern "C" fn __rust_start_panic ( _payload : * mut & mut dyn BoxMeUp ) -> u32 {
32
34
abort ( ) ;
33
35
34
36
cfg_if:: cfg_if! {
Original file line number Diff line number Diff line change @@ -104,9 +104,8 @@ pub unsafe extern "C" fn __rust_panic_cleanup(payload: *mut u8) -> *mut (dyn Any
104
104
// implementation.
105
105
#[ rustc_std_internal_symbol]
106
106
#[ unwind( allowed) ]
107
- pub unsafe extern "C" fn __rust_start_panic ( payload : usize ) -> u32 {
108
- let payload = payload as * mut & mut dyn BoxMeUp ;
109
- let payload = ( * payload) . take_box ( ) ;
107
+ pub unsafe extern "C" fn __rust_start_panic ( payload : * mut & mut dyn BoxMeUp ) -> u32 {
108
+ let payload = Box :: from_raw ( ( * payload) . take_box ( ) ) ;
110
109
111
- imp:: panic ( Box :: from_raw ( payload) )
110
+ imp:: panic ( payload)
112
111
}
Original file line number Diff line number Diff line change @@ -44,11 +44,11 @@ use realstd::io::set_output_capture;
44
44
extern "C" {
45
45
fn __rust_panic_cleanup ( payload : * mut u8 ) -> * mut ( dyn Any + Send + ' static ) ;
46
46
47
- /// `payload` is actually a `*mut &mut dyn BoxMeUp` but that would cause FFI warnings.
48
- /// It cannot be `Box<dyn BoxMeUp>` because the other end of this call does not depend
49
- /// on liballoc, and thus cannot use `Box` .
47
+ /// `payload` is passed through another layer of raw pointers as `&mut dyn Trait` is not
48
+ /// FFI-safe. ` BoxMeUp` lazily performs allocation only when needed ( this avoids allocations
49
+ /// when using the "abort" panic runtime) .
50
50
#[ unwind( allowed) ]
51
- fn __rust_start_panic ( payload : usize ) -> u32 ;
51
+ fn __rust_start_panic ( payload : * mut & mut dyn BoxMeUp ) -> u32 ;
52
52
}
53
53
54
54
/// This function is called by the panic runtime if FFI code catches a Rust
@@ -637,7 +637,7 @@ pub fn rust_panic_without_hook(payload: Box<dyn Any + Send>) -> ! {
637
637
fn rust_panic ( mut msg : & mut dyn BoxMeUp ) -> ! {
638
638
let code = unsafe {
639
639
let obj = & mut msg as * mut & mut dyn BoxMeUp ;
640
- __rust_start_panic ( obj as usize )
640
+ __rust_start_panic ( obj)
641
641
} ;
642
642
rtabort ! ( "failed to initiate panic, error {}" , code)
643
643
}
You can’t perform that action at this time.
0 commit comments