use crate::{BinaryReader, BinaryReaderError, ConstExpr, FromReader, Result, SectionLimited};
use core::ops::Range;
#[derive(Debug, Clone)]
pub struct Data<'a> {
pub kind: DataKind<'a>,
pub data: &'a [u8],
pub range: Range<usize>,
}
#[derive(Debug, Clone)]
pub enum DataKind<'a> {
Passive,
Active {
memory_index: u32,
offset_expr: ConstExpr<'a>,
},
}
pub type DataSectionReader<'a> = SectionLimited<'a, Data<'a>>;
impl<'a> FromReader<'a> for Data<'a> {
fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
let segment_start = reader.original_position();
let flags = reader.read_var_u32()?;
let kind = match flags {
1 => DataKind::Passive,
0 | 2 => {
let memory_index = if flags == 0 {
0
} else {
reader.read_var_u32()?
};
let offset_expr = reader.read()?;
DataKind::Active {
memory_index,
offset_expr,
}
}
_ => {
return Err(BinaryReaderError::new(
"invalid flags byte in data segment",
segment_start,
));
}
};
let data = reader.read_reader()?;
Ok(Data {
kind,
data: data.remaining_buffer(),
range: segment_start..data.range().end,
})
}
}