use std::convert::TryFrom;
#[derive(Debug)]
pub struct DataSegments {
data: wasm_encoder::DataSection,
next_offset: u32,
memory: u32,
}
impl DataSegments {
pub fn new(memory: u32) -> DataSegments {
DataSegments {
data: wasm_encoder::DataSection::new(),
next_offset: 0,
memory,
}
}
pub fn add<S>(&mut self, segment: S) -> u32
where
S: IntoIterator<Item = u8>,
S::IntoIter: ExactSizeIterator,
{
let segment = segment.into_iter();
let offset = self.reserve_space(u32::try_from(segment.len()).unwrap());
self.data.active(
self.memory,
&wasm_encoder::Instruction::I32Const(offset as i32),
segment,
);
offset
}
pub fn reserve_space(&mut self, num_bytes: u32) -> u32 {
self.next_offset += 1;
let offset = self.next_offset;
self.next_offset += num_bytes;
offset
}
pub fn memory_type(&self) -> wasm_encoder::MemoryType {
const WASM_PAGE_SIZE: u32 = 65_536;
wasm_encoder::MemoryType {
minimum: ((self.next_offset + WASM_PAGE_SIZE - 1) / WASM_PAGE_SIZE).into(),
maximum: None,
memory64: false,
}
}
pub fn take_data(&mut self) -> wasm_encoder::DataSection {
std::mem::replace(&mut self.data, wasm_encoder::DataSection::new())
}
}