use rusty_jsc::JSObject;
use tracing::trace;
use wasmer_types::{MemoryError, MemoryType};
use crate::AsStoreRef;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct VMMemory {
pub(crate) memory: JSObject,
pub(crate) ty: MemoryType,
}
unsafe impl Send for VMMemory {}
unsafe impl Sync for VMMemory {}
impl VMMemory {
pub fn new(memory: JSObject, ty: MemoryType) -> Self {
Self { memory, ty }
}
pub fn get_runtime_size(&self) -> u32 {
unimplemented!();
}
pub(crate) fn try_clone(&self) -> Result<Self, MemoryError> {
Ok(self.clone())
}
pub fn copy(&self, store: &impl AsStoreRef) -> Result<Self, wasmer_types::MemoryError> {
let new_memory = crate::jsc::memory::Memory::js_memory_from_type(&store, &self.ty)?;
trace!("memory copy started");
let src = crate::jsc::memory::view::MemoryView::new_raw(&self.memory, store);
let amount = src.data_size() as usize;
let mut dst = crate::jsc::memory::view::MemoryView::new_raw(&new_memory, store);
let dst_size = dst.data_size() as usize;
src.copy_to_memory(amount as u64, &dst).map_err(|err| {
wasmer_types::MemoryError::Generic(format!("failed to copy the memory - {err}"))
})?;
trace!("memory copy finished (size={})", dst.size().bytes().0);
Ok(Self {
memory: new_memory,
ty: self.ty,
})
}
}
pub type VMSharedMemory = VMMemory;