diff --git a/src/interpreter/memory.rs b/src/interpreter/memory.rs index e9fed3d..3594ab7 100644 --- a/src/interpreter/memory.rs +++ b/src/interpreter/memory.rs @@ -2,7 +2,7 @@ use std::u32; use std::ops::Range; use std::cmp; use std::fmt; -use parking_lot::RwLock; +use std::cell::RefCell; use elements::{MemoryType, ResizableLimits}; use interpreter::Error; use interpreter::module::check_limits; @@ -17,7 +17,7 @@ pub struct MemoryInstance { /// Memofy limits. limits: ResizableLimits, /// Linear memory buffer. - buffer: RwLock>, + buffer: RefCell>, /// Maximum buffer size. maximum_size: u32, } @@ -26,7 +26,7 @@ impl fmt::Debug for MemoryInstance { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("MemoryInstance") .field("limits", &self.limits) - .field("buffer.len", &self.buffer.read().len()) + .field("buffer.len", &self.buffer.borrow().len()) .field("maximum_size", &self.maximum_size) .finish() } @@ -71,7 +71,7 @@ impl MemoryInstance { let memory = MemoryInstance { limits: memory_type.limits().clone(), - buffer: RwLock::new(vec![0; initial_size as usize]), + buffer: RefCell::new(vec![0; initial_size as usize]), maximum_size: maximum_size, }; @@ -85,12 +85,12 @@ impl MemoryInstance { /// Return linear memory size (in pages). pub fn size(&self) -> u32 { - self.buffer.read().len() as u32 / LINEAR_MEMORY_PAGE_SIZE + self.buffer.borrow().len() as u32 / LINEAR_MEMORY_PAGE_SIZE } /// Get data at given offset. pub fn get(&self, offset: u32, size: usize) -> Result, Error> { - let buffer = self.buffer.read(); + let buffer = self.buffer.borrow(); let region = self.checked_region(&buffer, offset as usize, size)?; Ok(region.slice().to_vec()) @@ -98,7 +98,7 @@ impl MemoryInstance { /// Write memory slice into another slice pub fn get_into(&self, offset: u32, target: &mut [u8]) -> Result<(), Error> { - let buffer = self.buffer.read(); + let buffer = self.buffer.borrow(); let region = self.checked_region(&buffer, offset as usize, target.len())?; target.copy_from_slice(region.slice()); @@ -108,7 +108,7 @@ impl MemoryInstance { /// Set data at given offset. pub fn set(&self, offset: u32, value: &[u8]) -> Result<(), Error> { - let mut buffer = self.buffer.write(); + let mut buffer = self.buffer.borrow_mut(); let range = self.checked_region(&buffer, offset as usize, value.len())?.range(); buffer[range].copy_from_slice(value); @@ -119,7 +119,7 @@ impl MemoryInstance { /// Increases the size of the linear memory by given number of pages. /// Returns -1 if allocation fails or previous memory size, if succeeds. pub fn grow(&self, pages: u32) -> Result { - let mut buffer = self.buffer.write(); + let mut buffer = self.buffer.borrow_mut(); let old_size = buffer.len() as u32; match calculate_memory_size(old_size, pages, self.maximum_size) { None => Ok(u32::MAX), @@ -149,7 +149,7 @@ impl MemoryInstance { /// Copy memory region. Semantically equivalent to `memmove`. pub fn copy(&self, src_offset: usize, dst_offset: usize, len: usize) -> Result<(), Error> { - let buffer = self.buffer.write(); + let buffer = self.buffer.borrow_mut(); let read_region = self.checked_region(&buffer, src_offset, len)?; let write_region = self.checked_region(&buffer, dst_offset, len)?; @@ -166,7 +166,7 @@ impl MemoryInstance { /// Copy memory region, non-overlapping version. Semantically equivalent to `memcpy`, /// but returns Error if source overlaping with destination. pub fn copy_nonoverlapping(&self, src_offset: usize, dst_offset: usize, len: usize) -> Result<(), Error> { - let buffer = self.buffer.write(); + let buffer = self.buffer.borrow_mut(); let read_region = self.checked_region(&buffer, src_offset, len)?; let write_region = self.checked_region(&buffer, dst_offset, len)?; @@ -186,7 +186,7 @@ impl MemoryInstance { /// Clear memory region with a specified value. Semantically equivalent to `memset`. pub fn clear(&self, offset: usize, new_val: u8, len: usize) -> Result<(), Error> { - let mut buffer = self.buffer.write(); + let mut buffer = self.buffer.borrow_mut(); let range = self.checked_region(&buffer, offset, len)?.range(); for val in &mut buffer[range] { *val = new_val } diff --git a/src/interpreter/table.rs b/src/interpreter/table.rs index 8cd49d7..b969547 100644 --- a/src/interpreter/table.rs +++ b/src/interpreter/table.rs @@ -1,7 +1,7 @@ use std::u32; use std::fmt; use std::rc::Rc; -use parking_lot::RwLock; +use std::cell::RefCell; use elements::{TableType, ResizableLimits}; use interpreter::Error; use interpreter::module::check_limits; @@ -12,7 +12,7 @@ pub struct TableInstance { /// Table limits. limits: ResizableLimits, /// Table memory buffer. - buffer: RwLock>>>>, + buffer: RefCell>>>>, } @@ -20,7 +20,7 @@ impl fmt::Debug for TableInstance { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("TableInstance") .field("limits", &self.limits) - .field("buffer.len", &self.buffer.read().len()) + .field("buffer.len", &self.buffer.borrow().len()) .finish() } } @@ -31,7 +31,7 @@ impl TableInstance { check_limits(table_type.limits())?; Ok(TableInstance { limits: table_type.limits().clone(), - buffer: RwLock::new( + buffer: RefCell::new( vec![None; table_type.limits().initial() as usize] ), }) @@ -44,7 +44,7 @@ impl TableInstance { /// Get the specific value in the table pub fn get(&self, offset: u32) -> Result>, Error> { - let buffer = self.buffer.read(); + let buffer = self.buffer.borrow(); let buffer_len = buffer.len(); let table_elem = buffer.get(offset as usize).cloned().ok_or(Error::Table(format!( "trying to read table item with index {} when there are only {} items", @@ -59,7 +59,7 @@ impl TableInstance { /// Set the table element to the specified function. pub fn set(&self, offset: u32, value: Rc>) -> Result<(), Error> { - let mut buffer = self.buffer.write(); + let mut buffer = self.buffer.borrow_mut(); let buffer_len = buffer.len(); let table_elem = buffer.get_mut(offset as usize).ok_or(Error::Table(format!( "trying to update table item with index {} when there are only {} items",