use std::fmt;
use crate::{store::StoreOpaque, FrameInfo, Global, Instance, Memory, Module, WasmBacktrace};
pub struct WasmCoreDump {
name: String,
modules: Vec<Module>,
instances: Vec<Instance>,
store_memories: Vec<Memory>,
store_globals: Vec<Global>,
backtrace: WasmBacktrace,
}
impl WasmCoreDump {
pub(crate) fn new(store: &StoreOpaque, backtrace: WasmBacktrace) -> WasmCoreDump {
let modules: Vec<_> = store.modules().all_modules().cloned().collect();
let instances: Vec<Instance> = store.all_instances().collect();
let store_memories: Vec<Memory> = store.all_memories().collect();
let store_globals: Vec<Global> = store.all_globals().collect();
WasmCoreDump {
name: String::from("store_name"),
modules,
instances,
store_memories,
store_globals,
backtrace,
}
}
pub fn frames(&self) -> &[FrameInfo] {
self.backtrace.frames()
}
pub fn modules(&self) -> &[Module] {
self.modules.as_ref()
}
pub fn instances(&self) -> &[Instance] {
self.instances.as_ref()
}
pub fn store_globals(&self) -> &[Global] {
self.store_globals.as_ref()
}
pub fn store_memories(&self) -> &[Memory] {
self.store_memories.as_ref()
}
}
impl fmt::Display for WasmCoreDump {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
writeln!(f, "wasm coredump generated while executing {}:", self.name)?;
writeln!(f, "modules:")?;
for module in self.modules.iter() {
writeln!(f, " {}", module.name().unwrap_or("<module>"))?;
}
writeln!(f, "instances:")?;
for instance in self.instances.iter() {
writeln!(f, " {:?}", instance)?;
}
writeln!(f, "memories:")?;
for memory in self.store_memories.iter() {
writeln!(f, " {:?}", memory)?;
}
writeln!(f, "globals:")?;
for global in self.store_globals.iter() {
writeln!(f, " {:?}", global)?;
}
writeln!(f, "backtrace:")?;
write!(f, "{}", self.backtrace)?;
Ok(())
}
}
impl fmt::Debug for WasmCoreDump {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "<wasm core dump>")
}
}