This repo contains a prototype built to demonstrate the viability of a WebAssembly polyfill. Work is ongoing in other repos to design the actual standard binary format. This prototype also makes no attempt to call native browser decoding and so it is not, technically, a polyfill but rather a pure JS library.
See FAQ entry.
A real (non-prototype) polyfill would hook into an ES6 Module loader polyfill so that loading a WebAssembly module will Just Work. The scheme described here is just a proof of concept for how the polyfill can avoid massive copying, string manipulation and garbage.
loadWebAssembly
and receives a Promise<Function>
.unpack.cpp
concatenated with the glue code in
load-wasm-worker.js
.Blob
(a read-only copy) from a view of just the asm.js UTF8 bytes.Blob
is postMessage()
ed back to the main thread (a non-copying
operation) where it is loaded as a script element with script.src = URL.getObjectURL(blob)
.The library in jslib/
should be ready to use, just copy both files and call loadWebAssembly()
.
Running make
compiles the C++ implementation into the JS files in jslib/
and
into native executables in tools/
. (The Makefile is currently super-unportable.
Sorry! Patches welcome.)
The polyfill also comes with a tool (tools/pack-asmjs
) that compiles a single JS
file (containing only asm.js) into the (experimental) WebAssembly format decoded by
the library. Given an existing asm.js application, one can experiment with this
polyfill (perform direct size/load-time comparisons) by following the steps:
tools/pack-asmjs
to produce a .wasm
file.loadWebAssembly()
(which returns a promise that resolves to the unlinked asm.js module function).Range
requests or splitting into separate files).wasm
file (e.g.,
lzham gives a further 24% boost over gzip
).