Browse Source
Fix panics in the C API related to trap frames (#4196 )
The `wasmtime-cpp` test suite uncovered an issue where asking for the
frames of a trap would fail immediately after the trap was created. In
addition to fixing this issue I've also updated the documentation of
`Trap::frames` to indicate when it returns `None`.
pull/4198/head
Alex Crichton
2 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
10 additions and
13 deletions
crates/c-api/src/trap.rs
crates/wasmtime/src/config.rs
crates/wasmtime/src/trap.rs
@ -64,13 +64,7 @@ pub extern "C" fn wasm_trap_message(trap: &wasm_trap_t, out: &mut wasm_message_t
#[ no_mangle ]
pub extern "C" fn wasm_trap_origin ( raw : & wasm_trap_t ) -> Option < Box < wasm_frame_t > > {
if raw
. trap
. trace ( )
. expect ( "backtraces are always enabled" )
. len ( )
> 0
{
if raw . trap . trace ( ) . unwrap_or ( & [ ] ) . len ( ) > 0 {
Some ( Box ::new ( wasm_frame_t {
trap : raw . trap . clone ( ) ,
idx : 0 ,
@ -84,11 +78,7 @@ pub extern "C" fn wasm_trap_origin(raw: &wasm_trap_t) -> Option<Box<wasm_frame_t
#[ no_mangle ]
pub extern "C" fn wasm_trap_trace ( raw : & wasm_trap_t , out : & mut wasm_frame_vec_t ) {
let vec = ( 0 . . raw
. trap
. trace ( )
. expect ( "backtraces are always enabled" )
. len ( ) )
let vec = ( 0 . . raw . trap . trace ( ) . unwrap_or ( & [ ] ) . len ( ) )
. map ( | idx | {
Some ( Box ::new ( wasm_frame_t {
trap : raw . trap . clone ( ) ,
@ -288,7 +288,6 @@ impl Config {
///
/// When disabled, wasm backtrace details are ignored, and [`crate::Trap::trace()`]
/// will always return `None`.
pub fn wasm_backtrace ( & mut self , enable : bool ) -> & mut Self {
self . wasm_backtrace = enable ;
#[ cfg(compiler) ]
@ -295,6 +295,14 @@ impl Trap {
/// Returns a list of function frames in WebAssembly code that led to this
/// trap happening.
///
/// This function return an `Option` of a list of frames to indicate that
/// wasm frames are not always available. Frames will never be available if
/// backtraces are disabled via
/// [`Config::wasm_backtrace`](crate::Config::wasm_backtrace). Frames will
/// also not be available for freshly-created traps. WebAssembly frames are
/// currently only captured when the trap reaches wasm itself to get raised
/// across a wasm boundary.
pub fn trace ( & self ) -> Option < & [ FrameInfo ] > {
self . inner
. backtrace