diff --git a/src/webassembly/execute.rs b/src/webassembly/execute.rs index bb4d6c617..a8b9ea360 100644 --- a/src/webassembly/execute.rs +++ b/src/webassembly/execute.rs @@ -191,6 +191,42 @@ pub fn execute( } +pub fn execute_fn( + module: &Module, + compilation: &Compilation, + instance: &mut Instance, + func_name: String, +) -> Result<(), String> { + println!("execute"); + + let start_index = match module.exports.get(&func_name) { + Some(&Export::Function(index)) => index, + _ => panic!("No func name") + }; + + let code_buf = &compilation.functions[module + .defined_func_index(start_index) + .expect("imported start functions not supported yet")]; + + // Collect all memory base addresses and Vec. + let mut mem_base_addrs = instance + .memories + .iter_mut() + .map(LinearMemory::base_addr) + .collect::>(); + let vmctx = make_vmctx(instance, &mut mem_base_addrs); + + unsafe { + let start_func = transmute::<_, fn(*const *mut u8)>(code_buf.as_ptr()); + start_func(vmctx.as_ptr()) + } + println!("{:?}", module.exports); + println!("execute end"); + + + Ok(()) +} + // pub fn execute_fn( // instance: &mut Instance, // func_name: String diff --git a/src/webassembly/mod.rs b/src/webassembly/mod.rs index 59741f3ed..06b044078 100644 --- a/src/webassembly/mod.rs +++ b/src/webassembly/mod.rs @@ -12,8 +12,8 @@ use cranelift_codegen::isa::TargetIsa; use cranelift_codegen::settings; use cranelift_codegen::settings::Configurable; -pub use self::compilation::compile_module; -pub use self::environ::ModuleEnvironment; +pub use self::compilation::{compile_module, Compilation}; +pub use self::environ::{ModuleEnvironment}; pub use self::module::Module; pub use self::instance::Instance; pub use self::errors::{Error, ErrorKind}; @@ -26,7 +26,9 @@ pub struct ResultObject { pub module: Module, /// A WebAssembly.Instance object that contains all the Exported WebAssembly /// functions. - pub instance: Instance + pub instance: Instance, + + pub compilation: Compilation, } pub struct ImportObject { @@ -77,7 +79,8 @@ pub fn instantiate(buffer_source: Vec, import_object: Option) Ok(ResultObject { module, - instance + instance, + compilation, }) }