wasm-core 0.2.15

Portable WebAssembly implementation
Documentation
use executor::{NativeResolver, NativeEntry, ExecuteError};
use value::Value;

pub struct NullResolver {

}

impl NativeResolver for NullResolver {
    fn resolve(&self, _module: &str, _field: &str) -> Option<NativeEntry> {
        None
    }
}

impl NullResolver {
    pub fn new() -> NullResolver {
        NullResolver {}
    }
}

pub struct EmscriptenResolver<I: NativeResolver> {
    inner: I
}

impl<I: NativeResolver> EmscriptenResolver<I> {
    pub fn new(inner: I) -> EmscriptenResolver<I> {
        EmscriptenResolver {
            inner: inner
        }
    }
}

impl<I: NativeResolver> NativeResolver for EmscriptenResolver<I> {
    fn resolve(&self, module: &str, field: &str) -> Option<NativeEntry> {
        if module != "env" {
            return self.inner.resolve(module, field);
        }

        match field {
            "abortStackOverflow" => {
                Some(Box::new(|_, _| {
                    Err(ExecuteError::Custom("Emscripten stack overflow".into()))
                }))
            },
            "getTotalMemory" => {
                Some(Box::new(|rt, _| {
                    Ok(Some(Value::I32(rt.get_memory().len() as i32)))
                }))
            },
            _ => self.inner.resolve(module, field)
        }
    }
}