mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-24 06:01:33 +00:00
Merge branch 'feature/vm_refactor' into fix/vm_refactor_esmcripten_integration
This commit is contained in:
151
.appveyor.yml
Normal file
151
.appveyor.yml
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
# This appveyor build file is heavily inspired by uutils/coreutils
|
||||||
|
# https://raw.githubusercontent.com/uutils/coreutils/d0db7bbaa46dabf65b71e3e33b1ed7595aaacc56/.appveyor.yml
|
||||||
|
|
||||||
|
branches:
|
||||||
|
except:
|
||||||
|
- master
|
||||||
|
|
||||||
|
version: "{build} ~ {branch}"
|
||||||
|
|
||||||
|
os: Visual Studio 2017
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
allow_failures:
|
||||||
|
- CHANNEL: nightly
|
||||||
|
# - ABI: gnu
|
||||||
|
|
||||||
|
environment:
|
||||||
|
matrix:
|
||||||
|
# minimum version
|
||||||
|
# - CHANNEL: 1.31.0
|
||||||
|
# ARCH: i686
|
||||||
|
# ABI: msvc
|
||||||
|
# # "msvc" ABI
|
||||||
|
# - CHANNEL: stable
|
||||||
|
# ARCH: i686
|
||||||
|
# ABI: msvc
|
||||||
|
# - CHANNEL: stable
|
||||||
|
# ARCH: x86_64
|
||||||
|
# ABI: msvc
|
||||||
|
# - CHANNEL: beta
|
||||||
|
# ARCH: i686
|
||||||
|
# ABI: msvc
|
||||||
|
# - CHANNEL: beta
|
||||||
|
# ARCH: x86_64
|
||||||
|
# ABI: msvc
|
||||||
|
# - CHANNEL: nightly
|
||||||
|
# ARCH: i686
|
||||||
|
# ABI: msvc
|
||||||
|
# - CHANNEL: nightly
|
||||||
|
# ARCH: x86_64
|
||||||
|
# ABI: msvc
|
||||||
|
# # "gnu" ABI
|
||||||
|
# - CHANNEL: stable
|
||||||
|
# ARCH: i686
|
||||||
|
# ABI: gnu
|
||||||
|
# - CHANNEL: stable
|
||||||
|
# ARCH: x86_64
|
||||||
|
# ABI: gnu
|
||||||
|
# - CHANNEL: beta
|
||||||
|
# ARCH: i686
|
||||||
|
# ABI: gnu
|
||||||
|
# - CHANNEL: beta
|
||||||
|
# ARCH: x86_64
|
||||||
|
# ABI: gnu
|
||||||
|
# - CHANNEL: nightly
|
||||||
|
# ARCH: i686
|
||||||
|
# ABI: gnu
|
||||||
|
# - CHANNEL: nightly
|
||||||
|
# ARCH: x86_64
|
||||||
|
# ABI: gnu
|
||||||
|
# * specific gnu compilers
|
||||||
|
# - CHANNEL: stable
|
||||||
|
# ARCH: i686
|
||||||
|
# ABI: gnu
|
||||||
|
# MINGW_URL: https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/4.9.2/threads-win32/dwarf/i686-4.9.2-release-win32-dwarf-rt_v4-rev4.7z/download
|
||||||
|
# MINGW_ARCHIVE: i686-4.9.2-release-win32-dwarf-rt_v4-rev4.7z
|
||||||
|
- CHANNEL: stable
|
||||||
|
ARCH: x86_64
|
||||||
|
ABI: gnu
|
||||||
|
MINGW_URL: https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/7.3.0/threads-posix/seh/x86_64-7.3.0-release-posix-seh-rt_v5-rev0.7z/download#mingw-w64-x86_64-7.3.0-posix-seh.7z
|
||||||
|
|
||||||
|
install:
|
||||||
|
- echo %PATH%
|
||||||
|
# force branch checkout (if knowable), then reset to the specific commit ## (can be needed for accurate code coverage info)
|
||||||
|
# * this allows later apps to see the branch name using standard `git branch` operations, yet always builds the correct specific commit
|
||||||
|
# * ref: <https://github.com/appveyor/ci/issues/1606>[`@`](https://archive.is/RVpnF)
|
||||||
|
- if DEFINED APPVEYOR_REPO_BRANCH if /I "%APPVEYOR_REPO_SCM%"=="git" ( git checkout "%APPVEYOR_REPO_BRANCH%" & git reset --hard "%APPVEYOR_REPO_COMMIT%" )
|
||||||
|
# ensure CWD is project main directory
|
||||||
|
- cd "%APPVEYOR_BUILD_FOLDER%"
|
||||||
|
# create a working area
|
||||||
|
- ps: if ( ! $env:CI_TEMP_DIR ) { $env:CI_TEMP_DIR = "${env:TEMP}\${env:APPVEYOR_JOB_ID}" ; mkdir -force $env:CI_TEMP_DIR | out-null }
|
||||||
|
|
||||||
|
# rust installation
|
||||||
|
- set "TARGET=%ARCH%-pc-windows-%ABI%"
|
||||||
|
# * install `rust` via `rustup`
|
||||||
|
- appveyor DownloadFile "https://win.rustup.rs/" -FileName "%CI_TEMP_DIR%\rustup-init.exe"
|
||||||
|
- call "%CI_TEMP_DIR%\rustup-init.exe" -y --default-toolchain %CHANNEL% --default-host %TARGET% --no-modify-path >NUL
|
||||||
|
- set "PATH=%PATH%;%USERPROFILE%\.cargo\bin"
|
||||||
|
- ps: $env:TOOLCHAIN = $(rustup show active-toolchain)
|
||||||
|
- rename "C:\Program Files\Git\usr\bin\sh.exe" sh2.exe
|
||||||
|
# * set RUST_BACKTRACE for enhanced error messages
|
||||||
|
- set RUST_BACKTRACE=1
|
||||||
|
# * show versions
|
||||||
|
- rustc -vV
|
||||||
|
- cargo -vV
|
||||||
|
|
||||||
|
# finalize FEATURES
|
||||||
|
- if /i "%CHANNEL%"=="nightly" set "FEATURES=nightly"
|
||||||
|
|
||||||
|
# "gnu" ABI setup
|
||||||
|
# * use the system MinGW/MSYS if we can
|
||||||
|
- if /i "%ABI%"=="gnu" set MSYS_BINDIR=C:\msys64\usr\bin
|
||||||
|
- if /i "%ABI%"=="gnu" if /i "%ARCH%"=="i686" set "MSYS_BITS=32"
|
||||||
|
- if /i "%ABI%"=="gnu" if /i "%ARCH%"=="x86_64" set "MSYS_BITS=64"
|
||||||
|
- if defined MSYS_BITS set "MSYS_MINGWDIR=C:\msys64\mingw%MSYS_BITS%"
|
||||||
|
- if defined MSYS_MINGWDIR set "MSYS_BINDIR=C:\msys64\usr\bin"
|
||||||
|
## * workaround for rust-lang/rust#47048 / rust-lang/rust#53454 ## !maint: remove when resolved
|
||||||
|
- if /i "%ABI%"=="gnu" if /i "%ARCH%"=="i686" if not DEFINED MINGW_URL set "MINGW_URL=https://downloads.sourceforge.net/project/mingw-w64/Toolchains targetting Win32/Personal Builds/mingw-builds/8.1.0/threads-posix/dwarf/i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z"
|
||||||
|
- if /i "%ABI%"=="gnu" if /i "%ARCH%"=="x86_64" if not DEFINED MINGW_URL set "MINGW_URL=https://downloads.sourceforge.net/project/mingw-w64/Toolchains targetting Win64/Personal Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z"
|
||||||
|
##
|
||||||
|
# * specific MinGW, if specified
|
||||||
|
- ps: if ( ! $env:MINGW_ARCHIVE -and $env:MINGW_URL ) { $env:MINGW_ARCHIVE = $($([URI]$env:MINGW_URL).fragment).TrimStart('#') }
|
||||||
|
- ps: if ( ! $env:MINGW_ARCHIVE -and $env:MINGW_URL ) { $env:MINGW_ARCHIVE = $([URI]$env:MINGW_URL).segments[-1] }
|
||||||
|
- if defined MINGW_ARCHIVE curl --insecure -fsSL "%MINGW_URL%" -o "%CI_TEMP_DIR%\%MINGW_ARCHIVE%"
|
||||||
|
- if defined MINGW_ARCHIVE mkdir "%CI_TEMP_DIR%\MinGW" >NUL
|
||||||
|
- if defined MINGW_ARCHIVE 7z x -y "%CI_TEMP_DIR%\%MINGW_ARCHIVE%" -o"%CI_TEMP_DIR%\MinGW" >NUL
|
||||||
|
- if defined MINGW_ARCHIVE set "MSYS_MINGWDIR=%CI_TEMP_DIR%\MinGW\mingw%MSYS_BITS%"
|
||||||
|
- if defined MINGW_ARCHIVE set "MSYS_BINDIR=%MSYS_MINGWDIR%\bin"
|
||||||
|
# * MinGW/MSYS PATH setup
|
||||||
|
- if defined MSYS_MINGWDIR set PATH=%MSYS_MINGWDIR%\%ARCH%-w64-mingw32\bin;%MSYS_BINDIR%;%PATH%
|
||||||
|
## * workaround for rust-lang/rust#47048 / rust-lang/rust#53454 ## !maint: remove when resolved
|
||||||
|
# ** ref: <https://github.com/rust-lang/rust/issues/47048>, <https://github.com/rust-lang/rust/issues/53454>
|
||||||
|
# ** egs: <https://github.com/pkgw/tectonic/commit/29686db533d8732d7d97fc94270ed33b77f29295>, <https://github.com/rukai/PF_Sandbox/blob/e842613cf9ff102dfb3fbd87381319e6e6dfe3ae/appveyor.yml>
|
||||||
|
- if /i "%ABI%"=="gnu" rustup install %CHANNEL%-%ARCH%-pc-windows-msvc
|
||||||
|
- if /i "%ABI%"=="gnu" rustup default %CHANNEL%-%ARCH%-pc-windows-msvc
|
||||||
|
- if /i "%ABI%"=="gnu" rustup target add %TARGET%
|
||||||
|
- if /i "%ABI%"=="gnu" rustup show
|
||||||
|
- if /i "%ABI%"=="gnu" rustc -vV
|
||||||
|
- ps: $env:TOOLCHAIN = $(rustup show active-toolchain)
|
||||||
|
# ** copy libs from gcc toolchain to rust toolchain (more specifically, "crt2.o" and "dllcrt2.o" are needed)
|
||||||
|
- if defined MSYS_MINGWDIR copy /y "%MSYS_MINGWDIR%\%ARCH%-w64-mingw32\lib\*.o" "%USERPROFILE%\.rustup\toolchains\%TOOLCHAIN%\lib\rustlib\%TARGET%\lib" >NUL
|
||||||
|
##
|
||||||
|
- if /i "%ABI%"=="gnu" where gcc
|
||||||
|
- if /i "%ABI%"=="gnu" gcc --version
|
||||||
|
|
||||||
|
# "msvc" ABI setup
|
||||||
|
- if /i "%ABI%" == "msvc" if /i "%ARCH%" == "i686" call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat"
|
||||||
|
- if /i "%ABI%" == "msvc" if /i "%ARCH%" == "x86_64" call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64
|
||||||
|
- if /i "%ABI%" == "msvc" if /i "%ARCH%" == "x86_64" call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
- path: target\%TARGET%\debug\wasmer.exe
|
||||||
|
name: wasmer.exe
|
||||||
|
|
||||||
|
build_script:
|
||||||
|
- set BUILD_CMD=cargo +%TOOLCHAIN% build --target=%TARGET%
|
||||||
|
- echo [ %BUILD_CMD% ] & %BUILD_CMD%
|
||||||
|
|
||||||
|
test_script:
|
||||||
|
- set TEST_CMD=cargo +%TOOLCHAIN% test --target=%TARGET% --no-fail-fast
|
||||||
|
- echo [ %TEST_CMD% ] & %TEST_CMD%
|
@ -67,6 +67,12 @@ jobs:
|
|||||||
sudo sysctl -w kern.maxfiles=655360 kern.maxfilesperproc=327680
|
sudo sysctl -w kern.maxfiles=655360 kern.maxfilesperproc=327680
|
||||||
make test
|
make test
|
||||||
make lint
|
make lint
|
||||||
|
- run:
|
||||||
|
name: Execute integration tests
|
||||||
|
command: |
|
||||||
|
export PATH="`pwd`/cmake-3.4.1-Darwin-x86_64/CMake.app/Contents/bin:$PATH"
|
||||||
|
export PATH="$HOME/.cargo/bin:$PATH"
|
||||||
|
./integration_tests/nginx/test.sh
|
||||||
|
|
||||||
test-and-build:
|
test-and-build:
|
||||||
docker:
|
docker:
|
||||||
|
21
Cargo.lock
generated
21
Cargo.lock
generated
@ -1097,16 +1097,16 @@ dependencies = [
|
|||||||
"tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
"time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wabt 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wabt 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasmer-clif-backend 0.1.4",
|
"wasmer-clif-backend 0.1.0",
|
||||||
"wasmer-emscripten 0.1.4",
|
"wasmer-emscripten 0.1.1",
|
||||||
"wasmer-runtime 0.1.4",
|
"wasmer-runtime 0.1.0",
|
||||||
"wasmparser 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasmparser 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasmer-clif-backend"
|
name = "wasmer-clif-backend"
|
||||||
version = "0.1.4"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cranelift-codegen 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cranelift-codegen 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1115,13 +1115,13 @@ dependencies = [
|
|||||||
"cranelift-wasm 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cranelift-wasm 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"hashbrown 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hashbrown 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"target-lexicon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"target-lexicon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasmer-runtime 0.1.4",
|
"wasmer-runtime 0.1.0",
|
||||||
"wasmparser 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasmparser 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasmer-emscripten"
|
name = "wasmer-emscripten"
|
||||||
version = "0.1.4"
|
version = "0.1.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1129,14 +1129,13 @@ dependencies = [
|
|||||||
"libc 0.2.44 (git+https://github.com/rust-lang/libc)",
|
"libc 0.2.44 (git+https://github.com/rust-lang/libc)",
|
||||||
"time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
"time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wabt 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wabt 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasmer 0.1.4",
|
"wasmer-clif-backend 0.1.0",
|
||||||
"wasmer-clif-backend 0.1.4",
|
"wasmer-runtime 0.1.0",
|
||||||
"wasmer-runtime 0.1.4",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasmer-runtime"
|
name = "wasmer-runtime"
|
||||||
version = "0.1.4"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"field-offset 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"field-offset 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1145,7 +1144,7 @@ dependencies = [
|
|||||||
"nix 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"nix 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"page_size 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"page_size 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wabt 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wabt 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasmer-clif-backend 0.1.4",
|
"wasmer-clif-backend 0.1.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "wasmer"
|
name = "wasmer"
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
authors = ["Syrus Akbary <me@syrusakbary.com>"]
|
authors = ["The Wasmer Engineering Team <engineering@wasmer.io>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
repository = "https://github.com/wasmerio/wasmer"
|
repository = "https://github.com/wasmerio/wasmer"
|
||||||
publish = true
|
publish = true
|
||||||
|
12
integration_tests/nginx/README.md
Normal file
12
integration_tests/nginx/README.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# `nginx` integration test
|
||||||
|
|
||||||
|
|
||||||
|
This starts wasmer with the nginx wasm file and serves an html
|
||||||
|
file with some simple text to assert on. The test script does
|
||||||
|
the assertion.
|
||||||
|
|
||||||
|
Run test with:
|
||||||
|
|
||||||
|
```
|
||||||
|
> ./integration_tests/nginx/test.sh
|
||||||
|
```
|
1
integration_tests/nginx/html/index.html
Normal file
1
integration_tests/nginx/html/index.html
Normal file
@ -0,0 +1 @@
|
|||||||
|
wasmer
|
1
integration_tests/nginx/logs/nginx.pid
Normal file
1
integration_tests/nginx/logs/nginx.pid
Normal file
@ -0,0 +1 @@
|
|||||||
|
26310
|
24
integration_tests/nginx/nginx.conf
Normal file
24
integration_tests/nginx/nginx.conf
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
events {
|
||||||
|
}
|
||||||
|
|
||||||
|
# We need this for now, as we want to run nginx as a worker
|
||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
# We show the errors and info in stderr
|
||||||
|
error_log /dev/stderr info;
|
||||||
|
|
||||||
|
http {
|
||||||
|
# We show access in the stdout
|
||||||
|
access_log /dev/stdout;
|
||||||
|
server {
|
||||||
|
listen 8080;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
# IMPORTANT: Replace the dir with the one you want to serve (that have an index.html file)
|
||||||
|
root ./html/;
|
||||||
|
index index.html;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
24
integration_tests/nginx/test.sh
Executable file
24
integration_tests/nginx/test.sh
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# Build the release and run nginx
|
||||||
|
make release
|
||||||
|
nohup ./target/release/wasmer run examples/nginx/nginx.wasm -- -p integration_tests/nginx/ -c nginx.conf &
|
||||||
|
sleep 3s
|
||||||
|
|
||||||
|
curl localhost:8080 > ./nginx.out
|
||||||
|
|
||||||
|
|
||||||
|
if grep "wasmer" ./nginx.out
|
||||||
|
then
|
||||||
|
echo "nginx integration test succeeded"
|
||||||
|
rm ./nohup.out
|
||||||
|
rm ./nginx.out
|
||||||
|
rm -rf ./integration_tests/nginx/*_temp
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "nginx integration test failed"
|
||||||
|
rm ./nohup.out
|
||||||
|
rm ./nginx.out
|
||||||
|
rm -rf ./integration_tests/nginx/*_temp
|
||||||
|
exit -1
|
||||||
|
fi
|
@ -1,11 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "wasmer-clif-backend"
|
name = "wasmer-clif-backend"
|
||||||
version = "0.1.4"
|
version = "0.1.0"
|
||||||
authors = [
|
authors = ["The Wasmer Engineering Team <engineering@wasmer.io>"]
|
||||||
"Lachlan Sneff <lachlan.sneff@gmail.com>",
|
|
||||||
"Steve Akinyemi <steve@wasmer.io>",
|
|
||||||
"Syrus Akbary <syrus@wasmer.io>"
|
|
||||||
]
|
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
@ -1,13 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "wasmer-emscripten"
|
name = "wasmer-emscripten"
|
||||||
version = "0.1.4"
|
version = "0.1.1"
|
||||||
authors = [
|
authors = ["The Wasmer Engineering Team <engineering@wasmer.io>"]
|
||||||
"Lachlan Sneff <lachlan.sneff@gmail.com>",
|
|
||||||
"Steve Akinyemi <steve@wasmer.io>",
|
|
||||||
"Mackenzie Clark <mackenzie@wasmer.io>",
|
|
||||||
"Brandon Fish <brandon@wasmer.io>",
|
|
||||||
"Syrus Akbary <syrus@wasmer.io>"
|
|
||||||
]
|
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
build = "build/mod.rs"
|
build = "build/mod.rs"
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@ This process will do something similar to:
|
|||||||
```
|
```
|
||||||
# Generate the .wasm file
|
# Generate the .wasm file
|
||||||
emcc localtime.c -o localtime.js
|
emcc localtime.c -o localtime.js
|
||||||
# Delte the js file, as we don't need it
|
# Delete the js file, as we don't need it
|
||||||
rm localtime.js
|
rm localtime.js
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1,13 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "wasmer-runtime"
|
name = "wasmer-runtime"
|
||||||
version = "0.1.4"
|
version = "0.1.0"
|
||||||
authors = [
|
authors = ["The Wasmer Engineering Team <engineering@wasmer.io>"]
|
||||||
"Lachlan Sneff <lachlan.sneff@gmail.com>",
|
|
||||||
"Steve Akinyemi <steve@wasmer.io>",
|
|
||||||
"Mackenzie Clark <mackenzie@wasmer.io>",
|
|
||||||
"Brandon Fish <brandon@wasmer.io>",
|
|
||||||
"Syrus Akbary <syrus@wasmer.io>"
|
|
||||||
]
|
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
build = "build/mod.rs"
|
build = "build/mod.rs"
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ pub mod vm;
|
|||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub mod vmcalls;
|
pub mod vmcalls;
|
||||||
|
|
||||||
|
pub use self::import::Imports;
|
||||||
pub use self::instance::Instance;
|
pub use self::instance::Instance;
|
||||||
#[doc(inline)]
|
#[doc(inline)]
|
||||||
pub use self::module::Module;
|
pub use self::module::Module;
|
||||||
|
@ -2,7 +2,7 @@ pub use crate::{
|
|||||||
backing::{ImportBacking, LocalBacking},
|
backing::{ImportBacking, LocalBacking},
|
||||||
types::LocalMemoryIndex,
|
types::LocalMemoryIndex,
|
||||||
};
|
};
|
||||||
use std::{mem, ptr};
|
use std::{ffi::c_void, mem, ptr};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
@ -28,9 +28,13 @@ pub struct Ctx {
|
|||||||
/// A pointer to an array of imported functions, indexed by `FuncIndex`.
|
/// A pointer to an array of imported functions, indexed by `FuncIndex`.
|
||||||
pub(crate) imported_funcs: *mut ImportedFunc,
|
pub(crate) imported_funcs: *mut ImportedFunc,
|
||||||
|
|
||||||
/// The parent instance.
|
/// The local backing of the parent instance.
|
||||||
pub local_backing: *mut LocalBacking,
|
pub local_backing: *mut LocalBacking,
|
||||||
|
/// The import backing of the parent instance.
|
||||||
pub import_backing: *mut ImportBacking,
|
pub import_backing: *mut ImportBacking,
|
||||||
|
|
||||||
|
pub data: *mut c_void,
|
||||||
|
pub data_finalizer: Option<extern "C" fn(data: *mut c_void)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Ctx {
|
impl Ctx {
|
||||||
@ -50,6 +54,33 @@ impl Ctx {
|
|||||||
|
|
||||||
local_backing,
|
local_backing,
|
||||||
import_backing,
|
import_backing,
|
||||||
|
|
||||||
|
data: ptr::null_mut(),
|
||||||
|
data_finalizer: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub unsafe fn new_with_data(
|
||||||
|
local_backing: &mut LocalBacking,
|
||||||
|
import_backing: &mut ImportBacking,
|
||||||
|
data: *mut c_void,
|
||||||
|
data_finalizer: extern "C" fn(*mut c_void),
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
memories: local_backing.vm_memories.as_mut_ptr(),
|
||||||
|
tables: local_backing.vm_tables.as_mut_ptr(),
|
||||||
|
globals: local_backing.vm_globals.as_mut_ptr(),
|
||||||
|
|
||||||
|
imported_memories: import_backing.memories.as_mut_ptr(),
|
||||||
|
imported_tables: import_backing.tables.as_mut_ptr(),
|
||||||
|
imported_globals: import_backing.globals.as_mut_ptr(),
|
||||||
|
imported_funcs: import_backing.functions.as_mut_ptr(),
|
||||||
|
|
||||||
|
local_backing,
|
||||||
|
import_backing,
|
||||||
|
|
||||||
|
data,
|
||||||
|
data_finalizer: Some(data_finalizer),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,3 +462,66 @@ mod vm_offset_tests {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod vm_ctx_tests {
|
||||||
|
use super::{Ctx, ImportBacking, LocalBacking};
|
||||||
|
use crate::structures::Map;
|
||||||
|
use std::ffi::c_void;
|
||||||
|
|
||||||
|
struct TestData {
|
||||||
|
x: u32,
|
||||||
|
y: bool,
|
||||||
|
str: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" fn test_data_finalizer(data: *mut c_void) {
|
||||||
|
let test_data: &mut TestData = unsafe { &mut *(data as *mut TestData) };
|
||||||
|
assert_eq!(test_data.x, 10);
|
||||||
|
assert_eq!(test_data.y, true);
|
||||||
|
assert_eq!(test_data.str, "Test".to_string());
|
||||||
|
println!("hello from finalizer");
|
||||||
|
drop(test_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_callback_on_drop() {
|
||||||
|
let mut data = TestData {
|
||||||
|
x: 10,
|
||||||
|
y: true,
|
||||||
|
str: "Test".to_string(),
|
||||||
|
};
|
||||||
|
let mut local_backing = LocalBacking {
|
||||||
|
memories: Map::new().into_boxed_map(),
|
||||||
|
tables: Map::new().into_boxed_map(),
|
||||||
|
vm_memories: Map::new().into_boxed_map(),
|
||||||
|
vm_tables: Map::new().into_boxed_map(),
|
||||||
|
vm_globals: Map::new().into_boxed_map(),
|
||||||
|
};
|
||||||
|
let mut import_backing = ImportBacking {
|
||||||
|
functions: Map::new().into_boxed_map(),
|
||||||
|
memories: Map::new().into_boxed_map(),
|
||||||
|
tables: Map::new().into_boxed_map(),
|
||||||
|
globals: Map::new().into_boxed_map(),
|
||||||
|
};
|
||||||
|
let data = &mut data as *mut _ as *mut c_void;
|
||||||
|
let ctx = unsafe {
|
||||||
|
Ctx::new_with_data(
|
||||||
|
&mut local_backing,
|
||||||
|
&mut import_backing,
|
||||||
|
data,
|
||||||
|
test_data_finalizer,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
let ctx_test_data = cast_test_data(ctx.data);
|
||||||
|
assert_eq!(ctx_test_data.x, 10);
|
||||||
|
assert_eq!(ctx_test_data.y, true);
|
||||||
|
assert_eq!(ctx_test_data.str, "Test".to_string());
|
||||||
|
drop(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cast_test_data(data: *mut c_void) -> &'static mut TestData {
|
||||||
|
let test_data: &mut TestData = unsafe { &mut *(data as *mut TestData) };
|
||||||
|
test_data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -8,10 +8,10 @@ extern crate libc;
|
|||||||
extern crate region;
|
extern crate region;
|
||||||
extern crate structopt;
|
extern crate structopt;
|
||||||
extern crate wabt;
|
extern crate wabt;
|
||||||
extern crate wasmparser;
|
|
||||||
extern crate wasmer_clif_backend;
|
extern crate wasmer_clif_backend;
|
||||||
extern crate wasmer_runtime;
|
extern crate wasmer_runtime;
|
||||||
extern crate wasmer_emscripten;
|
extern crate wasmparser;
|
||||||
|
// extern crate wasmer_emscripten;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate target_lexicon;
|
extern crate target_lexicon;
|
||||||
extern crate byteorder;
|
extern crate byteorder;
|
||||||
|
@ -10,6 +10,7 @@ use wasmer_runtime::{
|
|||||||
import::Imports,
|
import::Imports,
|
||||||
instance::Instance,
|
instance::Instance,
|
||||||
};
|
};
|
||||||
|
|
||||||
use cranelift_codegen::{
|
use cranelift_codegen::{
|
||||||
isa,
|
isa,
|
||||||
settings::{self, Configurable},
|
settings::{self, Configurable},
|
||||||
@ -35,7 +36,6 @@ pub struct ResultObject {
|
|||||||
pub instance: Box<Instance>,
|
pub instance: Box<Instance>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub struct InstanceOptions {
|
pub struct InstanceOptions {
|
||||||
// Shall we mock automatically the imported functions if they don't exist?
|
// Shall we mock automatically the imported functions if they don't exist?
|
||||||
pub mock_missing_imports: bool,
|
pub mock_missing_imports: bool,
|
||||||
@ -173,23 +173,23 @@ pub fn get_isa() -> Box<isa::TargetIsa> {
|
|||||||
isa::lookup(triple!("x86_64")).unwrap().finish(flags)
|
isa::lookup(triple!("x86_64")).unwrap().finish(flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn store_module_arguments(path: &str, args: Vec<&str>, instance: &mut Instance) -> (u32, u32) {
|
// fn store_module_arguments(path: &str, args: Vec<&str>, instance: &mut Instance) -> (u32, u32) {
|
||||||
let argc = args.len() + 1;
|
// let argc = args.len() + 1;
|
||||||
|
|
||||||
let (argv_offset, argv_slice): (_, &mut [u32]) =
|
// let (argv_offset, argv_slice): (_, &mut [u32]) =
|
||||||
unsafe { allocate_on_stack(((argc + 1) * 4) as u32, instance) };
|
// unsafe { allocate_on_stack(((argc + 1) * 4) as u32, instance) };
|
||||||
assert!(!argv_slice.is_empty());
|
// assert!(!argv_slice.is_empty());
|
||||||
|
|
||||||
argv_slice[0] = unsafe { allocate_cstr_on_stack(path, instance).0 };
|
// argv_slice[0] = unsafe { allocate_cstr_on_stack(path, instance).0 };
|
||||||
|
|
||||||
for (slot, arg) in argv_slice[1..argc].iter_mut().zip(args.iter()) {
|
// for (slot, arg) in argv_slice[1..argc].iter_mut().zip(args.iter()) {
|
||||||
*slot = unsafe { allocate_cstr_on_stack(&arg, instance).0 };
|
// *slot = unsafe { allocate_cstr_on_stack(&arg, instance).0 };
|
||||||
}
|
// }
|
||||||
|
|
||||||
argv_slice[argc] = 0;
|
// argv_slice[argc] = 0;
|
||||||
|
|
||||||
(argc as u32, argv_offset)
|
// (argc as u32, argv_offset)
|
||||||
}
|
// }
|
||||||
|
|
||||||
// fn get_module_arguments(options: &Run, instance: &mut webassembly::Instance) -> (u32, u32) {
|
// fn get_module_arguments(options: &Run, instance: &mut webassembly::Instance) -> (u32, u32) {
|
||||||
// // Application Arguments
|
// // Application Arguments
|
||||||
|
Reference in New Issue
Block a user