From 9a028abfe5b2f1c6efc87494ee449178f47c8c26 Mon Sep 17 00:00:00 2001 From: Syrus Date: Mon, 10 Dec 2018 21:19:39 -0800 Subject: [PATCH] Refactored emscripten usage to allow future ABIs --- examples/nginx/logs/nginx.pid | 2 +- src/bin/wasmer.rs | 23 ++++++++++++++--------- src/emtests/_common.rs | 4 ++-- src/webassembly/instance.rs | 14 ++++++++++---- src/webassembly/mod.rs | 11 +++++++++-- 5 files changed, 36 insertions(+), 18 deletions(-) diff --git a/examples/nginx/logs/nginx.pid b/examples/nginx/logs/nginx.pid index ccc2e22c5..918d79d8e 100644 --- a/examples/nginx/logs/nginx.pid +++ b/examples/nginx/logs/nginx.pid @@ -1 +1 @@ -12824 +96248 diff --git a/src/bin/wasmer.rs b/src/bin/wasmer.rs index b5bd79b66..d70ce9cc0 100644 --- a/src/bin/wasmer.rs +++ b/src/bin/wasmer.rs @@ -70,24 +70,29 @@ fn execute_wasm(options: &Run) -> Result<(), String> { debug!("webassembly - creating module"); let module = webassembly::compile(wasm_binary).map_err(|err| format!("Can't create the WebAssembly module: {}", err))?; - let is_emscripten = apis::is_emscripten_module(&module); + let abi = if apis::is_emscripten_module(&module) { + webassembly::InstanceABI::Emscripten + } else { + webassembly::InstanceABI::None + }; + + + let import_object = if abi == webassembly::InstanceABI::Emscripten { + apis::generate_emscripten_env() + } + else { + webassembly::ImportObject::new() + }; let instance_options = webassembly::InstanceOptions { mock_missing_imports: true, mock_missing_globals: true, mock_missing_tables: true, - use_emscripten: is_emscripten, + abi: abi, show_progressbar: true, isa: isa, }; - let import_object = if is_emscripten { - apis::generate_emscripten_env() - } - else { - webassembly::ImportObject::new() - }; - debug!("webassembly - creating instance"); let mut instance = webassembly::Instance::new( &module, diff --git a/src/emtests/_common.rs b/src/emtests/_common.rs index 3d3c151aa..607a96e99 100644 --- a/src/emtests/_common.rs +++ b/src/emtests/_common.rs @@ -2,7 +2,7 @@ macro_rules! assert_emscripten_output { ($file:expr, $name:expr, $args:expr, $expected:expr) => {{ use crate::apis::generate_emscripten_env; - use crate::webassembly::{instantiate, start_instance, InstanceOptions, get_isa}; + use crate::webassembly::{instantiate, start_instance, InstanceOptions, get_isa, InstanceABI}; use crate::common::stdio::StdioCapturer; let wasm_bytes = include_bytes!($file); @@ -11,7 +11,7 @@ macro_rules! assert_emscripten_output { mock_missing_imports: true, mock_missing_globals: true, mock_missing_tables: true, - use_emscripten: true, + abi: InstanceABI::Emscripten, show_progressbar: false, isa: get_isa(), }); diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index 325f8862a..c517a339a 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -85,6 +85,12 @@ impl fmt::Debug for EmscriptenData { } } +#[derive(PartialEq)] +pub enum InstanceABI { + Emscripten, + None +} + /// An Instance of a WebAssembly module /// NOTE: There is an assumption that data_pointers is always the /// first field @@ -139,7 +145,7 @@ pub struct InstanceOptions { pub mock_missing_imports: bool, pub mock_missing_globals: bool, pub mock_missing_tables: bool, - pub use_emscripten: bool, + pub abi: InstanceABI, pub show_progressbar: bool, pub isa: Box, } @@ -495,7 +501,7 @@ impl Instance { let memory = memory.entity; // If we use emscripten, we set a fixed initial and maximum debug!("Instance - init memory ({}, {:?})", memory.pages_count, memory.maximum); - let memory = if options.use_emscripten { + let memory = if options.abi == InstanceABI::Emscripten { // We use MAX_PAGES, so at the end the result is: // (initial * LinearMemory::PAGE_SIZE) == LinearMemory::DEFAULT_HEAP_SIZE // However, it should be: (initial * LinearMemory::PAGE_SIZE) == 16777216 @@ -520,7 +526,7 @@ impl Instance { let to_init = &mut mem[offset..offset + init.data.len()]; to_init.copy_from_slice(&init.data); } - if options.use_emscripten { + if options.abi == InstanceABI::Emscripten { debug!("emscripten::setup memory"); crate::apis::emscripten::emscripten_set_up_memory(&mut memories[0]); debug!("emscripten::finish setup memory"); @@ -550,7 +556,7 @@ impl Instance { tables: tables_pointer[..].into(), }; - let emscripten_data = if options.use_emscripten { + let emscripten_data = if options.abi == InstanceABI::Emscripten { unsafe { debug!("emscripten::initiating data"); let malloc_export = module.info.exports.get("_malloc"); diff --git a/src/webassembly/mod.rs b/src/webassembly/mod.rs index 350499419..a481b557f 100644 --- a/src/webassembly/mod.rs +++ b/src/webassembly/mod.rs @@ -19,7 +19,7 @@ use wasmparser::WasmDecoder; pub use self::errors::{Error, ErrorKind}; pub use self::import_object::{ImportObject, ImportValue}; -pub use self::instance::{Instance, InstanceOptions}; +pub use self::instance::{Instance, InstanceOptions, InstanceABI}; pub use self::memory::LinearMemory; pub use self::module::{Export, Module, ModuleInfo}; @@ -56,11 +56,18 @@ pub fn instantiate( let isa = get_isa(); let module = compile(buffer_source)?; + let abi = if is_emscripten_module(&module) { + InstanceABI::Emscripten + } + else { + InstanceABI::None + }; + let options = options.unwrap_or_else(|| InstanceOptions { mock_missing_imports: false, mock_missing_globals: false, mock_missing_tables: false, - use_emscripten: is_emscripten_module(&module), + abi: abi, show_progressbar: false, isa: isa, });