Skip to content

Commit

Permalink
Merge pull request #969 from alexcrichton/no-modules-moudle
Browse files Browse the repository at this point in the history
Allow passing a `WebAssembly.Module` in `--no-modules`
  • Loading branch information
alexcrichton committed Oct 16, 2018
2 parents 0b59657 + 34b75c3 commit 995aefa
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 27 deletions.
47 changes: 26 additions & 21 deletions crates/cli-support/src/js/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -418,27 +418,32 @@ impl<'a> Context<'a> {
let mut js = if self.config.no_modules {
format!(
"\
(function() {{
var wasm;
const __exports = {{}};
{globals}
function init(wasm_path) {{
const fetchPromise = fetch(wasm_path);
let resultPromise;
if (typeof WebAssembly.instantiateStreaming === 'function') {{
resultPromise = WebAssembly.instantiateStreaming(fetchPromise, {{ './{module}': __exports }});
}} else {{
resultPromise = fetchPromise
.then(response => response.arrayBuffer())
.then(buffer => WebAssembly.instantiate(buffer, {{ './{module}': __exports }}));
}}
return resultPromise.then(({{instance}}) => {{
wasm = init.wasm = instance.exports;
return;
}});
}};
self.{global_name} = Object.assign(init, __exports);
}})();",
(function() {{
var wasm;
const __exports = {{}};
{globals}
function init(path_or_module) {{
let instantiation;
const imports = {{ './{module}': __exports }};
if (path_or_module instanceof WebAssembly.Module) {{
instantiation = WebAssembly.instantiate(path_or_module, imports);
}} else {{
const data = fetch(path_or_module);
if (typeof WebAssembly.instantiateStreaming === 'function') {{
instantiation = WebAssembly.instantiateStreaming(data, imports);
}} else {{
instantiation = data
.then(response => response.arrayBuffer())
.then(buffer => WebAssembly.instantiate(buffer, imports));
}}
}}
return instantiation.then(({{instance}}) => {{
wasm = init.wasm = instance.exports;
return;
}});
}};
self.{global_name} = Object.assign(init, __exports);
}})();",
globals = self.globals,
module = module_name,
global_name = self.config.no_modules_global
Expand Down
12 changes: 6 additions & 6 deletions guide/src/reference/no-esm.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,14 @@ for the wasm-module-to-be. The page is configured with one exported global, in
this case `wasm_bindgen`. The name of this global can be configured with the
`--no-modules-global` option.

The global `wasm_bindgen` is a function that takes one argument, the path to the
wasm file. When invoked `wasm_bindgen` will return a promise for when the wasm
file is ready-to-go. After that all exported functionality on
`wasm_bindgen` will be functional.
The global `wasm_bindgen` is a function that takes one argument: either the path
to the wasm file to fetch or a `WebAssembly.Module`. When invoked `wasm_bindgen`
will return a promise for when the wasm module is ready-to-go. After that all
exported functionality on `wasm_bindgen` will be functional.

In the example above, after calling `wasm_bindgen('./hello_bg.wasm')` we wait
for the wasm module to be compiled, and afterwards we're invoking our `greet`
export.
for the wasm module to be fetched and compiled, and afterwards we're invoking
our `greet` export.

Note that exports are available for binding before the wasm module has been
instantiated, for example this would have also worked:
Expand Down

0 comments on commit 995aefa

Please sign in to comment.