Skip to content

Commit

Permalink
Added WebAssembly Module converter
Browse files Browse the repository at this point in the history
  • Loading branch information
syrusakbary committed Jul 16, 2021
1 parent 88ff6b8 commit fe04ea8
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 15 deletions.
2 changes: 1 addition & 1 deletion lib/js-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
11 changes: 11 additions & 0 deletions lib/js-api/src/module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -506,3 +506,14 @@ impl fmt::Debug for Module {
.finish()
}
}

impl From<WebAssembly::Module> for Module {
fn from(module: WebAssembly::Module) -> Module {
Module {
store: Store::default(),
module,
name: None,
type_hints: None,
}
}
}
19 changes: 5 additions & 14 deletions lib/js-api/src/ptr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,6 @@ impl<T: Copy, Ty> WasmPtr<T, Ty> {
}
}

#[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.
Expand All @@ -109,8 +102,7 @@ impl<T: Copy + ValueType> WasmPtr<T, Item> {
if total_len > memory.size().bytes().0 || mem::size_of::<T>() == 0 {
return None;
}
let offset = align_pointer(self.offset as usize, mem::align_of::<T>()) 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))
}
}
Expand Down Expand Up @@ -140,14 +132,13 @@ impl<T: Copy + ValueType> WasmPtr<T, Array> {
return None;
}

let offset = align_pointer(self.offset as usize, mem::align_of::<T>()) 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::<Vec<_>>(),
Expand Down
11 changes: 11 additions & 0 deletions lib/js-api/tests/module.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use js_sys::{Uint8Array, WebAssembly};
use wasm_bindgen_test::*;
use wasmer_js::*;

Expand All @@ -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();
Expand Down

0 comments on commit fe04ea8

Please sign in to comment.