pub use crate::store::{LazyLinearMemory, LinearMemory, MemoryBackend, PagedMemory, VecMemory};
#[derive(Clone, Default)]
#[cfg_attr(feature = "debug", derive(Debug))]
pub struct Engine {
pub(crate) config: Config,
}
impl Engine {
pub fn new(config: Config) -> Self {
Self { config }
}
pub fn config(&self) -> &Config {
&self.config
}
}
#[non_exhaustive]
#[derive(Default, Clone, Copy)]
#[cfg_attr(feature = "debug", derive(Debug))]
pub enum FuelPolicy {
#[default]
PerInstruction,
Weighted,
}
pub const DEFAULT_VALUE_STACK_32_SIZE: usize = 36 * 1024;
pub const DEFAULT_VALUE_STACK_64_SIZE: usize = 32 * 1024;
pub const DEFAULT_VALUE_STACK_128_SIZE: usize = 4 * 1024;
pub const DEFAULT_MAX_CALL_STACK_SIZE: usize = 1024;
#[derive(Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "debug", derive(Debug))]
pub struct StackConfig {
pub initial_size: usize,
pub max_size: usize,
pub dynamic: bool,
}
impl StackConfig {
pub const fn fixed(size: usize) -> Self {
Self { initial_size: size, max_size: size, dynamic: false }
}
pub const fn dynamic(initial_size: usize, max_size: usize) -> Self {
assert!(initial_size <= max_size, "initial_size must be less than or equal to max_size");
Self { initial_size, max_size, dynamic: true }
}
}
#[derive(Clone)]
#[cfg_attr(feature = "debug", derive(Debug))]
#[non_exhaustive]
pub struct Config {
pub value_stack_32: StackConfig,
pub value_stack_64: StackConfig,
pub value_stack_128: StackConfig,
pub call_stack: StackConfig,
pub fuel_policy: FuelPolicy,
pub memory_backend: MemoryBackend,
pub trap_on_oom: bool,
}
impl Config {
pub fn new() -> Self {
Self::default()
}
pub fn with_fuel_policy(mut self, fuel_policy: FuelPolicy) -> Self {
self.fuel_policy = fuel_policy;
self
}
pub fn with_memory_backend(mut self, memory_backend: MemoryBackend) -> Self {
self.memory_backend = memory_backend;
self
}
pub fn with_value_stack_32(mut self, stack: StackConfig) -> Self {
self.value_stack_32 = stack;
self
}
pub fn with_value_stack(mut self, stack: StackConfig) -> Self {
self.value_stack_32 = stack;
self.value_stack_64 = stack;
self.value_stack_128 = stack;
self
}
pub fn with_value_stack_64(mut self, stack: StackConfig) -> Self {
self.value_stack_64 = stack;
self
}
pub fn with_value_stack_128(mut self, stack: StackConfig) -> Self {
self.value_stack_128 = stack;
self
}
pub fn with_call_stack(mut self, stack: StackConfig) -> Self {
self.call_stack = stack;
self
}
pub fn with_trap_on_oom(mut self, trap_on_oom: bool) -> Self {
self.trap_on_oom = trap_on_oom;
self
}
pub fn fuel_policy(&self) -> FuelPolicy {
self.fuel_policy
}
pub fn memory_backend(&self) -> &MemoryBackend {
&self.memory_backend
}
pub(crate) const fn trap_on_oom(&self) -> bool {
self.trap_on_oom
}
}
impl Default for Config {
fn default() -> Self {
Self {
value_stack_32: StackConfig::fixed(DEFAULT_VALUE_STACK_32_SIZE),
value_stack_64: StackConfig::fixed(DEFAULT_VALUE_STACK_64_SIZE),
value_stack_128: StackConfig::fixed(DEFAULT_VALUE_STACK_128_SIZE),
call_stack: StackConfig::fixed(DEFAULT_MAX_CALL_STACK_SIZE),
fuel_policy: FuelPolicy::default(),
memory_backend: MemoryBackend::default(),
trap_on_oom: false,
}
}
}