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`.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user