diff --git a/src/interpreter/env.rs b/src/interpreter/env.rs index 9068f06..2991973 100644 --- a/src/interpreter/env.rs +++ b/src/interpreter/env.rs @@ -1,6 +1,6 @@ use std::sync::Arc; use builder::module; -use elements::{Module, FunctionType}; +use elements::{Module, FunctionType, ExportEntry, Internal, MemoryType}; use interpreter::Error; use interpreter::module::{ModuleInstanceInterface, ItemIndex, CallerContext}; use interpreter::memory::MemoryInstance; @@ -8,14 +8,18 @@ use interpreter::table::TableInstance; use interpreter::value::RuntimeValue; use interpreter::variable::VariableInstance; +const MEMORY_LIMIT_MIN: u32 = 1; + pub struct EnvModuleInstance { module: Module, + memory: Arc, } impl EnvModuleInstance { pub fn new(module: Module) -> Result { Ok(EnvModuleInstance { module: module, + memory: MemoryInstance::new(&MemoryType::new(MEMORY_LIMIT_MIN, None))?, }) } } @@ -37,8 +41,11 @@ impl ModuleInstanceInterface for EnvModuleInstance { unimplemented!() } - fn memory(&self, _index: ItemIndex) -> Result, Error> { - unimplemented!() + fn memory(&self, index: ItemIndex) -> Result, Error> { + match &index { + &ItemIndex::Internal(0) => Ok(self.memory.clone()), + _ => Err(Error::Env(format!("trying to get memory with index {:?}", index))), + } } fn global(&self, _index: ItemIndex) -> Result, Error> { @@ -60,7 +67,10 @@ impl ModuleInstanceInterface for EnvModuleInstance { pub fn env_module() -> Result { let module = module() - .memory().build() // TODO: limits + .memory() + .with_min(MEMORY_LIMIT_MIN) + .build() + .with_export(ExportEntry::new("memory".into(), Internal::Memory(0))) .build(); EnvModuleInstance::new(module) } diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index bf0d2dc..f9c44f7 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -25,6 +25,8 @@ pub enum Error { Value(String), /// Interpreter (code) error. Interpreter(String), + /// Env module error. + Env(String), /// Trap. Trap(String), } @@ -43,6 +45,7 @@ impl Into for Error { Error::Stack(s) => s, Error::Interpreter(s) => s, Error::Value(s) => s, + Error::Env(s) => s, Error::Trap(s) => format!("trap: {}", s), } }