use std::sync::Arc;
use wasm3x_sys as ffi;
use crate::engine::Engine;
use crate::error::{Error, Result};
#[derive(Clone)]
pub struct Module {
engine: Engine,
bytes: Arc<[u8]>,
}
impl Module {
pub fn new(engine: &Engine, wasm: impl AsRef<[u8]>) -> Result<Self> {
let bytes: Arc<[u8]> = Arc::from(wasm.as_ref());
unsafe {
let mut raw: ffi::IM3Module = core::ptr::null_mut();
let result =
ffi::m3_ParseModule(engine.raw(), &mut raw, bytes.as_ptr(), module_len(&bytes)?);
Error::from_ffi(result)?;
ffi::m3_FreeModule(raw);
}
Ok(Self {
engine: engine.clone(),
bytes,
})
}
pub fn engine(&self) -> &Engine {
&self.engine
}
pub(crate) fn bytes(&self) -> Arc<[u8]> {
Arc::clone(&self.bytes)
}
}
fn module_len(bytes: &[u8]) -> Result<u32> {
u32::try_from(bytes.len()).map_err(|_| Error::new("wasm module exceeds 4 GiB"))
}