mirror of
https://github.com/rustwasm/wasm-bindgen.git
synced 2024-12-15 21:02:10 +03:00
4181fb311a
This commit adds experimental support to `wasm-bindgen` to emit and leverage the `anyref` native wasm type. This native type is still in a proposal status (the reference-types proposal). The intention of `anyref` is to be able to directly hold JS values in wasm and pass the to imported functions, namely to empower eventual host bindings (now renamed WebIDL bindings) integration where we can skip JS shims altogether for many imports. This commit doesn't actually affect wasm-bindgen's behavior at all as-is, but rather this support requires an opt-in env var to be configured. Once the support is stable in browsers it's intended that this will add a CLI switch for turning on this support, eventually defaulting it to `true` in the far future. The basic strategy here is to take the `stack` and `slab` globals in the generated JS glue and move them into wasm using a table. This new table in wasm is managed at the fringes via injected shims. At `wasm-bindgen`-time the CLI will rewrite exports and imports with shims that actually use `anyref` if needed, performing loads/stores inside the wasm module instead of externally in the wasm module. This should provide a boost over what we have today, but it's not a fantastic strategy long term. We have a more grand vision for `anyref` being a first-class type in the language, but that's on a much longer horizon and this is currently thought to be the best we can do in terms of integration in the near future. The stack/heap JS tables are combined into one wasm table. The stack starts at the end of the table and grows down with a stack pointer (also injected). The heap starts at the end and grows up (state managed in linear memory). The anyref transformation here will hook up various intrinsics in wasm-bindgen to the runtime functionality if the anyref supoprt is enabled. The main tricky treatment here was applied to closures, where we need JS to use a different function pointer than the one Rust gives it to use a JS function pointer empowered with anyref. This works by switching up a bit how descriptors work, embedding the shims to call inside descriptors rather than communicated at runtime. This means that we're accessing constant values in the generated JS and we can just update the constant value accessed.
257 lines
11 KiB
YAML
257 lines
11 KiB
YAML
language: rust
|
|
sudo: false
|
|
|
|
INSTALL_NODE_VIA_NVM: &INSTALL_NODE_VIA_NVM
|
|
|
|
|
rustup target add wasm32-unknown-unknown
|
|
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
|
|
source ~/.nvm/nvm.sh
|
|
nvm install v10.9
|
|
|
|
INSTALL_GECKODRIVER: &INSTALL_GECKODRIVER
|
|
|
|
|
curl --retry 5 -LO https://github.com/mozilla/geckodriver/releases/download/v0.21.0/geckodriver-v0.21.0-linux64.tar.gz
|
|
tar xf geckodriver-v0.21.0-linux64.tar.gz
|
|
|
|
DEPLOY_TO_GITHUB: &DEPLOY_TO_GITHUB
|
|
before_deploy:
|
|
|
|
|
name="wasm-bindgen-$TRAVIS_TAG-$TARGET"
|
|
mkdir "$name"
|
|
cp "target/$TARGET/release/wasm-bindgen" "$name/"
|
|
cp "target/$TARGET/release/wasm2es6js" "$name/"
|
|
cp "target/$TARGET/release/wasm-bindgen-test-runner" "$name/"
|
|
cp README.md LICENSE-MIT LICENSE-APACHE "$name/"
|
|
tar czvf "$name.tar.gz" "$name"
|
|
deploy:
|
|
api_key:
|
|
secure: "qCiELnEnvyKpWHDttgTNf+ElZGbWlvthu5aOIj5nYfov+h6g1+mkWnDFP6at/WPlE78zE/f/z/dL2KB2I7w/cxH/T4P1nWh0A9DvrpY6hqWkK2pgN5dPeWE/a4flI7AdH0A6wMRw7m00uMgDjlzN78v7XueccpJCxSO5allQN5jweAQvMX2QA07TbLRJc7Lq6lfVwSf8OfrcO8qCbcIzJTsC4vtbh6jkUYg1OAaU2tAYlskBy9ZYmHWCExIAu/zxzcJY9OpApPD9Ea4CyrsfjniAyRBJ87Weh/sP4XhiWeRPVmvA4HAzv4Pps9ps+Ar5QmsX53rhKQ3id7/VPR8ggaAHxrYUiJPvJRtbP6cKKOlDiK0ooP+vI4vjxWeNVj9ibEolSYOlT0ENIvPK1BppA6VgAoJOjwPr0Q16Ma4AmvLkIkowJiXCm2Jlje/5c0vPEAGJVgUtkj3jFQzgXwyEMpzxUlhHmYpmnfeaM0tK/Kiiwe1monL/ydMlyfV55kNylylCg+XoTnf420AFChKbD4DM5Z7ZsjU9g8fF3LUoN0sKpmLDp+GvwjLi9YtGogWB71Q2MFp43MSL0YLshkyYYoZKrVMiy5J9hKNUxhT2jNEq53Z69syIHHMCxHL9GoAcuHxIKOA7uTMW0aCoyy2I+dfAKKsrUGwGYaNC5LZdUQI="
|
|
file_glob: true
|
|
file:
|
|
- wasm-bindgen-$TRAVIS_TAG-$TARGET.tar.gz
|
|
on:
|
|
tags: true
|
|
provider: releases
|
|
skip_cleanup: true
|
|
if: branch = master OR branch =~ /^\d/
|
|
|
|
INSTALL_AWS: &INSTALL_AWS
|
|
|
|
|
pip install --user awscli
|
|
export PATH=$HOME/.local/bin:$PATH
|
|
mkdir -p ~/$TRAVIS_BUILD_NUMBER
|
|
|
|
before_install:
|
|
- target=x86_64-unknown-linux-musl
|
|
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then target=x86_64-apple-darwin; fi
|
|
- curl -L https://github.com/mozilla/sccache/releases/download/0.2.7/sccache-0.2.7-$target.tar.gz | tar xzf -
|
|
- export PATH=$PATH:`pwd`/sccache-0.2.7-$target
|
|
- export RUSTC_WRAPPER=sccache
|
|
|
|
after_script:
|
|
- sccache -s
|
|
|
|
matrix:
|
|
include:
|
|
# Tests for wasm-bindgen itself pass
|
|
- name: "test wasm-bindgen crate"
|
|
install:
|
|
- *INSTALL_NODE_VIA_NVM
|
|
- *INSTALL_GECKODRIVER
|
|
- export GECKODRIVER=`pwd`/geckodriver
|
|
script:
|
|
# Run a test or two that makes sure `#[wasm_bindgen]` works "reasonably"
|
|
# on non-wasm platforms
|
|
- cargo test
|
|
# Run the main body of the test suite
|
|
- cargo test --target wasm32-unknown-unknown
|
|
# Make sure the anyref pass at least compiles even if it doesn't run
|
|
- NODE_ARGS=/dev/null WASM_BINDGEN_ANYREF=1 cargo test --target wasm32-unknown-unknown --test wasm
|
|
# Rerun the test suite but disable `--debug` in generated JS
|
|
- WASM_BINDGEN_NO_DEBUG=1 cargo test --target wasm32-unknown-unknown
|
|
# Make sure our serde tests work
|
|
- cargo test --target wasm32-unknown-unknown --features serde-serialize
|
|
# Make sure the `std` feature works if disabled
|
|
- cargo test --target wasm32-unknown-unknown -p no-std
|
|
# Make sure the `wasm-bindgen-futures` tests pass.
|
|
- cargo test -p wasm-bindgen-futures
|
|
- cargo test -p wasm-bindgen-futures --target wasm32-unknown-unknown
|
|
addons:
|
|
firefox: latest
|
|
if: branch = master
|
|
|
|
# Tests the `nightly` feature of wasm-bindgen
|
|
- rust: nightly
|
|
name: "test: wasm-bindgen crate nightly feature"
|
|
install:
|
|
- *INSTALL_NODE_VIA_NVM
|
|
script:
|
|
- cargo test --target wasm32-unknown-unknown --features nightly --test wasm
|
|
if: branch = master
|
|
|
|
# All examples work
|
|
- name: "examples - almost all examples"
|
|
install:
|
|
- *INSTALL_NODE_VIA_NVM
|
|
- *INSTALL_AWS
|
|
- npm install
|
|
- curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f
|
|
script:
|
|
- cargo build -p wasm-bindgen-cli
|
|
- ln -snf target/debug/wasm-bindgen $HOME/.cargo/wasm-bindgen
|
|
- |
|
|
for dir in `ls examples | grep -v README | grep -v asm.js | grep -v raytrace | grep -v no_modules`; do
|
|
(cd examples/$dir &&
|
|
ln -fs ../../node_modules . &&
|
|
npm run build -- --output-path $HOME/$TRAVIS_BUILD_NUMBER/exbuild/$dir) || exit 1;
|
|
done
|
|
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then aws s3 sync --quiet ~/$TRAVIS_BUILD_NUMBER s3://wasm-bindgen-ci/$TRAVIS_BUILD_NUMBER; fi
|
|
if: branch = master
|
|
- rust: nightly
|
|
name: "examples - raytracer"
|
|
install:
|
|
- *INSTALL_AWS
|
|
- rustup component add rust-src
|
|
- curl -L https://github.com/japaric/xargo/releases/download/v0.3.13/xargo-v0.3.13-x86_64-unknown-linux-musl.tar.gz | tar xzf -
|
|
- export PATH=$PATH:`pwd`
|
|
script:
|
|
- sed -i 's/python/#python/' examples/raytrace-parallel/build.sh
|
|
- (cd examples/raytrace-parallel && ./build.sh)
|
|
- dst=$HOME/$TRAVIS_BUILD_NUMBER/exbuild/raytrace-parallel
|
|
- mkdir -p $dst
|
|
- cp examples/raytrace-parallel/*.{js,html,wasm} $dst
|
|
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then aws s3 sync ~/$TRAVIS_BUILD_NUMBER s3://wasm-bindgen-ci/$TRAVIS_BUILD_NUMBER; fi
|
|
if: branch = master
|
|
|
|
# The `cli-support` crate's tests pass
|
|
- name: "test cli-support crate"
|
|
script: cargo test -p wasm-bindgen-cli-support
|
|
if: branch = master
|
|
|
|
# The `web-sys` crate's tests pass
|
|
- name: "test web-sys crate"
|
|
install:
|
|
- *INSTALL_NODE_VIA_NVM
|
|
- *INSTALL_GECKODRIVER
|
|
script:
|
|
- export RUST_LOG=wasm_bindgen_test_runner
|
|
# Test out builds with just a few features
|
|
- cargo build --manifest-path crates/web-sys/Cargo.toml --target wasm32-unknown-unknown
|
|
- cargo build --manifest-path crates/web-sys/Cargo.toml --target wasm32-unknown-unknown --features Node
|
|
- cargo build --manifest-path crates/web-sys/Cargo.toml --target wasm32-unknown-unknown --features Element
|
|
- cargo build --manifest-path crates/web-sys/Cargo.toml --target wasm32-unknown-unknown --features Window
|
|
|
|
# Now run all the tests with all the features
|
|
- GECKODRIVER=`pwd`/geckodriver cargo test --manifest-path crates/web-sys/Cargo.toml --target wasm32-unknown-unknown --all-features
|
|
addons:
|
|
firefox: latest
|
|
chrome: stable
|
|
if: branch = master
|
|
|
|
# The `js-sys` crate's tests pass
|
|
- name: "test js-sys crate"
|
|
install:
|
|
- *INSTALL_NODE_VIA_NVM
|
|
- *INSTALL_GECKODRIVER
|
|
script:
|
|
- export RUST_LOG=wasm_bindgen_test_runner
|
|
- GECKODRIVER=`pwd`/geckodriver cargo test -p js-sys --target wasm32-unknown-unknown
|
|
addons:
|
|
firefox: latest
|
|
chrome: stable
|
|
if: branch = master
|
|
|
|
# WebIDL tests pass
|
|
- name: "test wasm-bindgen-webidl crate"
|
|
install: *INSTALL_NODE_VIA_NVM
|
|
script:
|
|
- cargo test -p wasm-bindgen-webidl
|
|
- cargo test -p webidl-tests --target wasm32-unknown-unknown
|
|
if: branch = master
|
|
|
|
# UI tests for the macro work just fine
|
|
- rust: nightly
|
|
name: "test ui tests"
|
|
script: cargo test -p ui-tests
|
|
if: branch = master
|
|
|
|
# wasm-interpreter tests work alright
|
|
- name: "test wasm-bindgen-wasm-interpreter crate"
|
|
install:
|
|
- git clone https://github.com/WebAssembly/wabt
|
|
- mkdir -p wabt/build
|
|
- (cd wabt/build && cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=sccache -DCMAKE_CXX_COMPILER_ARG1=c++ -DBUILD_TESTS=OFF && cmake --build . -- -j4)
|
|
- export PATH=$PATH:`pwd`/wabt/build
|
|
script: cargo test -p wasm-bindgen-wasm-interpreter
|
|
if: branch = master
|
|
|
|
# Dist linux binary
|
|
- name: "dist: Linux (x86_64-unknown-linux-musl)"
|
|
env: JOB=dist-linux TARGET=x86_64-unknown-linux-musl
|
|
before_script: rustup target add $TARGET
|
|
script:
|
|
- cargo build --manifest-path crates/cli/Cargo.toml --release --target $TARGET --features vendored-openssl
|
|
# no need to ship debuginfo to users
|
|
- strip -g target/$TARGET/release/wasm-bindgen
|
|
- strip -g target/$TARGET/release/wasm-bindgen-test-runner
|
|
- strip -g target/$TARGET/release/wasm2es6js
|
|
addons:
|
|
apt:
|
|
packages:
|
|
- musl-tools
|
|
<<: *DEPLOY_TO_GITHUB
|
|
|
|
# Dist OSX binary
|
|
- name: "dist: OSX (x86_64-apple-darwin)"
|
|
os: osx
|
|
env: JOB=dist-osx MACOSX_DEPLOYMENT_TARGET=10.7 TARGET=x86_64-apple-darwin
|
|
script: cargo build --manifest-path crates/cli/Cargo.toml --release --target $TARGET
|
|
<<: *DEPLOY_TO_GITHUB
|
|
|
|
# Build mdbook documentation
|
|
- name: "doc: Guide documentation"
|
|
install:
|
|
- mkdir -p $HOME/mdbook
|
|
- curl -L https://github.com/rust-lang-nursery/mdBook/releases/download/v0.2.1/mdbook-v0.2.1-x86_64-unknown-linux-musl.tar.gz | tar xzf - -C $HOME/mdbook
|
|
- export PATH=$PATH:$HOME/mdbook
|
|
- *INSTALL_AWS
|
|
script:
|
|
- (cd guide && mdbook build)
|
|
- rm -rf ~/$TRAVIS_BUILD_NUMBER
|
|
- mv guide/book ~/$TRAVIS_BUILD_NUMBER
|
|
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then aws s3 sync --quiet ~/$TRAVIS_BUILD_NUMBER s3://wasm-bindgen-ci/$TRAVIS_BUILD_NUMBER; fi
|
|
if: branch = master
|
|
|
|
# Build API documentation
|
|
- rust: stable
|
|
name: "doc: API documentation"
|
|
install: *INSTALL_AWS
|
|
script:
|
|
- cargo doc --no-deps --features 'nightly serde-serialize'
|
|
- cargo doc --no-deps --manifest-path crates/js-sys/Cargo.toml
|
|
- cargo doc --no-deps --manifest-path crates/futures/Cargo.toml
|
|
- cargo doc --no-deps --manifest-path crates/web-sys/Cargo.toml --all-features
|
|
- mv target/doc ~/$TRAVIS_BUILD_NUMBER/api
|
|
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then aws s3 sync --quiet ~/$TRAVIS_BUILD_NUMBER s3://wasm-bindgen-ci/$TRAVIS_BUILD_NUMBER; fi
|
|
if: branch = master
|
|
|
|
# Take compiled examples and mdbook/API docs and deploy them to gh-pages
|
|
- stage: deploy-gh-pages
|
|
install: *INSTALL_AWS
|
|
script:
|
|
- aws s3 sync --quiet s3://wasm-bindgen-ci/$TRAVIS_BUILD_NUMBER ~/$TRAVIS_BUILD_NUMBER
|
|
- mv ~/$TRAVIS_BUILD_NUMBER doc
|
|
deploy:
|
|
provider: pages
|
|
skip-cleanup: true
|
|
github-token: $GITHUB_TOKEN # Set in travis-ci.org dashboard, marked secure
|
|
local-dir: doc
|
|
keep-history: false
|
|
after_deploy:
|
|
- aws s3 rm --recursive s3://rust-lang-ci-sccache2/$TRAVIS_BUILD_NUMBER
|
|
if: branch = master AND type != pull_request
|
|
|
|
notifications:
|
|
email:
|
|
on_success: never
|