1
0
mirror of https://github.com/fluencelabs/wasm-bindgen synced 2025-07-26 09:31:56 +00:00

Add a #[wasm_bindgen(start)] attribute

This commit adds a new attribute to `#[wasm_bindgen]`: `start`. The
`start` attribute can be used to indicate that a function should be
executed when the module is loaded, configuring the `start` function of
the wasm executable. While this doesn't necessarily literally configure
the `start` section, it does its best!

Only one crate in a crate graph may indicate `#[wasm_bindgen(start)]`,
so it's not recommended to be used in libraries but only end-user
applications. Currently this still must be used with the `crate-type =
["cdylib"]` annotation in `Cargo.toml`.

The implementation here is somewhat tricky because of the circular
dependency between our generated JS and the wasm file that we emit. This
circular dependency makes running initialization routines (like the
`start` shim) particularly fraught with complications because one may
need to run before the other but bundlers may not necessarily respect
it. Workarounds have been implemented for various emission strategies,
for example calling the start function directly after exports are wired
up with `--no-modules` and otherwise working around what appears to be
a Webpack bug with initializers running in a different order than we'd
like. In any case, this in theory doesn't show up to the end user!

Closes 
This commit is contained in:
Alex Crichton
2018-11-28 09:25:51 -08:00
parent f4c1c64078
commit a2aa28e4d3
35 changed files with 430 additions and 167 deletions
crates
backend
cli-support
cli
src
bin
wasm-bindgen-test-runner
macro-support
macro
shared
examples
canvas
closures
console_log
dom
import_js
no_modules
paint
performance
wasm-in-wasm
webgl
guide/src
SUMMARY.md
reference
attributes
on-rust-exports
tests/wasm

@@ -17,8 +17,7 @@ macro_rules! console_log {
($($t:tt)*) => (log(&format_args!($($t)*).to_string()))
}
// Called by our JS entry point to run the example
#[wasm_bindgen]
#[wasm_bindgen(start)]
pub fn run() {
let window = web_sys::window().expect("should have a window in this context");
let performance = window