env memory

This commit is contained in:
Svyatoslav Nikolsky
2017-05-04 12:01:21 +03:00
parent b4215aed3c
commit 9a5ed312ec
2 changed files with 17 additions and 4 deletions

View File

@ -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<MemoryInstance>,
}
impl EnvModuleInstance {
pub fn new(module: Module) -> Result<Self, Error> {
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<Arc<MemoryInstance>, Error> {
unimplemented!()
fn memory(&self, index: ItemIndex) -> Result<Arc<MemoryInstance>, 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<Arc<VariableInstance>, Error> {
@ -60,7 +67,10 @@ impl ModuleInstanceInterface for EnvModuleInstance {
pub fn env_module() -> Result<EnvModuleInstance, Error> {
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)
}

View File

@ -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<String> for Error {
Error::Stack(s) => s,
Error::Interpreter(s) => s,
Error::Value(s) => s,
Error::Env(s) => s,
Error::Trap(s) => format!("trap: {}", s),
}
}