use crate::MResult;
use parity_wasm::{
builder, elements,
elements::{MemorySection, MemoryType},
};
struct ModuleBootstrapper {
module: elements::Module,
}
impl<'a> ModuleBootstrapper {
fn init(module_code: &[u8]) -> MResult<Self> {
let module = elements::deserialize_buffer(module_code)?;
Ok(Self { module })
}
fn set_mem_pages_count(self, mem_pages_count: u32) -> Self {
let Self { mut module } = self;
let mem_initial = match module.memory_section_mut() {
Some(section) => match section.entries_mut().pop() {
Some(entry) => entry.limits().initial(),
None => 0,
},
None => 0,
};
let memory_entry = MemoryType::new(mem_initial, Some(mem_pages_count));
let mut default_mem_section = MemorySection::default();
module
.memory_section_mut()
.unwrap_or(&mut default_mem_section)
.entries_mut()
.push(memory_entry);
let builder = builder::from_module(module);
Self {
module: builder.build(),
}
}
fn into_wasm(self) -> MResult<Vec<u8>> {
elements::serialize(self.module).map_err(Into::into)
}
}
pub(crate) fn prepare_module(module: &[u8], mem_pages_count: u32) -> MResult<Vec<u8>> {
ModuleBootstrapper::init(module)?
.set_mem_pages_count(mem_pages_count)
.into_wasm()
}