From 5bd521eb3caf2f0cb18cba8b24847e479254b76a Mon Sep 17 00:00:00 2001 From: Crypt Keeper <64215+codefromthecrypt@users.noreply.github.com> Date: Wed, 31 Aug 2022 10:22:15 +0800 Subject: [PATCH] Moves host function imports into their own directory (#784) Our root directory is getting crowded and it is also difficult to organize the "host imports" concept due to this. This moves common and language-specific imports into their own directory. This will break go import signatures on the next release, but is more sustainable overall. Signed-off-by: Adrian Cole --- .github/workflows/examples.yaml | 5 ++- Makefile | 34 ++++++--------- README.md | 6 ++- examples/README.md | 24 +++++++---- examples/allocation/tinygo/greet.go | 2 +- examples/allocation/zig/testdata/greet.wasm | Bin 39111 -> 44066 bytes experimental/fs_example_test.go | 2 +- experimental/listener_example_test.go | 2 +- .../logging/log_listener_example_test.go | 2 +- experimental/logging/log_listener_test.go | 2 +- imports/README.md | 40 ++++++++++++++++++ .../assemblyscript}/assemblyscript.go | 0 .../assemblyscript_example_test.go | 2 +- .../assemblyscript}/assemblyscript_test.go | 0 .../assemblyscript/example}/README.md | 0 .../assemblyscript/example}/assemblyscript.go | 2 +- .../example}/assemblyscript_test.go | 0 .../assemblyscript/example}/testdata/index.ts | 0 .../example}/testdata/index.wasm | Bin .../example}/testdata/package.json | 0 .../emscripten}/emscripten.go | 0 .../emscripten}/emscripten_example_test.go | 4 +- .../emscripten}/emscripten_test.go | 2 +- .../emscripten}/testdata/grow.cc | 0 .../emscripten}/testdata/grow.wasm | Bin imports/go/README.md | 28 ++++++++++++ .../gojs => imports/go/example}/.gitignore | 0 .../gojs => imports/go/example}/README.md | 0 .../gojs => imports/go/example}/stars.go | 2 +- .../gojs => imports/go/example}/stars/go.mod | 0 .../gojs => imports/go/example}/stars/main.go | 0 .../gojs => imports/go/example}/stars_test.go | 0 {experimental/gojs => imports/go}/gojs.go | 0 .../wasi_snapshot_preview1}/args.go | 0 .../wasi_snapshot_preview1}/args_test.go | 0 .../wasi_snapshot_preview1}/clock.go | 0 .../wasi_snapshot_preview1}/clock_test.go | 0 .../wasi_snapshot_preview1}/environ.go | 0 .../wasi_snapshot_preview1}/environ_test.go | 0 .../wasi_snapshot_preview1}/errno.go | 0 .../wasi_snapshot_preview1/example}/README.md | 0 .../wasi_snapshot_preview1/example}/cat.go | 2 +- .../example}/cat_test.go | 0 .../example}/testdata/cargo-wasi/.gitignore | 0 .../example}/testdata/cargo-wasi/Cargo.toml | 0 .../example}/testdata/cargo-wasi/cat.rs | 0 .../example}/testdata/cargo-wasi/cat.wasm | Bin .../example}/testdata/sub/test.txt | 0 .../example}/testdata/test.txt | 0 .../example}/testdata/tinygo/cat.go | 0 .../example}/testdata/tinygo/cat.wasm | Bin .../example}/testdata/zig-cc/cat.c | 0 .../example}/testdata/zig-cc/cat.wasm | Bin 37739 -> 37930 bytes .../wasi_snapshot_preview1}/example_test.go | 0 .../wasi_snapshot_preview1}/fs.go | 0 .../wasi_snapshot_preview1}/fs_test.go | 0 .../wasi_snapshot_preview1}/poll.go | 0 .../wasi_snapshot_preview1}/poll_test.go | 0 .../wasi_snapshot_preview1}/proc.go | 0 .../wasi_snapshot_preview1}/proc_test.go | 0 .../wasi_snapshot_preview1}/random.go | 0 .../wasi_snapshot_preview1}/random_test.go | 0 .../wasi_snapshot_preview1}/sched.go | 0 .../wasi_snapshot_preview1}/sched_test.go | 0 .../wasi_snapshot_preview1}/sock.go | 0 .../wasi_snapshot_preview1}/sock_test.go | 0 .../testdata/exit_on_start.wasm | Bin .../testdata/exit_on_start.wat | 0 .../testdata/wasi_arg.wasm | Bin .../testdata/wasi_arg.wat | 0 .../wasi_snapshot_preview1}/usage_test.go | 0 .../wasi_snapshot_preview1}/wasi.go | 0 .../wasi_bench_test.go | 0 .../wasi_snapshot_preview1}/wasi_test.go | 0 internal/gojs/compiler_test.go | 2 +- internal/gojs/http_test.go | 2 +- internal/integration_test/bench/bench_test.go | 2 +- internal/integration_test/bench/codec_test.go | 2 +- internal/integration_test/fs/fs_test.go | 2 +- internal/integration_test/vs/runtime.go | 2 +- site/content/languages/go.md | 2 +- site/content/languages/rust.md | 4 +- site/content/languages/tinygo.md | 4 +- 83 files changed, 127 insertions(+), 56 deletions(-) create mode 100644 imports/README.md rename {assemblyscript => imports/assemblyscript}/assemblyscript.go (100%) rename {assemblyscript => imports/assemblyscript}/assemblyscript_example_test.go (95%) rename {assemblyscript => imports/assemblyscript}/assemblyscript_test.go (100%) rename {examples/assemblyscript => imports/assemblyscript/example}/README.md (100%) rename {examples/assemblyscript => imports/assemblyscript/example}/assemblyscript.go (97%) rename {examples/assemblyscript => imports/assemblyscript/example}/assemblyscript_test.go (100%) rename {examples/assemblyscript => imports/assemblyscript/example}/testdata/index.ts (100%) rename {examples/assemblyscript => imports/assemblyscript/example}/testdata/index.wasm (100%) rename {examples/assemblyscript => imports/assemblyscript/example}/testdata/package.json (100%) rename {emscripten => imports/emscripten}/emscripten.go (100%) rename {emscripten => imports/emscripten}/emscripten_example_test.go (92%) rename {emscripten => imports/emscripten}/emscripten_test.go (95%) rename {emscripten => imports/emscripten}/testdata/grow.cc (100%) rename {emscripten => imports/emscripten}/testdata/grow.wasm (100%) create mode 100644 imports/go/README.md rename {examples/gojs => imports/go/example}/.gitignore (100%) rename {examples/gojs => imports/go/example}/README.md (100%) rename {examples/gojs => imports/go/example}/stars.go (98%) rename {examples/gojs => imports/go/example}/stars/go.mod (100%) rename {examples/gojs => imports/go/example}/stars/main.go (100%) rename {examples/gojs => imports/go/example}/stars_test.go (100%) rename {experimental/gojs => imports/go}/gojs.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/args.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/args_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/clock.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/clock_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/environ.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/environ_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/errno.go (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/README.md (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/cat.go (97%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/cat_test.go (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/testdata/cargo-wasi/.gitignore (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/testdata/cargo-wasi/Cargo.toml (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/testdata/cargo-wasi/cat.rs (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/testdata/cargo-wasi/cat.wasm (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/testdata/sub/test.txt (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/testdata/test.txt (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/testdata/tinygo/cat.go (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/testdata/tinygo/cat.wasm (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/testdata/zig-cc/cat.c (100%) rename {examples/wasi => imports/wasi_snapshot_preview1/example}/testdata/zig-cc/cat.wasm (61%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/example_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/fs.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/fs_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/poll.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/poll_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/proc.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/proc_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/random.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/random_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/sched.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/sched_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/sock.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/sock_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/testdata/exit_on_start.wasm (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/testdata/exit_on_start.wat (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/testdata/wasi_arg.wasm (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/testdata/wasi_arg.wat (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/usage_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/wasi.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/wasi_bench_test.go (100%) rename {wasi_snapshot_preview1 => imports/wasi_snapshot_preview1}/wasi_test.go (100%) diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index 5098391314..ac25d3db17 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -5,12 +5,14 @@ on: paths: - '.github/workflows/examples.yaml' - 'examples/**' + - 'imports/**/example/**' - 'Makefile' push: branches: [main] paths: - '.github/workflows/examples.yaml' - 'examples/**' + - 'imports/**/example/**' - 'Makefile' env: @@ -103,5 +105,4 @@ jobs: run: make build.bench - name: Run example tests - # Also runs emscripten as its source is outside the examples directory. - run: go test ./examples/... ./emscripten/... + run: make test.examples diff --git a/Makefile b/Makefile index bb9524be86..acc3f40476 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ hugo := github.com/gohugoio/hugo@v0.101.0 all_sources := $(wildcard *.go */*.go */*/*.go */*/*/*.go */*/*/*.go */*/*/*/*.go) all_testdata := $(wildcard testdata/* */testdata/* */*/testdata/* */*/testdata/*/* */*/*/testdata/*) all_testing := $(wildcard internal/testing/* internal/testing/*/* internal/testing/*/*/*) -all_examples := $(wildcard examples/* examples/*/* examples/*/*/*) +all_examples := $(wildcard examples/* examples/*/* examples/*/*/* */*/example/* */*/example/*/* */*/example/*/*/*) all_it := $(wildcard internal/integration_test/* internal/integration_test/*/* internal/integration_test/*/*/*) # main_sources exclude any test or example related code main_sources := $(wildcard $(filter-out %_test.go $(all_testdata) $(all_testing) $(all_examples) $(all_it), $(all_sources))) @@ -42,27 +42,19 @@ bench_testdata_dir := internal/integration_test/bench/testdata build.bench: @tinygo build -o $(bench_testdata_dir)/case.wasm -scheduler=none --no-debug -target=wasi $(bench_testdata_dir)/case.go +.PHONY: test.examples +test.examples: + @go test ./examples/... ./imports/assemblyscript/example/... ./imports/go/example/... ./imports/wasi_snapshot_preview1/example/... + .PHONY: build.examples.as build.examples.as: - @cd ./examples/assemblyscript/testdata && npm install && npm run build + @cd ./imports/assemblyscript/example/testdata && npm install && npm run build .PHONY: build.examples.zig -build.examples.zig: examples/allocation/zig/testdata/greet.wasm - -%.wasm: %.zig - @(cd $(@D); zig build) - @mv $(@D)/zig-out/lib/$(@F) $(@D) - -go_sources := examples/wasm_exec/testdata/cat.go -.PHONY: build.examples.go -build.examples.go: $(go_sources) - @for f in $^; do \ - cd $$(dirname $$f); \ - GOARCH=wasm GOOS=js go build -o $$(basename $$f | sed -e 's/\.go/\.wasm/') .; \ - cd -; \ - done +build.examples.zig: + @cd examples/allocation/zig/testdata/ && zig build -Drelease-small=true && mv zig-out/lib/greet.wasm . -tinygo_sources := $(filter-out $(go_sources), $(wildcard examples/*/testdata/*.go examples/*/*/testdata/*.go examples/*/testdata/*/*.go)) +tinygo_sources := examples/allocation/tinygo/testdata/greet.go imports/wasi_snapshot_preview1/example/testdata/tinygo/cat.go .PHONY: build.examples.tinygo build.examples.tinygo: $(tinygo_sources) @for f in $^; do \ @@ -70,11 +62,11 @@ build.examples.tinygo: $(tinygo_sources) done # We use zig to build C as it is easy to install and embeds a copy of zig-cc. -c_sources := $(wildcard examples/*/testdata/*.c examples/*/*/testdata/*.c examples/*/testdata/*/*.c) +c_sources := imports/wasi_snapshot_preview1/example/testdata/zig-cc/cat.c .PHONY: build.examples.zig-cc build.examples.zig-cc: $(c_sources) @for f in $^; do \ - zig cc --target=wasm32-wasi -O3 -o $$(echo $$f | sed -e 's/\.c/\.wasm/') $$f; \ + zig cc --target=wasm32-wasi -Oz -o $$(echo $$f | sed -e 's/\.c/\.wasm/') $$f; \ done # Here are the emcc args we use: @@ -90,7 +82,7 @@ build.examples.zig-cc: $(c_sources) # to one page (64KB). To do this, we have to reduce the stack size. # * `-s ALLOW_MEMORY_GROWTH` - allows "memory.grow" instructions to succeed, but # requires a function import "emscripten_notify_memory_growth". -emscripten_sources := $(wildcard emscripten/testdata/*.cc) +emscripten_sources := $(wildcard imports/emscripten/testdata/*.cc) .PHONY: build.examples.emscripten build.examples.emscripten: $(emscripten_sources) @for f in $^; do \ @@ -107,7 +99,7 @@ build.examples.emscripten: $(emscripten_sources) %/cat.wasm : cargo_target := wasm32-wasi .PHONY: build.examples.rust -build.examples.rust: examples/allocation/rust/testdata/greet.wasm examples/wasi/testdata/cargo-wasi/cat.wasm +build.examples.rust: examples/allocation/rust/testdata/greet.wasm imports/wasi_snapshot_preview1/example/testdata/cargo-wasi/cat.wasm # Builds rust using cargo normally, or cargo-wasi. %.wasm: %.rs diff --git a/README.md b/README.md index 3b7db38a67..013713abb2 100644 --- a/README.md +++ b/README.md @@ -66,8 +66,9 @@ func main() { Notes: -* The Wasm binary is often called the "guest" in WebAssembly. * The embedding application is often called the "host" in WebAssembly. +* The Wasm binary is often called the "guest" in WebAssembly. Sometimes they + need [imports][imports] to implement features such as console output. * Many languages compile to (target) Wasm including AssemblyScript, C, C++, Rust, TinyGo and Zig! @@ -83,7 +84,8 @@ it has no scope to specify how system resources like files are accessed. Instead, WebAssembly defines "host functions" and the signatures they can use. In wazero, "host functions" are written in Go, and let you do anything including access files. The main constraint is that WebAssembly only allows -numeric types. +numeric types. wazero includes [imports][imports] for common languages and +compiler toolchains. For example, you can grant WebAssembly code access to your console by exporting a function written in Go. The below function can be imported into standard diff --git a/examples/README.md b/examples/README.md index 23ea5ed8af..9721b87c50 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,13 +2,21 @@ The following example projects can help you practice WebAssembly with wazero: -* [allocation](allocation) - how to pass strings in and out of WebAssembly functions defined in Rust or TinyGo. -* [assemblyscript](assemblyscript) - how to configure special imports needed by AssemblyScript when not using WASI. +* [allocation](allocation) - how to pass strings in and out of WebAssembly + functions defined in Rust or TinyGo. +* [assemblyscript](../imports/assemblyscript/example) - how to configure + special imports needed by AssemblyScript when not using WASI. * [basic](basic) - how to use both WebAssembly and Go-defined functions. -* [import-go](import-go) - how to define, import and call a Go-defined function from a WebAssembly-defined function. -* [multiple-results](multiple-results) - how to return more than one result from WebAssembly or Go-defined functions. -* [namespace](namespace) - how WebAssembly modules can import their own host module, such as "env". -* [replace-import](replace-import) - how to override a module name hard-coded in a WebAssembly module. -* [wasi](wasi) - how to use I/O in your WebAssembly modules using WASI (WebAssembly System Interface). +* [import-go](import-go) - how to define, import and call a Go-defined function + from a WebAssembly-defined function. +* [multiple-results](multiple-results) - how to return more than one result + from WebAssembly or Go-defined functions. +* [namespace](namespace) - how WebAssembly modules can import their own host + module, such as "env". +* [replace-import](replace-import) - how to override a module name hard-coded + in a WebAssembly module. +* [wasi](../imports/wasi_snapshot_preview1/example) - how to use I/O in your + WebAssembly modules using WASI (WebAssembly System Interface). -Please [open an issue](https://github.com/tetratelabs/wazero/issues/new) if you would like to see another example. +Please [open an issue](https://github.com/tetratelabs/wazero/issues/new) if you +would like to see another example. diff --git a/examples/allocation/tinygo/greet.go b/examples/allocation/tinygo/greet.go index d3829616b2..fcedabc281 100644 --- a/examples/allocation/tinygo/greet.go +++ b/examples/allocation/tinygo/greet.go @@ -9,7 +9,7 @@ import ( "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/api" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" ) // greetWasm was compiled using `tinygo build -o greet.wasm -scheduler=none --no-debug -target=wasi greet.go` diff --git a/examples/allocation/zig/testdata/greet.wasm b/examples/allocation/zig/testdata/greet.wasm index 0f5ce483084115761f59491a93092d88f3589e47..2e12633ac43ad489393d941ab29db24439caed87 100755 GIT binary patch literal 44066 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 diff --git a/experimental/fs_example_test.go b/experimental/fs_example_test.go index d7d55b31cf..948b33b4b1 100644 --- a/experimental/fs_example_test.go +++ b/experimental/fs_example_test.go @@ -9,7 +9,7 @@ import ( "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/experimental" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" ) // fsWasm was generated by the following: diff --git a/experimental/listener_example_test.go b/experimental/listener_example_test.go index 5f0b9aa1b0..12e0a03ced 100644 --- a/experimental/listener_example_test.go +++ b/experimental/listener_example_test.go @@ -10,7 +10,7 @@ import ( "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/api" . "github.com/tetratelabs/wazero/experimental" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" ) // listenerWasm was generated by the following: diff --git a/experimental/logging/log_listener_example_test.go b/experimental/logging/log_listener_example_test.go index 4462c98546..fdcd27ca97 100644 --- a/experimental/logging/log_listener_example_test.go +++ b/experimental/logging/log_listener_example_test.go @@ -9,7 +9,7 @@ import ( "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/experimental" "github.com/tetratelabs/wazero/experimental/logging" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" ) // listenerWasm was generated by the following: diff --git a/experimental/logging/log_listener_test.go b/experimental/logging/log_listener_test.go index 531b756916..4db935879c 100644 --- a/experimental/logging/log_listener_test.go +++ b/experimental/logging/log_listener_test.go @@ -9,9 +9,9 @@ import ( "github.com/tetratelabs/wazero/api" "github.com/tetratelabs/wazero/experimental/logging" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" "github.com/tetratelabs/wazero/internal/testing/require" "github.com/tetratelabs/wazero/internal/wasm" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" ) // testCtx is an arbitrary, non-default context. Non-nil also prevents linter errors. diff --git a/imports/README.md b/imports/README.md new file mode 100644 index 0000000000..56cbdd747b --- /dev/null +++ b/imports/README.md @@ -0,0 +1,40 @@ +## wazero imports + +Packages in this directory implement the *host* imports needed for specific +languages or shared compiler toolchains. + +* [AssemblyScript](assemblyscript) Ex. `asc X.ts --debug -b none -o X.wasm` +* [Emscripten](emscripten) Ex. `em++ ... -s STANDALONE_WASM -o X.wasm X.cc` +* [Go](go) Ex. `GOARCH=wasm GOOS=js go build -o X.wasm X.go` +* [WASI](wasi_snapshot_preview1) Ex. `tinygo build -o X.wasm -target=wasi X.go` + +Note: You may not see a language listed here because it either works without +host imports, or it uses WASI. Refer to https://wazero.io/languages/ for more. + +Please [open an issue](https://github.com/tetratelabs/wazero/issues/new) if you +would like to see support for another compiled language or toolchain. + +## Overview + +WebAssembly has a virtual machine architecture where the *host* is the process +embedding wazero and the *guest* is a program compiled into the WebAssembly +Binary Format, also known as Wasm (`%.wasm`). + +The only features that work by default are computational in nature, and the +only way to communicate is via functions, memory or global variables. + +When a compiler targets Wasm, it often needs to import functions from the host +to satisfy system calls needed for functionality like printing to the console, +getting the time, or generating random values. The technical term for this +bridge is Application Binary Interface (ABI), but we'll call them simply host +imports. + +Packages in this directory are sometimes well re-used, such as the case in +[WASI](https://wazero.io/specs/#wasi). For example, Rust, TinyGo, and Zig can +all target WebAssembly in a way that imports the same "wasi_snapshot_preview1" +module in the compiled `%.wasm` file. To support any of these, wazero users can +invoke `wasi_snapshot_preview1.Instantiate` on their `wazero.Runtime`. + +Other times, host imports are either completely compiler-specific, such as the +case with `GOARCH=wasm GOOS=js`, or coexist alongside WASI, such as the case +with Emscripten. diff --git a/assemblyscript/assemblyscript.go b/imports/assemblyscript/assemblyscript.go similarity index 100% rename from assemblyscript/assemblyscript.go rename to imports/assemblyscript/assemblyscript.go diff --git a/assemblyscript/assemblyscript_example_test.go b/imports/assemblyscript/assemblyscript_example_test.go similarity index 95% rename from assemblyscript/assemblyscript_example_test.go rename to imports/assemblyscript/assemblyscript_example_test.go index 62f2c44a8d..0a7c695408 100644 --- a/assemblyscript/assemblyscript_example_test.go +++ b/imports/assemblyscript/assemblyscript_example_test.go @@ -6,7 +6,7 @@ import ( "log" "github.com/tetratelabs/wazero" - "github.com/tetratelabs/wazero/assemblyscript" + "github.com/tetratelabs/wazero/imports/assemblyscript" ) // This shows how to instantiate AssemblyScript's special imports. diff --git a/assemblyscript/assemblyscript_test.go b/imports/assemblyscript/assemblyscript_test.go similarity index 100% rename from assemblyscript/assemblyscript_test.go rename to imports/assemblyscript/assemblyscript_test.go diff --git a/examples/assemblyscript/README.md b/imports/assemblyscript/example/README.md similarity index 100% rename from examples/assemblyscript/README.md rename to imports/assemblyscript/example/README.md diff --git a/examples/assemblyscript/assemblyscript.go b/imports/assemblyscript/example/assemblyscript.go similarity index 97% rename from examples/assemblyscript/assemblyscript.go rename to imports/assemblyscript/example/assemblyscript.go index 87dac7225d..ee27c04962 100644 --- a/examples/assemblyscript/assemblyscript.go +++ b/imports/assemblyscript/example/assemblyscript.go @@ -9,7 +9,7 @@ import ( "strconv" "github.com/tetratelabs/wazero" - "github.com/tetratelabs/wazero/assemblyscript" + "github.com/tetratelabs/wazero/imports/assemblyscript" ) // asWasm compiled using `npm install && npm run build` diff --git a/examples/assemblyscript/assemblyscript_test.go b/imports/assemblyscript/example/assemblyscript_test.go similarity index 100% rename from examples/assemblyscript/assemblyscript_test.go rename to imports/assemblyscript/example/assemblyscript_test.go diff --git a/examples/assemblyscript/testdata/index.ts b/imports/assemblyscript/example/testdata/index.ts similarity index 100% rename from examples/assemblyscript/testdata/index.ts rename to imports/assemblyscript/example/testdata/index.ts diff --git a/examples/assemblyscript/testdata/index.wasm b/imports/assemblyscript/example/testdata/index.wasm similarity index 100% rename from examples/assemblyscript/testdata/index.wasm rename to imports/assemblyscript/example/testdata/index.wasm diff --git a/examples/assemblyscript/testdata/package.json b/imports/assemblyscript/example/testdata/package.json similarity index 100% rename from examples/assemblyscript/testdata/package.json rename to imports/assemblyscript/example/testdata/package.json diff --git a/emscripten/emscripten.go b/imports/emscripten/emscripten.go similarity index 100% rename from emscripten/emscripten.go rename to imports/emscripten/emscripten.go diff --git a/emscripten/emscripten_example_test.go b/imports/emscripten/emscripten_example_test.go similarity index 92% rename from emscripten/emscripten_example_test.go rename to imports/emscripten/emscripten_example_test.go index 8afe71efc5..0c52f2fac8 100644 --- a/emscripten/emscripten_example_test.go +++ b/imports/emscripten/emscripten_example_test.go @@ -6,8 +6,8 @@ import ( "log" "github.com/tetratelabs/wazero" - "github.com/tetratelabs/wazero/emscripten" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" + "github.com/tetratelabs/wazero/imports/emscripten" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" ) // This shows how to instantiate Emscripten function imports. diff --git a/emscripten/emscripten_test.go b/imports/emscripten/emscripten_test.go similarity index 95% rename from emscripten/emscripten_test.go rename to imports/emscripten/emscripten_test.go index 6efaf4734d..efb65617e1 100644 --- a/emscripten/emscripten_test.go +++ b/imports/emscripten/emscripten_test.go @@ -9,9 +9,9 @@ import ( "github.com/tetratelabs/wazero" . "github.com/tetratelabs/wazero/experimental" "github.com/tetratelabs/wazero/experimental/logging" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" "github.com/tetratelabs/wazero/internal/testing/require" "github.com/tetratelabs/wazero/sys" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" ) // growWasm was compiled from testdata/grow.cc diff --git a/emscripten/testdata/grow.cc b/imports/emscripten/testdata/grow.cc similarity index 100% rename from emscripten/testdata/grow.cc rename to imports/emscripten/testdata/grow.cc diff --git a/emscripten/testdata/grow.wasm b/imports/emscripten/testdata/grow.wasm similarity index 100% rename from emscripten/testdata/grow.wasm rename to imports/emscripten/testdata/grow.wasm diff --git a/imports/go/README.md b/imports/go/README.md new file mode 100644 index 0000000000..de025f9f4c --- /dev/null +++ b/imports/go/README.md @@ -0,0 +1,28 @@ +# Overview + +Wazero's "github.com/tetratelabs/wazero/imports/go" package allows you to run +a `%.wasm` file compiled by Go. See https://wazero.io/languages/go/ for more. + +## Usage + +When `GOOS=js` and `GOARCH=wasm`, Go's compiler targets WebAssembly 1.0 +Binary format (%.wasm). + +Ex. +```bash +GOOS=js GOARCH=wasm go build -o cat.wasm . +``` + +After compiling `cat.wasm` with wazero.Runtime's `CompileModule`, Run it. + +Under the scenes, the compiled Wasm calls host functions that support the +runtime.GOOS. This is similar to what is implemented in [wasm_exec.js][1]. + +## Experimental + +Go defines js "EXPERIMENTAL... exempt from the Go compatibility promise." +Accordingly, wazero cannot guarantee this will work from release to release, +or that usage will be relatively free of bugs. Due to this and the +relatively high implementation overhead, most will choose TinyGo instead. + +[1]: https://github.com/golang/go/blob/go1.19/misc/wasm/wasm_exec.js diff --git a/examples/gojs/.gitignore b/imports/go/example/.gitignore similarity index 100% rename from examples/gojs/.gitignore rename to imports/go/example/.gitignore diff --git a/examples/gojs/README.md b/imports/go/example/README.md similarity index 100% rename from examples/gojs/README.md rename to imports/go/example/README.md diff --git a/examples/gojs/stars.go b/imports/go/example/stars.go similarity index 98% rename from examples/gojs/stars.go rename to imports/go/example/stars.go index bc83285441..561576f892 100644 --- a/examples/gojs/stars.go +++ b/imports/go/example/stars.go @@ -13,7 +13,7 @@ import ( "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/experimental" - "github.com/tetratelabs/wazero/experimental/gojs" + gojs "github.com/tetratelabs/wazero/imports/go" "github.com/tetratelabs/wazero/sys" ) diff --git a/examples/gojs/stars/go.mod b/imports/go/example/stars/go.mod similarity index 100% rename from examples/gojs/stars/go.mod rename to imports/go/example/stars/go.mod diff --git a/examples/gojs/stars/main.go b/imports/go/example/stars/main.go similarity index 100% rename from examples/gojs/stars/main.go rename to imports/go/example/stars/main.go diff --git a/examples/gojs/stars_test.go b/imports/go/example/stars_test.go similarity index 100% rename from examples/gojs/stars_test.go rename to imports/go/example/stars_test.go diff --git a/experimental/gojs/gojs.go b/imports/go/gojs.go similarity index 100% rename from experimental/gojs/gojs.go rename to imports/go/gojs.go diff --git a/wasi_snapshot_preview1/args.go b/imports/wasi_snapshot_preview1/args.go similarity index 100% rename from wasi_snapshot_preview1/args.go rename to imports/wasi_snapshot_preview1/args.go diff --git a/wasi_snapshot_preview1/args_test.go b/imports/wasi_snapshot_preview1/args_test.go similarity index 100% rename from wasi_snapshot_preview1/args_test.go rename to imports/wasi_snapshot_preview1/args_test.go diff --git a/wasi_snapshot_preview1/clock.go b/imports/wasi_snapshot_preview1/clock.go similarity index 100% rename from wasi_snapshot_preview1/clock.go rename to imports/wasi_snapshot_preview1/clock.go diff --git a/wasi_snapshot_preview1/clock_test.go b/imports/wasi_snapshot_preview1/clock_test.go similarity index 100% rename from wasi_snapshot_preview1/clock_test.go rename to imports/wasi_snapshot_preview1/clock_test.go diff --git a/wasi_snapshot_preview1/environ.go b/imports/wasi_snapshot_preview1/environ.go similarity index 100% rename from wasi_snapshot_preview1/environ.go rename to imports/wasi_snapshot_preview1/environ.go diff --git a/wasi_snapshot_preview1/environ_test.go b/imports/wasi_snapshot_preview1/environ_test.go similarity index 100% rename from wasi_snapshot_preview1/environ_test.go rename to imports/wasi_snapshot_preview1/environ_test.go diff --git a/wasi_snapshot_preview1/errno.go b/imports/wasi_snapshot_preview1/errno.go similarity index 100% rename from wasi_snapshot_preview1/errno.go rename to imports/wasi_snapshot_preview1/errno.go diff --git a/examples/wasi/README.md b/imports/wasi_snapshot_preview1/example/README.md similarity index 100% rename from examples/wasi/README.md rename to imports/wasi_snapshot_preview1/example/README.md diff --git a/examples/wasi/cat.go b/imports/wasi_snapshot_preview1/example/cat.go similarity index 97% rename from examples/wasi/cat.go rename to imports/wasi_snapshot_preview1/example/cat.go index d4ba95c597..bf8513fe7a 100644 --- a/examples/wasi/cat.go +++ b/imports/wasi_snapshot_preview1/example/cat.go @@ -9,8 +9,8 @@ import ( "os" "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" "github.com/tetratelabs/wazero/sys" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" ) // catFS is an embedded filesystem limited to test.txt diff --git a/examples/wasi/cat_test.go b/imports/wasi_snapshot_preview1/example/cat_test.go similarity index 100% rename from examples/wasi/cat_test.go rename to imports/wasi_snapshot_preview1/example/cat_test.go diff --git a/examples/wasi/testdata/cargo-wasi/.gitignore b/imports/wasi_snapshot_preview1/example/testdata/cargo-wasi/.gitignore similarity index 100% rename from examples/wasi/testdata/cargo-wasi/.gitignore rename to imports/wasi_snapshot_preview1/example/testdata/cargo-wasi/.gitignore diff --git a/examples/wasi/testdata/cargo-wasi/Cargo.toml b/imports/wasi_snapshot_preview1/example/testdata/cargo-wasi/Cargo.toml similarity index 100% rename from examples/wasi/testdata/cargo-wasi/Cargo.toml rename to imports/wasi_snapshot_preview1/example/testdata/cargo-wasi/Cargo.toml diff --git a/examples/wasi/testdata/cargo-wasi/cat.rs b/imports/wasi_snapshot_preview1/example/testdata/cargo-wasi/cat.rs similarity index 100% rename from examples/wasi/testdata/cargo-wasi/cat.rs rename to imports/wasi_snapshot_preview1/example/testdata/cargo-wasi/cat.rs diff --git a/examples/wasi/testdata/cargo-wasi/cat.wasm b/imports/wasi_snapshot_preview1/example/testdata/cargo-wasi/cat.wasm similarity index 100% rename from examples/wasi/testdata/cargo-wasi/cat.wasm rename to imports/wasi_snapshot_preview1/example/testdata/cargo-wasi/cat.wasm diff --git a/examples/wasi/testdata/sub/test.txt b/imports/wasi_snapshot_preview1/example/testdata/sub/test.txt similarity index 100% rename from examples/wasi/testdata/sub/test.txt rename to imports/wasi_snapshot_preview1/example/testdata/sub/test.txt diff --git a/examples/wasi/testdata/test.txt b/imports/wasi_snapshot_preview1/example/testdata/test.txt similarity index 100% rename from examples/wasi/testdata/test.txt rename to imports/wasi_snapshot_preview1/example/testdata/test.txt diff --git a/examples/wasi/testdata/tinygo/cat.go b/imports/wasi_snapshot_preview1/example/testdata/tinygo/cat.go similarity index 100% rename from examples/wasi/testdata/tinygo/cat.go rename to imports/wasi_snapshot_preview1/example/testdata/tinygo/cat.go diff --git a/examples/wasi/testdata/tinygo/cat.wasm b/imports/wasi_snapshot_preview1/example/testdata/tinygo/cat.wasm similarity index 100% rename from examples/wasi/testdata/tinygo/cat.wasm rename to imports/wasi_snapshot_preview1/example/testdata/tinygo/cat.wasm diff --git a/examples/wasi/testdata/zig-cc/cat.c b/imports/wasi_snapshot_preview1/example/testdata/zig-cc/cat.c similarity index 100% rename from examples/wasi/testdata/zig-cc/cat.c rename to imports/wasi_snapshot_preview1/example/testdata/zig-cc/cat.c diff --git a/examples/wasi/testdata/zig-cc/cat.wasm b/imports/wasi_snapshot_preview1/example/testdata/zig-cc/cat.wasm similarity index 61% rename from examples/wasi/testdata/zig-cc/cat.wasm rename to imports/wasi_snapshot_preview1/example/testdata/zig-cc/cat.wasm index 3bdbcd3bdc49a2604b666fe314a2446ad363137e..b42eeeabaedcc732da6315497e3aea6066abaf6b 100755 GIT binary patch delta 4184 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 By3YUr delta 3900 zcmaJ@U2qfE72dnMmR4FxUjKn(0lB*vupt2h8R+DvSjrd-X;Yw-v=5n$EU#?Ik}XSe zu|a4J7F4A)KrT%QNr8}rq$JKHqqgaEk{SA!rVq*VA^n+YCVwxnH=q@JR6ytBjctn_fk)NYkA?VA@T<)MK$W9zA36rMQ=z&>WfPI z!_P*>Q0|7Bc>Op{vxHi6$xG%x|O}Ari;K3ibCbZ7*zPvg_9d_ zq97i1iYhfHYTb$dCMVc&A3A)zQS+g4AHAlcQ&){DC#e#>r&5k0CjL>&riy?e*0|V2 zey~9p9x9(OWdz`*`iSL6X0hh3z8aLGlBq_CsRRgj(<4HQNYp>F7zyOG7P8+s3qQzI zx57>|tl6UCS(kYC!7&^XxflF$)cuBVgfNa;Jge$aO4vIMyU7{07MF%ti~I)J{hm9C zhke(x`?h)Zh{h92#q+?GREtjKk5j2;6cEFBTY5xNnu-T9tCZG~>8t~G&&dg@K! zsZ%#DQqus%4%88n672JR;Hme45^X$b@tl7)*EnOzs7G3{)RJZ3VW?ZNf{^f(LrF?S zWSpL~nlKOerkOS!n8jLKu+U0Y3k^~gx+YAAM&4kXD`l&7!2sn7od-`tD>Oun1GC^O z7vW7t=kXS_LM5vW92)F=E^UROxIL}RgM+Y@H$Q%t;bhTTUPPPf)Sse(6bi~s)ryS| ztdi9Zo)An`+KxC;|AH0q9hfb`0xB3Z(H1B@{85VBG{}_-l$JtWJR8o-R1txqd}*az zUk|Lln+e4bNTGzXQ?Ukl=x?(JtylkV8=|E zPjb8_kO^r&vcQLz__zme+U*O^@~f>~LzK)!B_8Jz^AqL0c)L-xXpx$g7by!6_E}(A z3#rXW?~)nGu7y6TUTW+n7{zZGF9HuWJ)wzr8zr;sSd+=_ZoWv)vOhPU2c}y(x(tc( z(SlMk7($fv&k1x`7(c3>ZrK$gm)YB97w}VaD14clN8FvbQ;B*~rYE54c*A%`jLTKm zN_CJ+?324U0&ls8lB?A_@A;Zao?@pW9|AMceLJu4^Hep&Z{&B9@dOu0c=gPSUayNH zU%cdJo>K3X$qTHZ?@z#Y`p%MPs+pY@@jWBhVZbiz8X}h-=|7A}j`Y*!t6b5cqq7>Q z8c_I=RTM?(Ymg!jHfSs#6s&zWJh3jOVK#?Ee)Z*Q-w-2+O#c8>ov}_Q65A zdX}G&d#Tzb8y3MENQF0)m=fWm6&Gd9vd#xgSnm`#Ebx@T7dTemdf=Y~KfnG~r%HZY z{rJI83AxJNORQj*2Yuu^3p}(Qez!jqgM0Q^?B35S*~WoOkiI#v1{UYyFlVdc?ZEBv zt&oqz7v-nBCo$VXk{6BtI1$ld& zMZ(*J#oL2FLl(d1bhMx6G<~!+BJJW77B%_TIL}^l?gGib9Ue|3%fsB0=m0v2Uf{LF zmxPN&ZO_me@;o~@v>U`%h6c$atYLUx>tmeWYTYLDIq;I2qOHacS!&oM=h*4t^)Py6 zcrAIn`tGo$l8aT6c~l1Ng|XwnaCVVAo#h!ik>wd$D))~+3CRoNTcCY!d?PTFdm55z z&cynUxvk_y=F9&AlHcT4L-KKc6R^Fo4%l1R0ByP;mfvBK4fm=;X}Y{hu=u#lOw&jf(=DV9%o-E7Vzx9EY4^0 zi;8ABT`5Xp!%?1sx+xO$($N*bH;=A|{Jq5gp;$qwpcp7|in=Kp;iFPTCO=@=W2d3` z^q2)cdVDPuyN+*>NoVzN`Mj@nwL1$oM$WA9moruug z1tf(0ClusAgzxa*nT%z!X(zwwP%NKhzkhfo$+3?g?h4*4-*)E9`pcR+8p}B3xVE+G zo;e`9KHHAvhtq}RRs+j)emI9^lV;obiGf05Ycp1vi8NL%Sj98hLSjp+-?k@4$8v*M zw*_t6nJhS?gM$fdm+7{hNRPz|`D7un96GU?80Fh`@F$X!g+xAiOF%3kclox%3zBgh z4`VUvV6mdX?wd>&RvNa=AIZ+<#^UgkEUeN7)0tR0Jr=)J%@5>8sG7(*j@fA2W4Yu| zax|8wDIgzw>MwNji#N^_57I*<&p(wa)SqvOlH%!={1jb xd@SeO?gfV(%MEQ*va!KUNJw5djHk!)P7k&nwY{L&%mWhYyyJ{)VYBS$e*t(3W{m&< diff --git a/wasi_snapshot_preview1/example_test.go b/imports/wasi_snapshot_preview1/example_test.go similarity index 100% rename from wasi_snapshot_preview1/example_test.go rename to imports/wasi_snapshot_preview1/example_test.go diff --git a/wasi_snapshot_preview1/fs.go b/imports/wasi_snapshot_preview1/fs.go similarity index 100% rename from wasi_snapshot_preview1/fs.go rename to imports/wasi_snapshot_preview1/fs.go diff --git a/wasi_snapshot_preview1/fs_test.go b/imports/wasi_snapshot_preview1/fs_test.go similarity index 100% rename from wasi_snapshot_preview1/fs_test.go rename to imports/wasi_snapshot_preview1/fs_test.go diff --git a/wasi_snapshot_preview1/poll.go b/imports/wasi_snapshot_preview1/poll.go similarity index 100% rename from wasi_snapshot_preview1/poll.go rename to imports/wasi_snapshot_preview1/poll.go diff --git a/wasi_snapshot_preview1/poll_test.go b/imports/wasi_snapshot_preview1/poll_test.go similarity index 100% rename from wasi_snapshot_preview1/poll_test.go rename to imports/wasi_snapshot_preview1/poll_test.go diff --git a/wasi_snapshot_preview1/proc.go b/imports/wasi_snapshot_preview1/proc.go similarity index 100% rename from wasi_snapshot_preview1/proc.go rename to imports/wasi_snapshot_preview1/proc.go diff --git a/wasi_snapshot_preview1/proc_test.go b/imports/wasi_snapshot_preview1/proc_test.go similarity index 100% rename from wasi_snapshot_preview1/proc_test.go rename to imports/wasi_snapshot_preview1/proc_test.go diff --git a/wasi_snapshot_preview1/random.go b/imports/wasi_snapshot_preview1/random.go similarity index 100% rename from wasi_snapshot_preview1/random.go rename to imports/wasi_snapshot_preview1/random.go diff --git a/wasi_snapshot_preview1/random_test.go b/imports/wasi_snapshot_preview1/random_test.go similarity index 100% rename from wasi_snapshot_preview1/random_test.go rename to imports/wasi_snapshot_preview1/random_test.go diff --git a/wasi_snapshot_preview1/sched.go b/imports/wasi_snapshot_preview1/sched.go similarity index 100% rename from wasi_snapshot_preview1/sched.go rename to imports/wasi_snapshot_preview1/sched.go diff --git a/wasi_snapshot_preview1/sched_test.go b/imports/wasi_snapshot_preview1/sched_test.go similarity index 100% rename from wasi_snapshot_preview1/sched_test.go rename to imports/wasi_snapshot_preview1/sched_test.go diff --git a/wasi_snapshot_preview1/sock.go b/imports/wasi_snapshot_preview1/sock.go similarity index 100% rename from wasi_snapshot_preview1/sock.go rename to imports/wasi_snapshot_preview1/sock.go diff --git a/wasi_snapshot_preview1/sock_test.go b/imports/wasi_snapshot_preview1/sock_test.go similarity index 100% rename from wasi_snapshot_preview1/sock_test.go rename to imports/wasi_snapshot_preview1/sock_test.go diff --git a/wasi_snapshot_preview1/testdata/exit_on_start.wasm b/imports/wasi_snapshot_preview1/testdata/exit_on_start.wasm similarity index 100% rename from wasi_snapshot_preview1/testdata/exit_on_start.wasm rename to imports/wasi_snapshot_preview1/testdata/exit_on_start.wasm diff --git a/wasi_snapshot_preview1/testdata/exit_on_start.wat b/imports/wasi_snapshot_preview1/testdata/exit_on_start.wat similarity index 100% rename from wasi_snapshot_preview1/testdata/exit_on_start.wat rename to imports/wasi_snapshot_preview1/testdata/exit_on_start.wat diff --git a/wasi_snapshot_preview1/testdata/wasi_arg.wasm b/imports/wasi_snapshot_preview1/testdata/wasi_arg.wasm similarity index 100% rename from wasi_snapshot_preview1/testdata/wasi_arg.wasm rename to imports/wasi_snapshot_preview1/testdata/wasi_arg.wasm diff --git a/wasi_snapshot_preview1/testdata/wasi_arg.wat b/imports/wasi_snapshot_preview1/testdata/wasi_arg.wat similarity index 100% rename from wasi_snapshot_preview1/testdata/wasi_arg.wat rename to imports/wasi_snapshot_preview1/testdata/wasi_arg.wat diff --git a/wasi_snapshot_preview1/usage_test.go b/imports/wasi_snapshot_preview1/usage_test.go similarity index 100% rename from wasi_snapshot_preview1/usage_test.go rename to imports/wasi_snapshot_preview1/usage_test.go diff --git a/wasi_snapshot_preview1/wasi.go b/imports/wasi_snapshot_preview1/wasi.go similarity index 100% rename from wasi_snapshot_preview1/wasi.go rename to imports/wasi_snapshot_preview1/wasi.go diff --git a/wasi_snapshot_preview1/wasi_bench_test.go b/imports/wasi_snapshot_preview1/wasi_bench_test.go similarity index 100% rename from wasi_snapshot_preview1/wasi_bench_test.go rename to imports/wasi_snapshot_preview1/wasi_bench_test.go diff --git a/wasi_snapshot_preview1/wasi_test.go b/imports/wasi_snapshot_preview1/wasi_test.go similarity index 100% rename from wasi_snapshot_preview1/wasi_test.go rename to imports/wasi_snapshot_preview1/wasi_test.go diff --git a/internal/gojs/compiler_test.go b/internal/gojs/compiler_test.go index 69a58ba2f5..6858fcf193 100644 --- a/internal/gojs/compiler_test.go +++ b/internal/gojs/compiler_test.go @@ -18,7 +18,7 @@ import ( "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/experimental" - "github.com/tetratelabs/wazero/experimental/gojs" + gojs "github.com/tetratelabs/wazero/imports/go" ) func compileAndRun(ctx context.Context, arg string, config wazero.ModuleConfig) (stdout, stderr string, err error) { diff --git a/internal/gojs/http_test.go b/internal/gojs/http_test.go index 86bd29991a..178eb451bf 100644 --- a/internal/gojs/http_test.go +++ b/internal/gojs/http_test.go @@ -8,7 +8,7 @@ import ( "testing" "github.com/tetratelabs/wazero" - "github.com/tetratelabs/wazero/experimental/gojs" + gojs "github.com/tetratelabs/wazero/imports/go" "github.com/tetratelabs/wazero/internal/testing/require" ) diff --git a/internal/integration_test/bench/bench_test.go b/internal/integration_test/bench/bench_test.go index 9a7c29e120..f08cc8e48e 100644 --- a/internal/integration_test/bench/bench_test.go +++ b/internal/integration_test/bench/bench_test.go @@ -11,8 +11,8 @@ import ( "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/api" "github.com/tetratelabs/wazero/experimental" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" "github.com/tetratelabs/wazero/internal/platform" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" ) // testCtx is an arbitrary, non-default context. Non-nil also prevents linter errors. diff --git a/internal/integration_test/bench/codec_test.go b/internal/integration_test/bench/codec_test.go index 656d29a55c..a186b52c3f 100644 --- a/internal/integration_test/bench/codec_test.go +++ b/internal/integration_test/bench/codec_test.go @@ -4,10 +4,10 @@ import ( "testing" "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" "github.com/tetratelabs/wazero/internal/testing/require" "github.com/tetratelabs/wazero/internal/wasm" "github.com/tetratelabs/wazero/internal/wasm/binary" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" ) // example holds the latest supported features as described in the comments of exampleText diff --git a/internal/integration_test/fs/fs_test.go b/internal/integration_test/fs/fs_test.go index 18d6b205cc..ca0a349efb 100644 --- a/internal/integration_test/fs/fs_test.go +++ b/internal/integration_test/fs/fs_test.go @@ -12,8 +12,8 @@ import ( "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" "github.com/tetratelabs/wazero/internal/testing/require" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" ) var testCtx = context.Background() diff --git a/internal/integration_test/vs/runtime.go b/internal/integration_test/vs/runtime.go index c200c75f7e..c18f8fbddd 100644 --- a/internal/integration_test/vs/runtime.go +++ b/internal/integration_test/vs/runtime.go @@ -7,8 +7,8 @@ import ( "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" "github.com/tetratelabs/wazero/internal/wasm" - "github.com/tetratelabs/wazero/wasi_snapshot_preview1" ) type RuntimeConfig struct { diff --git a/site/content/languages/go.md b/site/content/languages/go.md index a10688a1fb..505d96e5a5 100644 --- a/site/content/languages/go.md +++ b/site/content/languages/go.md @@ -242,4 +242,4 @@ the Go stack. [11]: https://github.com/WebAssembly/proposals [12]: https://github.com/golang/go/blob/go1.19/src/cmd/link/internal/ld/data.go#L2457 [13]: https://github.com/golang/go/blob/go1.19/src/syscall/tables_js.go#L371-L494 -[14]: https://github.com/tetratelabs/wazero/tree/main/examples/gojs +[14]: https://github.com/tetratelabs/wazero/tree/main/imports/go/example diff --git a/site/content/languages/rust.md b/site/content/languages/rust.md index 79d779a6f6..2bafcb2642 100644 --- a/site/content/languages/rust.md +++ b/site/content/languages/rust.md @@ -222,8 +222,8 @@ source code may reduce binary size further. [7]: https://github.com/tetratelabs/wazero/stargazers [8]: https://rustwasm.github.io/docs/book/reference/which-crates-work-with-wasm.html [9]: https://github.com/tetratelabs/wazero/tree/main/examples/allocation/rust -[10]: https://github.com/tetratelabs/wazero/tree/main/examples/wasi -[11]: https://github.com/tetratelabs/wazero/tree/main/examples/wasi/testdata/cargo-wasi +[10]: https://github.com/tetratelabs/wazero/tree/main/imports/wasi_snapshot_preview1/example +[11]: https://github.com/tetratelabs/wazero/tree/main/imports/wasi_snapshot_preview1/example/testdata/cargo-wasi [12]: https://github.com/rustwasm/wee_alloc [13]: https://doc.rust-lang.org/cargo/reference/profiles.html#profile-settings [14]: https://github.com/bytecodealliance/cargo-wasi diff --git a/site/content/languages/tinygo.md b/site/content/languages/tinygo.md index 458df810ba..b65ee9101b 100644 --- a/site/content/languages/tinygo.md +++ b/site/content/languages/tinygo.md @@ -378,8 +378,8 @@ functions, such as `fmt.Println`, which can require 100KB of wasm. [18]: https://github.com/tinygo-org/tinygo/issues/447 [19]: https://github.com/tinygo-org/tinygo/issues/3068 [20]: https://github.com/tinygo-org/tinygo/blob/v0.25.0/src/runtime/arch_tinygowasm.go#L47-L62 -[21]: https://github.com/tetratelabs/wazero/tree/main/examples/wasi -[22]: https://github.com/tetratelabs/wazero/tree/main/examples/wasi/testdata/tinygo +[21]: https://github.com/tetratelabs/wazero/tree/main/imports/wasi_snapshot_preview1/example +[22]: https://github.com/tetratelabs/wazero/tree/main/imports/wasi_snapshot_preview1/example/testdata/tinygo [23]: https://github.com/WebAssembly/binaryen/blob/main/src/passes/Asyncify.cpp [24]: http://tleyden.github.io/blog/2014/10/30/goroutines-vs-threads/ [25]: https://github.com/tinygo-org/tinygo/issues/3095