tinywasm_wasmparser/readers/core/
coredumps.rs1use alloc::{vec, vec::Vec};
2
3use crate::{BinaryReader, FromReader, Result};
4
5pub struct CoreDumpSection<'a> {
21 pub name: &'a str,
23}
24
25impl<'a> FromReader<'a> for CoreDumpSection<'a> {
26 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
27 let pos = reader.original_position();
28 if reader.read_u8()? != 0 {
29 bail!(pos, "invalid start byte for core dump name");
30 }
31 let name = reader.read_string()?;
32 Ok(CoreDumpSection { name })
33 }
34}
35
36#[derive(Debug)]
49pub struct CoreDumpModulesSection<'a> {
50 pub modules: Vec<&'a str>,
53}
54
55impl<'a> FromReader<'a> for CoreDumpModulesSection<'a> {
56 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
57 let pos = reader.original_position();
58 let mut modules = vec![];
59 for _ in 0..reader.read_var_u32()? {
60 if reader.read_u8()? != 0 {
61 bail!(pos, "invalid start byte for coremodule");
62 }
63 modules.push(reader.read_string()?);
64 }
65 Ok(CoreDumpModulesSection { modules })
66 }
67}
68pub struct CoreDumpInstancesSection {
70 pub instances: Vec<CoreDumpInstance>,
72}
73
74impl<'a> FromReader<'a> for CoreDumpInstancesSection {
75 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
76 let mut instances = vec![];
77 for _ in 0..reader.read_var_u32()? {
78 instances.push(CoreDumpInstance::from_reader(reader)?);
79 }
80 Ok(CoreDumpInstancesSection { instances })
81 }
82}
83
84pub struct CoreDumpInstance {
86 pub module_index: u32,
89
90 pub memories: Vec<u32>,
93
94 pub globals: Vec<u32>,
97}
98
99impl<'a> FromReader<'a> for CoreDumpInstance {
100 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
101 let pos = reader.original_position();
102 if reader.read_u8()? != 0 {
103 bail!(pos, "invalid start byte for core dump instance");
104 }
105 let module_index = reader.read_var_u32()?;
106 let mut memories = vec![];
107 for _ in 0..reader.read_var_u32()? {
108 memories.push(reader.read_var_u32()?);
109 }
110 let mut globals = vec![];
111
112 for _ in 0..reader.read_var_u32()? {
113 globals.push(reader.read_var_u32()?);
114 }
115
116 Ok(CoreDumpInstance {
117 module_index,
118 memories,
119 globals,
120 })
121 }
122}
123
124pub struct CoreDumpStackSection<'a> {
145 pub name: &'a str,
147 pub frames: Vec<CoreDumpStackFrame>,
149}
150
151impl<'a> FromReader<'a> for CoreDumpStackSection<'a> {
152 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
153 let pos = reader.original_position();
154 if reader.read_u8()? != 0 {
155 bail!(pos, "invalid start byte for core dump stack name");
156 }
157 let name = reader.read_string()?;
158 let mut frames = vec![];
159 for _ in 0..reader.read_var_u32()? {
160 frames.push(CoreDumpStackFrame::from_reader(reader)?);
161 }
162 Ok(CoreDumpStackSection {
163 name: name,
164 frames: frames,
165 })
166 }
167}
168
169#[derive(Debug)]
171pub struct CoreDumpStackFrame {
172 pub instanceidx: u32,
174 pub funcidx: u32,
176 pub codeoffset: u32,
178 pub locals: Vec<CoreDumpValue>,
180 pub stack: Vec<CoreDumpValue>,
182}
183
184impl<'a> FromReader<'a> for CoreDumpStackFrame {
185 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
186 let pos = reader.original_position();
187 if reader.read_u8()? != 0 {
188 bail!(pos, "invalid start byte for core dump stack frame");
189 }
190 let instanceidx = reader.read_var_u32()?;
191 let funcidx = reader.read_var_u32()?;
192 let codeoffset = reader.read_var_u32()?;
193 let mut locals = vec![];
194 for _ in 0..reader.read_var_u32()? {
195 locals.push(CoreDumpValue::from_reader(reader)?);
196 }
197 let mut stack = vec![];
198 for _ in 0..reader.read_var_u32()? {
199 stack.push(CoreDumpValue::from_reader(reader)?);
200 }
201
202 Ok(CoreDumpStackFrame {
203 instanceidx,
204 funcidx,
205 codeoffset,
206 locals,
207 stack,
208 })
209 }
210}
211
212#[derive(Clone, Debug)]
216pub enum CoreDumpValue {
217 Missing,
219 I32(i32),
221 I64(i64),
223 F32(f32),
225 F64(f64),
227}
228
229impl<'a> FromReader<'a> for CoreDumpValue {
230 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
231 let pos = reader.original_position();
232 match reader.read_u8()? {
233 0x01 => Ok(CoreDumpValue::Missing),
234 0x7F => Ok(CoreDumpValue::I32(reader.read_var_i32()?)),
235 0x7E => Ok(CoreDumpValue::I64(reader.read_var_i64()?)),
236 0x7D => Ok(CoreDumpValue::F32(f32::from_bits(
237 reader.read_f32()?.bits(),
238 ))),
239 0x7C => Ok(CoreDumpValue::F64(f64::from_bits(
240 reader.read_f64()?.bits(),
241 ))),
242 _ => bail!(pos, "invalid CoreDumpValue type"),
243 }
244 }
245}