wasm_core/
resolver.rs

1use executor::{NativeResolver, NativeEntry, ExecuteError};
2use value::Value;
3
4pub struct NullResolver {
5
6}
7
8impl NativeResolver for NullResolver {
9    fn resolve(&self, _module: &str, _field: &str) -> Option<NativeEntry> {
10        None
11    }
12}
13
14impl NullResolver {
15    pub fn new() -> NullResolver {
16        NullResolver {}
17    }
18}
19
20pub struct EmscriptenResolver<I: NativeResolver> {
21    inner: I
22}
23
24impl<I: NativeResolver> EmscriptenResolver<I> {
25    pub fn new(inner: I) -> EmscriptenResolver<I> {
26        EmscriptenResolver {
27            inner: inner
28        }
29    }
30}
31
32impl<I: NativeResolver> NativeResolver for EmscriptenResolver<I> {
33    fn resolve(&self, module: &str, field: &str) -> Option<NativeEntry> {
34        if module != "env" {
35            return self.inner.resolve(module, field);
36        }
37
38        match field {
39            "abortStackOverflow" => {
40                Some(Box::new(|_, _| {
41                    Err(ExecuteError::Custom("Emscripten stack overflow".into()))
42                }))
43            },
44            "getTotalMemory" => {
45                Some(Box::new(|rt, _| {
46                    Ok(Some(Value::I32(rt.get_memory().len() as i32)))
47                }))
48            },
49            _ => self.inner.resolve(module, field)
50        }
51    }
52}