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
parent
commit
4d9e10dae1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      crates/c-api/src/trap.rs
  2. 1
      crates/wasmtime/src/config.rs
  3. 8
      crates/wasmtime/src/trap.rs

14
crates/c-api/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] #[no_mangle]
pub extern "C" fn wasm_trap_origin(raw: &wasm_trap_t) -> Option<Box<wasm_frame_t>> { pub extern "C" fn wasm_trap_origin(raw: &wasm_trap_t) -> Option<Box<wasm_frame_t>> {
if raw if raw.trap.trace().unwrap_or(&[]).len() > 0 {
.trap
.trace()
.expect("backtraces are always enabled")
.len()
> 0
{
Some(Box::new(wasm_frame_t { Some(Box::new(wasm_frame_t {
trap: raw.trap.clone(), trap: raw.trap.clone(),
idx: 0, idx: 0,
@ -84,11 +78,7 @@ pub extern "C" fn wasm_trap_origin(raw: &wasm_trap_t) -> Option<Box<wasm_frame_t
#[no_mangle] #[no_mangle]
pub extern "C" fn wasm_trap_trace(raw: &wasm_trap_t, out: &mut wasm_frame_vec_t) { pub extern "C" fn wasm_trap_trace(raw: &wasm_trap_t, out: &mut wasm_frame_vec_t) {
let vec = (0..raw let vec = (0..raw.trap.trace().unwrap_or(&[]).len())
.trap
.trace()
.expect("backtraces are always enabled")
.len())
.map(|idx| { .map(|idx| {
Some(Box::new(wasm_frame_t { Some(Box::new(wasm_frame_t {
trap: raw.trap.clone(), trap: raw.trap.clone(),

1
crates/wasmtime/src/config.rs

@ -288,7 +288,6 @@ impl Config {
/// ///
/// When disabled, wasm backtrace details are ignored, and [`crate::Trap::trace()`] /// When disabled, wasm backtrace details are ignored, and [`crate::Trap::trace()`]
/// will always return `None`. /// will always return `None`.
pub fn wasm_backtrace(&mut self, enable: bool) -> &mut Self { pub fn wasm_backtrace(&mut self, enable: bool) -> &mut Self {
self.wasm_backtrace = enable; self.wasm_backtrace = enable;
#[cfg(compiler)] #[cfg(compiler)]

8
crates/wasmtime/src/trap.rs

@ -295,6 +295,14 @@ impl Trap {
/// Returns a list of function frames in WebAssembly code that led to this /// Returns a list of function frames in WebAssembly code that led to this
/// trap happening. /// 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]> { pub fn trace(&self) -> Option<&[FrameInfo]> {
self.inner self.inner
.backtrace .backtrace

Loading…
Cancel
Save