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}