use crate::engine::Engine;
use crate::error::{Error, Result};
use crate::util::with_error_buf;
use wamrx_sys as sys;
pub struct Module {
raw: sys::wasm_module_t,
_bytes: Box<[u8]>,
engine: Engine,
}
impl Module {
pub fn new(engine: &Engine, bytes: &[u8]) -> Result<Module> {
let mut owned: Box<[u8]> = bytes.to_vec().into_boxed_slice();
let (raw, err) = with_error_buf(|err_buf, err_size| unsafe {
sys::wasm_runtime_load(owned.as_mut_ptr(), owned.len() as u32, err_buf, err_size)
});
if raw.is_null() {
return Err(Error::ModuleLoad(err));
}
Ok(Module {
raw,
_bytes: owned,
engine: engine.clone(),
})
}
pub fn engine(&self) -> &Engine {
&self.engine
}
pub(crate) fn raw(&self) -> sys::wasm_module_t {
self.raw
}
}
impl core::fmt::Debug for Module {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("Module").finish_non_exhaustive()
}
}
impl Drop for Module {
fn drop(&mut self) {
unsafe { sys::wasm_runtime_unload(self.raw) };
}
}