aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAyke van Laethem <[email protected]>2021-04-14 23:10:42 +0200
committerRon Evans <[email protected]>2021-04-15 08:45:08 +0200
commit6dd5666ed1299b6e24749678f5ee2cf0c4a10de5 (patch)
tree12b8d5adc39b446e18109bb59494ea58e944f74f
parentf145663464f7917f99e1aa4214ce8f3b854f2b35 (diff)
downloadtinygo-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.go11
-rw-r--r--targets/wasm_exec.js20
-rw-r--r--testdata/stdlib.go3
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)
}