From fe04ea894b93f4126bc2853269c2064ca59f843e Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Thu, 15 Jul 2021 23:57:07 -0700 Subject: [PATCH] Added WebAssembly Module converter --- lib/js-api/Cargo.toml | 2 +- lib/js-api/src/module.rs | 11 +++++++++++ lib/js-api/src/ptr.rs | 19 +++++-------------- lib/js-api/tests/module.rs | 11 +++++++++++ 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/lib/js-api/Cargo.toml b/lib/js-api/Cargo.toml index 35688464484..9cc65398e86 100644 --- a/lib/js-api/Cargo.toml +++ b/lib/js-api/Cargo.toml @@ -40,7 +40,7 @@ wasm-bindgen-test = "0.3.0" maintenance = { status = "actively-developed" } [features] -default = ["std", "wasm-types-polyfill"] +default = ["std", "wasm-types-polyfill", "wat"] wasm-types-polyfill = ["wasmparser"] std = [] core = [] diff --git a/lib/js-api/src/module.rs b/lib/js-api/src/module.rs index 1735348ff11..a976d337153 100644 --- a/lib/js-api/src/module.rs +++ b/lib/js-api/src/module.rs @@ -506,3 +506,14 @@ impl fmt::Debug for Module { .finish() } } + +impl From for Module { + fn from(module: WebAssembly::Module) -> Module { + Module { + store: Store::default(), + module, + name: None, + type_hints: None, + } + } +} diff --git a/lib/js-api/src/ptr.rs b/lib/js-api/src/ptr.rs index 449851489d5..e64aab94d25 100644 --- a/lib/js-api/src/ptr.rs +++ b/lib/js-api/src/ptr.rs @@ -86,13 +86,6 @@ impl WasmPtr { } } -#[inline(always)] -fn align_pointer(ptr: usize, align: usize) -> usize { - // clears bits below aligment amount (assumes power of 2) to align pointer - debug_assert!(align.count_ones() == 1); - ptr & !(align - 1) -} - /// Methods for `WasmPtr`s to data that can be dereferenced, namely to types /// that implement [`ValueType`], meaning that they're valid for all possible /// bit patterns. @@ -109,8 +102,7 @@ impl WasmPtr { if total_len > memory.size().bytes().0 || mem::size_of::() == 0 { return None; } - let offset = align_pointer(self.offset as usize, mem::align_of::()) as u32; - let subarray = memory.uint8view().subarray(offset, total_len as u32); + let subarray = memory.uint8view().subarray(self.offset, total_len as u32); Some(WasmCell::new(subarray)) } } @@ -140,14 +132,13 @@ impl WasmPtr { return None; } - let offset = align_pointer(self.offset as usize, mem::align_of::()) as u32; - Some( (0..length) .map(|i| { - let subarray = memory - .uint8view() - .subarray(offset + i * item_size, offset + (i + 1) * item_size); + let subarray = memory.uint8view().subarray( + self.offset + i * item_size, + self.offset + (i + 1) * item_size, + ); WasmCell::new(subarray) }) .collect::>(), diff --git a/lib/js-api/tests/module.rs b/lib/js-api/tests/module.rs index f254f909754..5698e8e9d71 100644 --- a/lib/js-api/tests/module.rs +++ b/lib/js-api/tests/module.rs @@ -1,3 +1,4 @@ +use js_sys::{Uint8Array, WebAssembly}; use wasm_bindgen_test::*; use wasmer_js::*; @@ -22,6 +23,16 @@ fn module_set_name() { assert_eq!(module.name(), Some("new_name")); } +#[wasm_bindgen_test] +fn module_from_jsmodule() { + let wat = br#"(module $name)"#; + let binary = wat2wasm(wat).unwrap(); + let js_bytes = unsafe { Uint8Array::view(&binary) }; + let js_module = WebAssembly::Module::new(&js_bytes.into()).unwrap(); + let module: Module = js_module.into(); + assert_eq!(module.store(), &Store::default()); +} + #[wasm_bindgen_test] fn imports() { let store = Store::default();