mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-06 03:53:42 +00:00
ceb7891986
Instead of hanging forever, it should return the exit code from os.Exit.
84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
//go:build wasip2
|
|
|
|
package runtime
|
|
|
|
import (
|
|
"internal/cm"
|
|
|
|
exit "internal/wasi/cli/v0.2.0/exit"
|
|
stdout "internal/wasi/cli/v0.2.0/stdout"
|
|
monotonicclock "internal/wasi/clocks/v0.2.0/monotonic-clock"
|
|
wallclock "internal/wasi/clocks/v0.2.0/wall-clock"
|
|
random "internal/wasi/random/v0.2.0/random"
|
|
)
|
|
|
|
const putcharBufferSize = 120
|
|
|
|
// Using global variables to avoid heap allocation.
|
|
var (
|
|
putcharStdout = stdout.GetStdout()
|
|
putcharBuffer = [putcharBufferSize]byte{}
|
|
putcharPosition uint = 0
|
|
)
|
|
|
|
func putchar(c byte) {
|
|
putcharBuffer[putcharPosition] = c
|
|
putcharPosition++
|
|
if c == '\n' || putcharPosition >= putcharBufferSize {
|
|
list := cm.NewList(&putcharBuffer[0], putcharPosition)
|
|
putcharStdout.BlockingWriteAndFlush(list) // error return ignored; can't do anything anyways
|
|
putcharPosition = 0
|
|
}
|
|
}
|
|
|
|
func getchar() byte {
|
|
// dummy, TODO
|
|
return 0
|
|
}
|
|
|
|
func buffered() int {
|
|
// dummy, TODO
|
|
return 0
|
|
}
|
|
|
|
//go:linkname now time.now
|
|
func now() (sec int64, nsec int32, mono int64) {
|
|
now := wallclock.Now()
|
|
sec = int64(now.Seconds)
|
|
nsec = int32(now.Nanoseconds)
|
|
mono = int64(monotonicclock.Now())
|
|
return
|
|
}
|
|
|
|
// Abort executes the wasm 'unreachable' instruction.
|
|
func abort() {
|
|
trap()
|
|
}
|
|
|
|
//go:linkname syscall_Exit syscall.Exit
|
|
func syscall_Exit(code int) {
|
|
exit.Exit(code != 0)
|
|
}
|
|
|
|
func mainReturnExit() {
|
|
// WASIp2 does not use _start, instead it uses _initialize and a custom
|
|
// WASIp2-specific main function. So this should never be called in
|
|
// practice.
|
|
runtimePanic("unreachable: _start was called")
|
|
}
|
|
|
|
// TinyGo does not yet support any form of parallelism on WebAssembly, so these
|
|
// can be left empty.
|
|
|
|
//go:linkname procPin sync/atomic.runtime_procPin
|
|
func procPin() {
|
|
}
|
|
|
|
//go:linkname procUnpin sync/atomic.runtime_procUnpin
|
|
func procUnpin() {
|
|
}
|
|
|
|
func hardwareRand() (n uint64, ok bool) {
|
|
return random.GetRandomU64(), true
|
|
}
|