wasmparser/readers/core/
coredumps.rs1use crate::{BinaryReader, FromReader, Result};
2use crate::{Ieee32, Ieee64, prelude::*};
3
4pub struct CoreDumpSection<'a> {
20 pub name: &'a str,
22}
23
24impl<'a> CoreDumpSection<'a> {
25 pub fn new(mut reader: BinaryReader<'a>) -> Result<CoreDumpSection<'a>> {
28 let pos = reader.original_position();
29 if reader.read_u8()? != 0 {
30 bail!(pos, "invalid start byte for core dump name");
31 }
32 let name = reader.read_unlimited_string()?;
33 if !reader.eof() {
34 bail!(
35 reader.original_position(),
36 "trailing bytes at end of custom section"
37 );
38 }
39 Ok(CoreDumpSection { name })
40 }
41}
42
43#[derive(Debug)]
56pub struct CoreDumpModulesSection<'a> {
57 pub modules: Vec<&'a str>,
60}
61
62impl<'a> CoreDumpModulesSection<'a> {
63 pub fn new(mut reader: BinaryReader<'a>) -> Result<CoreDumpModulesSection<'a>> {
66 let pos = reader.original_position();
67 let mut modules = vec![];
68 for _ in 0..reader.read_var_u32()? {
69 if reader.read_u8()? != 0 {
70 bail!(pos, "invalid start byte for coremodule");
71 }
72 modules.push(reader.read_unlimited_string()?);
73 }
74 if !reader.eof() {
75 bail!(
76 reader.original_position(),
77 "trailing bytes at end of custom section"
78 );
79 }
80 Ok(CoreDumpModulesSection { modules })
81 }
82}
83pub struct CoreDumpInstancesSection {
85 pub instances: Vec<CoreDumpInstance>,
87}
88
89impl CoreDumpInstancesSection {
90 pub fn new(mut reader: BinaryReader<'_>) -> Result<CoreDumpInstancesSection> {
93 let mut instances = vec![];
94 for _ in 0..reader.read_var_u32()? {
95 instances.push(CoreDumpInstance::from_reader(&mut reader)?);
96 }
97 if !reader.eof() {
98 bail!(
99 reader.original_position(),
100 "trailing bytes at end of custom section"
101 );
102 }
103 Ok(CoreDumpInstancesSection { instances })
104 }
105}
106
107#[derive(Debug)]
109pub struct CoreDumpInstance {
110 pub module_index: u32,
113
114 pub memories: Vec<u32>,
117
118 pub globals: Vec<u32>,
121}
122
123impl<'a> FromReader<'a> for CoreDumpInstance {
124 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
125 let pos = reader.original_position();
126 if reader.read_u8()? != 0 {
127 bail!(pos, "invalid start byte for core dump instance");
128 }
129 let module_index = reader.read_var_u32()?;
130 let mut memories = vec![];
131 for _ in 0..reader.read_var_u32()? {
132 memories.push(reader.read_var_u32()?);
133 }
134 let mut globals = vec![];
135
136 for _ in 0..reader.read_var_u32()? {
137 globals.push(reader.read_var_u32()?);
138 }
139
140 Ok(CoreDumpInstance {
141 module_index,
142 memories,
143 globals,
144 })
145 }
146}
147
148pub struct CoreDumpStackSection<'a> {
170 pub name: &'a str,
172 pub frames: Vec<CoreDumpStackFrame>,
174}
175
176impl<'a> CoreDumpStackSection<'a> {
177 pub fn new(mut reader: BinaryReader<'a>) -> Result<CoreDumpStackSection<'a>> {
180 let pos = reader.original_position();
181 if reader.read_u8()? != 0 {
182 bail!(pos, "invalid start byte for core dump stack name");
183 }
184 let name = reader.read_unlimited_string()?;
185 let mut frames = vec![];
186 for _ in 0..reader.read_var_u32()? {
187 frames.push(CoreDumpStackFrame::from_reader(&mut reader)?);
188 }
189 if !reader.eof() {
190 bail!(
191 reader.original_position(),
192 "trailing bytes at end of custom section"
193 );
194 }
195 Ok(CoreDumpStackSection {
196 name: name,
197 frames: frames,
198 })
199 }
200}
201
202#[derive(Debug)]
204pub struct CoreDumpStackFrame {
205 pub instanceidx: u32,
207 pub funcidx: u32,
209 pub codeoffset: u32,
211 pub locals: Vec<CoreDumpValue>,
213 pub stack: Vec<CoreDumpValue>,
215}
216
217impl<'a> FromReader<'a> for CoreDumpStackFrame {
218 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
219 let pos = reader.original_position();
220 if reader.read_u8()? != 0 {
221 bail!(pos, "invalid start byte for core dump stack frame");
222 }
223 let instanceidx = reader.read_var_u32()?;
224 let funcidx = reader.read_var_u32()?;
225 let codeoffset = reader.read_var_u32()?;
226 let mut locals = vec![];
227 for _ in 0..reader.read_var_u32()? {
228 locals.push(CoreDumpValue::from_reader(reader)?);
229 }
230 let mut stack = vec![];
231 for _ in 0..reader.read_var_u32()? {
232 stack.push(CoreDumpValue::from_reader(reader)?);
233 }
234
235 Ok(CoreDumpStackFrame {
236 instanceidx,
237 funcidx,
238 codeoffset,
239 locals,
240 stack,
241 })
242 }
243}
244
245#[derive(Clone, Debug)]
249pub enum CoreDumpValue {
250 Missing,
252 I32(i32),
254 I64(i64),
256 F32(Ieee32),
258 F64(Ieee64),
260}
261
262impl<'a> FromReader<'a> for CoreDumpValue {
263 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
264 let pos = reader.original_position();
265 match reader.read_u8()? {
266 0x01 => Ok(CoreDumpValue::Missing),
267 0x7F => Ok(CoreDumpValue::I32(reader.read_var_i32()?)),
268 0x7E => Ok(CoreDumpValue::I64(reader.read_var_i64()?)),
269 0x7D => Ok(CoreDumpValue::F32(reader.read_f32()?)),
270 0x7C => Ok(CoreDumpValue::F64(reader.read_f64()?)),
271 _ => bail!(pos, "invalid CoreDumpValue type"),
272 }
273 }
274}