diff --git a/crates/api/src/instance.rs b/crates/api/src/instance.rs index a1ff8a2087..f7b6b76e05 100644 --- a/crates/api/src/instance.rs +++ b/crates/api/src/instance.rs @@ -123,6 +123,7 @@ impl Instance { } } + module.register_frame_info(); let config = store.engine().config(); let instance_handle = instantiate( config, @@ -141,7 +142,6 @@ impl Instance { export, )); } - module.register_frame_info(); Ok(Instance { instance_handle, module: module.clone(), diff --git a/crates/api/tests/traps.rs b/crates/api/tests/traps.rs index 75513d765a..b403ae51f2 100644 --- a/crates/api/tests/traps.rs +++ b/crates/api/tests/traps.rs @@ -361,3 +361,36 @@ fn call_signature_mismatch() -> Result<()> { ); Ok(()) } + +#[test] +fn start_trap_pretty() -> Result<()> { + let store = Store::default(); + let wat = r#" + (module $m + (func $die unreachable) + (func call $die) + (func $foo call 1) + (func $start call $foo) + (start $start) + ) + "#; + + let module = Module::new(&store, wat)?; + let e = match Instance::new(&module, &[]) { + Ok(_) => panic!("expected failure"), + Err(e) => e.downcast::()?, + }; + + assert_eq!( + e.to_string(), + "\ +wasm trap: unreachable, source location: @001d +wasm backtrace: + 0: m!die + 1: m! + 2: m!foo + 3: m!start +" + ); + Ok(()) +}