use std::rc::Rc;
use wasm3x_sys as ffi;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CompilationMode {
#[default]
Lazy,
Eager,
}
#[derive(Debug, Clone)]
pub struct Config {
compilation_mode: CompilationMode,
stack_size: u32,
}
impl Default for Config {
fn default() -> Self {
Self {
compilation_mode: CompilationMode::Lazy,
stack_size: 1024 * 1024,
}
}
}
impl Config {
pub fn new() -> Self {
Self::default()
}
pub fn compilation_mode(&mut self, mode: CompilationMode) -> &mut Self {
self.compilation_mode = mode;
self
}
pub fn stack_size(&mut self, bytes: usize) -> &mut Self {
self.stack_size = bytes as u32;
self
}
pub fn get_compilation_mode(&self) -> CompilationMode {
self.compilation_mode
}
pub(crate) fn get_stack_size(&self) -> u32 {
self.stack_size
}
}
#[derive(Clone)]
pub struct Engine {
inner: Rc<EngineInner>,
}
struct EngineInner {
env: ffi::IM3Environment,
config: Config,
}
impl Drop for EngineInner {
fn drop(&mut self) {
unsafe { ffi::m3_FreeEnvironment(self.env) }
}
}
impl Engine {
pub fn new(config: &Config) -> Self {
let env = unsafe { ffi::m3_NewEnvironment() };
assert!(!env.is_null(), "wasm3: failed to allocate environment");
Self {
inner: Rc::new(EngineInner {
env,
config: config.clone(),
}),
}
}
pub fn config(&self) -> &Config {
&self.inner.config
}
pub fn same(a: &Engine, b: &Engine) -> bool {
Rc::ptr_eq(&a.inner, &b.inner)
}
pub(crate) fn raw(&self) -> ffi::IM3Environment {
self.inner.env
}
}
impl Default for Engine {
fn default() -> Self {
Self::new(&Config::default())
}
}