diff options
author | Ayke van Laethem <[email protected]> | 2021-04-14 23:10:42 +0200 |
---|---|---|
committer | Ron Evans <[email protected]> | 2021-04-15 08:45:08 +0200 |
commit | 6dd5666ed1299b6e24749678f5ee2cf0c4a10de5 (patch) | |
tree | 12b8d5adc39b446e18109bb59494ea58e944f74f | |
parent | f145663464f7917f99e1aa4214ce8f3b854f2b35 (diff) | |
download | tinygo-6dd5666ed1299b6e24749678f5ee2cf0c4a10de5.tar.gz tinygo-6dd5666ed1299b6e24749678f5ee2cf0c4a10de5.zip |
wasm: use WASI ABI for exit function
This improves compatibility between the regular browser target
(-target=wasm) and the WASI target (-target=wasi). Specifically, it
allows running WASI tests like this:
tinygo test -target=wasi encoding/base32
-rw-r--r-- | src/runtime/runtime_wasm.go | 11 | ||||
-rw-r--r-- | targets/wasm_exec.js | 20 | ||||
-rw-r--r-- | testdata/stdlib.go | 3 |
3 files changed, 23 insertions, 11 deletions
diff --git a/src/runtime/runtime_wasm.go b/src/runtime/runtime_wasm.go index f2acf9768..1146f5781 100644 --- a/src/runtime/runtime_wasm.go +++ b/src/runtime/runtime_wasm.go @@ -16,6 +16,12 @@ type __wasi_iovec_t struct { //export fd_write func fd_write(id uint32, iovs *__wasi_iovec_t, iovs_len uint, nwritten *uint) (errno uint) +// See: +// https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#-proc_exitrval-exitcode +//go:wasm-module wasi_snapshot_preview1 +//export proc_exit +func proc_exit(exitcode uint32) + func postinit() {} const ( @@ -49,6 +55,11 @@ func abort() { trap() } +//go:linkname syscall_Exit syscall.Exit +func syscall_Exit(code int) { + proc_exit(uint32(code)) +} + // TinyGo does not yet support any form of parallelism on WebAssembly, so these // can be left empty. diff --git a/targets/wasm_exec.js b/targets/wasm_exec.js index 96ff7cfce..21bfcda18 100644 --- a/targets/wasm_exec.js +++ b/targets/wasm_exec.js @@ -276,6 +276,15 @@ mem().setUint32(nwritten_ptr, nwritten, true); return 0; }, + "proc_exit": (code) => { + if (global.process) { + // Node.js + process.exit(code); + } else { + // Can't exit in a browser. + throw 'trying to exit with code ' + code; + } + }, }, env: { // func ticks() float64 @@ -289,17 +298,6 @@ setTimeout(this._inst.exports.go_scheduler, timeout); }, - // func Exit(code int) - "syscall.Exit": (code) => { - if (global.process) { - // Node.js - process.exit(code); - } else { - // Can't exit in a browser. - throw 'trying to exit with code ' + code; - } - }, - // func finalizeRef(v ref) "syscall/js.finalizeRef": (sp) => { // Note: TinyGo does not support finalizers so this should never be diff --git a/testdata/stdlib.go b/testdata/stdlib.go index b380e8039..e6d6677b6 100644 --- a/testdata/stdlib.go +++ b/testdata/stdlib.go @@ -19,4 +19,7 @@ func main() { // package strings fmt.Println("strings.IndexByte:", strings.IndexByte("asdf", 'd')) fmt.Println("strings.Replace:", strings.Replace("An example string", " ", "-", -1)) + + // Exit the program normally. + os.Exit(0) } |