use crate::{BrainfuckAllocator, BrainfuckCell, OutOfBoundsAccess, VMMemoryError};
pub struct DynamicAllocator;
impl BrainfuckAllocator for DynamicAllocator {
fn ensure_capacity<T: BrainfuckCell>(
data: &mut Vec<T>,
min_size: usize,
) -> Result<(), VMMemoryError> {
log::trace!("ensure_capacity {} in DynamicAllocator", min_size);
if data.len() < min_size {
log::trace!("Expanding amount of cells to {}", min_size);
data.resize(min_size, T::default());
}
Ok(())
}
}
pub struct BoundsCheckingStaticAllocator;
impl BrainfuckAllocator for BoundsCheckingStaticAllocator {
fn ensure_capacity<T: BrainfuckCell>(
data: &mut Vec<T>,
min_size: usize,
) -> Result<(), VMMemoryError> {
log::trace!(
"ensure_capacity {} in BoundsCheckingStaticAllocator",
min_size
);
if min_size > data.len() {
log::info!(
"Detected possible out-of-bounds access at index {} (current capacity: {})",
min_size - 1,
data.len()
);
Err(VMMemoryError::OutOfBounds(OutOfBoundsAccess {
capacity: data.len(),
access: min_size,
}))
} else {
Ok(())
}
}
}
pub struct StaticAllocator;
impl BrainfuckAllocator for StaticAllocator {
fn ensure_capacity<T: BrainfuckCell>(
_: &mut Vec<T>,
min_size: usize,
) -> Result<(), VMMemoryError> {
log::trace!("ensure_capacity {} in StaticAllocator", min_size);
Ok(())
}
}